{"_id":"@flexdash/node-red-flexdash","_rev":"206-16727e27cc433ef279fb941113ffb103","name":"@flexdash/node-red-flexdash","dist-tags":{"latest":"0.4.154","dev":"0.4.154"},"versions":{"0.2.0":{"name":"@flexdash/node-red-flexdash","version":"0.2.0","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"socket.io":">=4.1.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.0","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js"}},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"4eb218f5a5c3e0ad75c0aba7041280d4f4af1d41","_id":"@flexdash/node-red-flexdash@0.2.0","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-knM8piihWEasGp3vP2wVdisy67AGUUuWv6Xp6L27yqqv1glhWOMwqyTnoosNnui9pTEfZb2df2G12xKHnPyrKQ==","shasum":"f8961d2ed05406d8aadbd87622c086dadc6592f3","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.0.tgz","fileCount":11,"unpackedSize":48501,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIs4YACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmohtA/9FC2OvLiPDDJJw9uZSOkrjMy9m+4APgZbT6C85ZO+LAmO7erZ\r\nFK3tQ5blzFVQjEdO3pROBp6aTc/GabTZK1BLltINWa4lHFDIC9I8LgC8BQQi\r\ndtq9gZdZOrPr3qDv/UhjmV8S5z/h5XkId3KOjPksoIS5EaTw2i8OA6UrjFGk\r\nBdSZRg0A8K9R+QkpFcNkFO9N0WE60MGZTDjCCQBzO0sSO7Mu9OfgEhWLfI/u\r\n7EKgsdn0X9IhU2NpCMYLmud7v74hoftq+rWTYljTaFTGNy5ho0rwrdmJ+nAb\r\nmFs8esJ/WRLcHdohAK86xL2N9OBRYrdrTAtQe0Ml1HbgIvRhW5Gdi18Ayutm\r\nReJe6dxwM4NW8+EgIponjZ3TBa7pA47sftPFyR5cqN5FPfABeBqnE1yFgHQO\r\n0mL5ipX5FtkRb7q2cz3nFzmlrZG8BhO59TCmYjfHFUtG3ldVUlinRJaTgU9O\r\nO6N84qK+uHsE/+UKbukrDENG6diTHAM0gle409PMN6zhWL2lzL/r3GPGgzY1\r\n8W0+iqd25ntkWNYpoK6S0YR4KkSdFDSXObIv35mKf1WWeFif2AR1A3IHT3/U\r\ny0AaciSLgiDozgsYIjpa+d7pB79HfL+ADRfiK6HcZ+lZEyg3KGUePrKmJ0jf\r\neeiNHWFM4xNvu896dEi+z1USqxMpzYEsNsc=\r\n=VRqM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/kZrKlLV/b3RH3dHvjVlKmvCiPX4li9TmALf/sw3qZQIgbd6LMoBApZYvC7BiEHtvkceKZDgEqA/AxSp8X533+gs="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.0_1646448152162_0.07895914082126265"},"_hasShrinkwrap":false},"0.2.1":{"name":"@flexdash/node-red-flexdash","version":"0.2.1","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"socket.io":">=4.1.0","express":">=4.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.0","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"47f4c93f29e70032d56866a81d011ff4fb086a80","_id":"@flexdash/node-red-flexdash@0.2.1","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-qH/dCwvdNu7/BQ358MLTbDO+RmgnaYT08gIC7fotocl50oO3KRHw0jWQRNhAIlHFSb6/gCxJtHvwVc7Id6HpSw==","shasum":"864cc9cded6b8091f538c4491b3fc68f999fca49","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.1.tgz","fileCount":11,"unpackedSize":48569,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiItbgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbmA/+PlEsG+bJVUFP2lS1AE/JwrMobo3QCtPLKKJlL9ztpKDgqIGP\r\ngpojkjfIZVAeV7gjFx3MyJ29/OkB11xeF+SMzVHTZUnR1JO6VErNw/5XqlPK\r\nA5Y46WjU3WmdcF6rDkp9B5w7ypqwuY68f05MQX5Si7X22NNozScAhtYz/gfe\r\ncldtBN1M5yoFKjmmPVuF2e3ZV96MVFlNnkPKy1Yo17jANnk3nXJtmpoYm+it\r\n5WzKd8UoLQ/ta9HVRlGzbRDsR7mPULE9CfjbG0bFK+2NwwI7UG1ci056dJUz\r\nzmKF7xVYRGSaDr5ud90w65Ds7Q0/J+TtNzqPlebJWyPmjMfIpVJYpsVrbT+C\r\nzrGNp51GCWhhSFYcsFViRMElzTDdtM79q+AOw7rLHMvAE/QuTvTF4kX0Mm/S\r\nfeaYLgYzmir8zVdIueq6HUIA27J0lmKpgX3k6MR4XgANn/2NRwvHsm2dsw22\r\nAbWyxpQoD+gp1ysooL+szJTRytmMUG9c2LTHvhdXpJilFbS08FJR7c8b5VSS\r\nVBADmok7d28P3eZi6MheMl1c5kT4/k3b0/6YCqctM7hQgfyG7gyF3vd+FA4J\r\ngxJLH3cWb8B49bpNADuSQFhXvFg5ZUu9RDVz6qIs7dp6E9uuuDxznY6ZE8xo\r\nYMExHVCEHxS9ROLAmnwiBQSSOpTlRwdKxNk=\r\n=5JbM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC89yMFIL0O0FQOB7LTUswKBt1cTCXbsrZeF/uSHI3iwgIgMK+HniB3984qoK3rb2asu3nBhH45KUPBzqPD/V7PwlM="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.1_1646450400339_0.6817826563139469"},"_hasShrinkwrap":false},"0.2.2":{"name":"@flexdash/node-red-flexdash","version":"0.2.2","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"socket.io":">=4.1.0","express":">=4.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.0","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","bundle":"curl -L https://s3.amazonaws.com/s3.voneicken.com/flexdash/flexdash-0.3.11.tar.gz | tar zxf - -C flexdash","publish":"rm -r flexdash/[a-z]* && npm run bundle && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"6742f9b189052b7ee5e040cdf7093efc03ec9ab0","_id":"@flexdash/node-red-flexdash@0.2.2","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-UpYgO2emC8V/mIpEcKnz5J+FwvluTPSAwdM5ByRTOzjf3t/o5iZTCiBinVduyMGrmawqM6yl0a6slPdd9KhBfQ==","shasum":"ea0db0a15f08a8e7a1e2e0e59d6b010606ddda37","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.2.tgz","fileCount":171,"unpackedSize":6527279,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiI5llACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpiDBAAjug3hkN0oagMB5IOYaU48uVy5xhV8jzn2S4blBDxqjsQxBwz\r\nVDuqC7rHyXs0D3hCStcG4TEo0L6GMgsLsNTuOPc8IuJkN+AOexhqf6rOQKct\r\nYvTN0bsaQW4vgpKY4WGC4XEu2UJPQ25wYfBHVSxXBRmzoX0vLcb8yLU5G8j0\r\nk1aqCRQcezY9j7Ny/0UlcCMrY4Yu2ircvHSewy0VjigMUMmWZ1pCm5/CYXuX\r\nlKAZKOtdfUX/rYq/GjTwjG7GnCja+xJ3EQs4I/+3mUovy4ydUwFMQ1sBjjpO\r\nYB33FsAvxj9nXu1YcMJd7Uiw57GA7x46N3woh/JVAWo6i+zIjeSPNuw7dosq\r\nKb51j/Rn1mASmexmC7PKo1o9mbhsx6UEbtOZaN+ugBDGT3v961muPoJytLrE\r\nrOATRg3ARTm/Ba/mJuzKA4M98dLRz4XIMogOTPg92kJUzD5BOFCA9GEYLO5y\r\nKRgMwMXWIGFYRvqmyFruC+Va5R3Ss7Kiyh3SnY7NlAcgbmHquVAcbQ3eCBVd\r\nkIdrg3oDkFMxcO0W8ks5RrKIgRrTOl+318KldbRWL9FfsRHxLlgev1UD/fz0\r\nYaVm5mBK2rH98U655kT4A306fB2PrJdUQI729Hnb8+At+lVXTJ22bDK4AVoe\r\n9N+9EUbPzL7FZAunaSSr3+JL+i4ee8LugE4=\r\n=Qtj8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQClkMdAGZnA4fyOZaLjSrTBKc3hKY56O5qEwsqQNA81KAIgEmnyCuRpgIBkUJq+fah/iQ9T4C7F5GKZ2gVr73Qenbo="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.2_1646500196956_0.12618324917034118"},"_hasShrinkwrap":false},"0.2.3":{"name":"@flexdash/node-red-flexdash","version":"0.2.3","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"socket.io":">=4.1.0","express":">=4.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.0","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js"}},"engines":{"node":">=12.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","bundle":"curl -L https://s3.amazonaws.com/s3.voneicken.com/flexdash/flexdash-0.3.11.tar.gz | tar zxf - -C flexdash","publish":"rm -r flexdash/[a-z]* && npm run bundle && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"6742f9b189052b7ee5e040cdf7093efc03ec9ab0","_id":"@flexdash/node-red-flexdash@0.2.3","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-1OQrlaFO7ej4eiUlKYFC7G8rWRGHfUph9Ah07LS7zzyr/Hp3L6FEpG6zPEk4bOEaj2vGcUtKidQisbbaTGrP7w==","shasum":"30ee04d07a9a977265b24b74d3c364969e97e52d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.3.tgz","fileCount":171,"unpackedSize":6527279,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiI6ASACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpvMhAAgFtpGcV665vhSk1IVrVsfuFfPT6RNSkLkQ4M8RTY36ZRCcPG\r\nhW1/kipVVHl+wlh9gV00VtbzuXwHEqNQM+0y4nbALIhqRh7tYmSFKanGi2pE\r\nzlzMVbabAm77npI3VjzbKXrBgG9H81GeU5LMPw1of/6pCvgJYVA6CGt97Ych\r\nSf8Zoxq9+XUFSP9hAUYYyq39+YmzVXNIHSKV1mIZYGT9UKG1c0OLzVR6pGIP\r\noevWt+R4VtOEcMO8WC7YP5vra/+A9cafIi2SXBByGkHovptlHAL18FXGhaXn\r\neyk30fqwFstnCWIhcmfjwk8lNepXe2EsmsH556tIyPhm0VU9DvDNGC0rNnSU\r\nzzDu5266VwXW8/9zF5v1yQ4W0D+ZwwGoBUh1fNaIQoRYwuVfMnMVl4pXncD8\r\nQDPMIHmiKawmT89aOFDs3/jrhbB3M4XlS/X7cTTLyX6FZmyCZrsgv9nG+j1X\r\nu5Q1HbGRtEDONGa0qwEmZLID4/vrWBEz05uAswW6TC+vjgOfM3n2pwxxfAxF\r\nYy2XaAO5ppNeMGv9VqG7hbyPbOpDb2tqgjFlAXN2nORGSE7x1B9fQo0qIwSz\r\nUpUuDMqPK0mTSTOO6rt8gPt9kQZBiWxM1YANS5B1vBvgxINQx3K0dxOF+B8J\r\ngQ5ayz/vpG2R2IY21CQUe3O88tfy/4M/CUw=\r\n=xg0n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDR74QR0azhE9sK8naM8hogGKTqLk8T5TU2mXQpHAgUMAIhAL/AYDclpBcQwtpvwX1t4vMhdrYsqvRu8nQuNLZIRkhi"}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.3_1646501906472_0.28379976658006756"},"_hasShrinkwrap":false},"0.2.4":{"name":"@flexdash/node-red-flexdash","version":"0.2.4","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"socket.io":">=4.1.0","express":">=4.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.0","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","bundle":"curl -L https://s3.amazonaws.com/s3.voneicken.com/flexdash/flexdash-0.3.11.tar.gz | tar zxf - -C flexdash","publish":"echo START PUBLISH && rm -r flexdash/[a-z]* && npm run bundle && echo DONE BUNDLE && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"6742f9b189052b7ee5e040cdf7093efc03ec9ab0","_id":"@flexdash/node-red-flexdash@0.2.4","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-VOFQytc4WfQ5VVYqCCxkncixC/6+c1V08NOtcj4+upSOIC0DS6vKpaw6Afr1EwDQVYnS0Wquiwy9v9GWZ1XJUg==","shasum":"07873f53ed6a21cea52b7be0ab526a432a928c35","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.4.tgz","fileCount":171,"unpackedSize":6527329,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiI7UkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrSuQ//Z7ZscwhFafiy829udunZ82K+gNQ9mPtOJubpqk7d+xg/GR1Y\r\nbc+WOO3KFUb+Z5SxO1ii2qI/FW7sodGbvLA62ZLkLzA8K7jk4Cs0UlTQn8Lr\r\n8Bgx5z/p3Z6Smr/rw9tPeVu/92tYvpvbiROg9dT5vLLqxlfpEJmblDCFQBfc\r\nFCtubfwz1UkFhGjOMdF4dGj5kr6qA86FHJ1NqDWnjrWL8dfDKlb8f4pysX6u\r\n+WrQ6GXw0xcXVpmYm3ZSbMfHD6JoPX2OF3bx45hT7ec41FDoK+xlO0eJYaLl\r\njg6r6pJVfOLoB57dA5xChgFlYpdszhlCDIg4xutjcWRF0j1/gGBBYkkmVUA5\r\ntiaNrZLEQkiVk6ZElT3t+TnXTSQ/Aqlqz0EeuE76Jzeq8j3BUd6r7e/iumJm\r\npqUBqzwQa24oF97OyU26L0a+gQV6oi5TCmIWJ+8ZPCtabKuUsI1+MB1gs+MO\r\nw4tSTKR+f9AF6mufYXK01nK2eyzXISwrxm3yPm90qFuuev9yII6Rjx1UzvCf\r\nGFrpkwWYkQZquGLcUPws12PzUut6j7BoKDmnIKUHi4WUs27cCFmQ5Gd2c/FX\r\nPPsucIfI/4DIhroEzdMihp6csZQb50FRbFSkvdFZRGoJQKTziApNNHZ4wddh\r\niydahagtQkTepqZZr/BCp3wkwmKh0TScbw8=\r\n=0qmX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDaDnwUbkDGCWqDQsLPagXBoCIuCZ5NaL3MnnPGQCUXugIgQ4qHBrxxRGU8awJ/U8CMa+Rxl/QYtDneryCo+vkpHSY="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.4_1646507300081_0.42126171564818504"},"_hasShrinkwrap":false},"0.2.5":{"name":"@flexdash/node-red-flexdash","version":"0.2.5","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"socket.io":">=4.1.0","express":">=4.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","bundle":"curl -L https://s3.amazonaws.com/s3.voneicken.com/flexdash/flexdash-0.3.12.tar.gz | tar zxf - -C flexdash","dopublish":"rm -r flexdash/[a-z]* && npm run bundle && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.2.5","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-IMf7jOLUx/ei533oMCrAqGEI7utYNzFenqm6CRxwYMae+ARcAiGNS5+Tz+WDojYxgq9UePliiyDKWUATPaOP/w==","shasum":"c009cdb612a3a8e8e29615bdcba673108277efcd","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.5.tgz","fileCount":12,"unpackedSize":59591,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmsLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqJKw//YI3ifKCgfxCki1JC7ptg1msHfuzuRA0KqjBz1I6WZtc4stXX\r\n+puOlzGOeNz79DEBkT+Wy8wt3z8vih7BZl9H9K6YW56mIHVaR6/MMIGfePPG\r\nK2ZtW/D6Qm+HdOl9jrFxD8D4RzrTM5ZIShEY2MZuLCVCXRR5LD38DNJh8IXx\r\nrP4WbIRvWOkdMVSSjVHBP0/IeMJaVIF+k6UeysVr4aZaYycsuxiRW2uhPCOX\r\nUaRCv2iQKGQ6yRd/vYeIPT3MIAfRdF6dfhStY0ZxSkH/4KUfwuNh3TMe1ntp\r\nheAxhYGOTaODirb7WeWyLPGn11ezdm4eAmyG+ezIk3GyFaE0x2jCpigyQ49t\r\ngMY84go/y0sntqcLFxJlSXPtUbUqCXGJDLRTdbF87EwrVvoRH5xqPh/nu653\r\nTy4r5z0rg7sEEjbKK18B7bSP80P4UsB1jefPFIOn7N1Y74sNuhnQDRbR4upE\r\n4JiyPgX0wxMPQIX3U1ZRRDOkzEOn6sLIeh9kE30/K5D4Rql/Bj26vyiD7Nak\r\nOcvAY3gzaitFYBOXxCVcAN+LWQmkTmN86InkrU8KtRRBnxXhdJVoG9hQ6xpU\r\n0LaS0zhyXz0/uJVdNk5MC2kARY7vQkF0TKOX5yLA3xv6mkoQ8NLrLv97qs28\r\np1BiarcW3E4imVy8NBSJPhJzVk7ib5YKDG4=\r\n=7ob0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE/0X5hpCGSo9PJLpTM1RW/wU50fJFvJD0tmw0xaBxM6AiEA+cFdu7oy5yzelG3cuXjv5jqJp/YToPCVHSwmOJ/UDL0="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.5_1646684939634_0.1363762466447429"},"_hasShrinkwrap":false},"0.2.6":{"name":"@flexdash/node-red-flexdash","version":"0.2.6","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"socket.io":">=4.1.0","express":">=4.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","bundle":"curl -L https://s3.amazonaws.com/s3.voneicken.com/flexdash/flexdash-0.3.12.tar.gz | tar zxf - -C flexdash","dopublish":"rm -r flexdash/[a-z]* && npm run bundle && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.2.6","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-MsdaZ6EOz+MRvIkm419/9tY/aKdeAuf3ZtsAEL/Njj87QQ+yu7MFdAVnTcVt4T12w3cJspkAFN2rdhn3cIWTzw==","shasum":"7f9bdbd348e6f9a52c89f3fddb9e717833efff6e","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.6.tgz","fileCount":176,"unpackedSize":9052511,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJmxEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqAhg//avVnes83AUtEqMlX5WsSlnG6hDw0Urq95xlN/+bCVqLfnJaN\r\ncexEUcK4XR70fcm63zTYSTmRbYncnGC10W3hc1FxToiikSciyQjofCaUzotK\r\nxtUJaY6ueqv7CK6wyMwNwh2Iny9qhU2GohJwOU5yKSgZGqQMQwE2iVDDBvFN\r\nZffSM7peuYs+CM6Jwerodch+dXWUKgGakU25KPGk9td5UH30ZgEQff0oeM3K\r\nel8idCMJYSzwiMEg1mvlYex8gibUlGhKz7hffV2sR5r19Hb33RouOolWGDT4\r\nWPUEDF2YYw6AF+Lxh4Pjonjr6rceDK7Zk2/NbP3r9vsOv3tRNniFd0FJfbTU\r\nlUakDddm4NoIKY6VkZBMveoT2i61B/y58sn21BQkfhEXI/XHN4SP30AsRtEJ\r\n+98ll0BKjpjq7cmVCiV6mpw5f43kVz/4Z1TijGG0buhQIR3+PZxVxfXOhtLP\r\n0H6TjNhfyeGpJ91akAp649Ot+hpn2QVOg20hLs8uPi/d6KFV26qcWQH9ajy0\r\njmGS0e3iI7K+ZOtr/njVG/9Pix+eqo0YO9SarWLWli6j+4tTyHnIiO96Y1xk\r\n/7RlBUDIW8OrC88nV8bLpXK1OQwYq8acvW5L2IlqkVu2ZeitjVztXw4wnKYa\r\nz432fSzyQDwrPZfwIcAYTt2VyO2qqWkDwaE=\r\n=jD3j\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqhFCEHHbowX1EFhCpmDGdEcRV6nb7bfTjhY9WyFzVdQIhAJ0CIJOoRxKOyEvbRWgN+XMjhReYRCdO2gztMuHW3bFy"}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.6_1646685252482_0.44785482509340846"},"_hasShrinkwrap":false},"0.2.7":{"name":"@flexdash/node-red-flexdash","version":"0.2.7","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"socket.io":">=4.1.0","express":">=4.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","bundle":"curl -L https://s3.amazonaws.com/s3.voneicken.com/flexdash/flexdash-0.3.12.tar.gz | tar zxf - -C flexdash","dopublish":"rm -r flexdash/[a-z]* && npm run bundle && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.2.7","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-gFG0dRYUHl/Zy8i2hmyJf7xrVyqCQE+XK8zLociSZkpxdMbudsIP1n3qKYAS4DVxFDZ9bRCUjx0ijI+jvjQmiA==","shasum":"93f9abab29fa910702d34aaf5ded24e5a6a8c324","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.7.tgz","fileCount":176,"unpackedSize":9052514,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJnWlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo8ng/+M6Kqw06guv8LRXdSZzlF5XR4vtwb1UvbTHswXCRnpbYjmIpN\r\nzeEG0gdruGImLRswdggDE4oERozoJuQqFfLSXwzjwlJXqk/rLJsjGkglud1x\r\nUCJFoJaQHyrM09YkxRvtuc2Ot/sRvWFgqs2tM31P4fROI9gqDblgxsnZw9wI\r\noiqOA8ygNwohRSeL+wie/3heZCexm6pEk+ll0RMLaW6/nzam3MsTo0MH+etg\r\naQ/VbGQYJLp34j3giRzf6FZ6E5TzzNnepxvoo0SfhngZ+GDByMp+vmrMCHT6\r\n2Mjg3QlrTYe6SKYgslrBQcWmyIWagvNFji9wTnCetqrtoBNVa5h0zMxt9zeW\r\nRScyHhEs05DScPmjK4AI+MlCl6io/Ua+mvb4YORTJ0z6wo2wpXR3DChXAtni\r\ncjYHeuI0w29b73poNhOg6KeSHjH9GCJKYUXrUVuK/Zuvct5Nr8hPXVGmpH0L\r\nLLssR+Mxf9w4JOKwhmk4lwJoQ/k67JT3nkvNrBvyg6kAZqHt+0RkLK3yrYkP\r\nxT8/hn6GcdhLOYa71RdNkvxx15yCSAvvu+1l5mGAdgRaaV5rN9gK7Ptfbvdv\r\napz/EzbRVo27VOoBDGfUQiUiVBfczgN+rqDKKcz5oYgvKZ+8Qt331jjL63Kf\r\nM7uK0BAAeSyhijiw55YNlXc607dFUoUFs5s=\r\n=O+Bd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6wqTZgSzLpNoyvxiQCA4+TwnEYVtnXU3cBCQdfb8IpQIhAN0kp+ByZgXsbGvXxUWgxHEAFH9FfGTYHISoQHaUc6gs"}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.7_1646687652752_0.45198347013162077"},"_hasShrinkwrap":false},"0.2.8":{"name":"@flexdash/node-red-flexdash","version":"0.2.8","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","bundle":"curl -L https://s3.amazonaws.com/s3.voneicken.com/flexdash/flexdash-0.3.12.tar.gz | tar zxf - -C flexdash","dopublish":"rm -r flexdash/[a-z]* && npm run bundle && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.2.8","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-tA58ukHW4NcZZPO+1Zl+ATzf85HZYfdYqPPBKfWvOvYhoFvu9ORtFC8yJxJI2MskE1+O0zJpAqPWgzFyAzykgQ==","shasum":"a6675297dacd065998bd9ea41a92882dd418dd38","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.8.tgz","fileCount":180,"unpackedSize":9071562,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKrEvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrm3g/+JbKHJwU3cypRg38lwitHq3MLDCRXHgvEStS/U8cluFAUuRPQ\r\nbChQpSsknCbMcyBpTwpxX10+mXoOVKXOcGyZ+0WHBtr4+sILKo6/ty7TtcZ1\r\nsi4sxtOe3NpCzZhVy1gRAsr6BaIeADFMZv5qXMLN9e7ad9ZyVSCu5NpZGFfG\r\nvKTFEwA+d0g6F9iDH7OhW95Xnmka6IxmXPEIlXw46MghnmZzSzoAX9DVQbsv\r\naDFbSy4l6WwLgipl4yYGNGo9K3SQ6+r/ZWxXbikdjysYYN2Q3eWiNYpV9zVD\r\ntm1Vr478aqzO6Ly6I/1QCA2McQEnZQWeWlDr+saeyCe16NvWXSjDXHkRg3EA\r\nN2km76i56XVjSP/IC24szH464SVOGTe7HeQYa1YK5baRI7PEppCfj5JVn4DF\r\n36YBrHmpMP2nqoS0Mb1NHuRHeeuvEl1Lg0rmSBOP9NfATTR8SJymop+/8KXp\r\n5JwlJwPy48xpQk7gVlREuFeziBGZTZODo43zhvoWbbX3hLVRTban1V+MN5uM\r\n8v3uNX+uVCvrzkQkVpCK5M1hK+CrrEWsxwcjlG7J98XKLljo4enaxgwJo13z\r\nMrITTRAoICCZ3u3JkW8smT5WQJnd1VtRLe440P67yQFlcn2yzJyMJq8PeX1G\r\nn/na0Q/6uQAMqQrktgZxaffX5H/zG3mlYRw=\r\n=eUdD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxKkaIY6DTSx8YL1g6niXLefVO8izFQpDj8GVulnoSuAIgXgm4JZ9kzVScGrdXaCI4B5bmBISKn88w52ns9oDlMGo="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.8_1646965039619_0.4153879770775397"},"_hasShrinkwrap":false},"0.2.9":{"name":"@flexdash/node-red-flexdash","version":"0.2.9","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.13 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.2.9","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-+WolL8puRbuGtZJrqK7eu4Atpb0CAaCwb/y51gEn7Ui1Yrxc9qRctQO8k+33TDWIPkQxw+D5+alS2WOkrmfyQw==","shasum":"0da07523a7a531752e77f2c88e45661c318ed92c","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.2.9.tgz","fileCount":181,"unpackedSize":9550189,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiK4VVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpi/Q/+J8ZbPQQJh4ad2n3jDWEC2LPvigz5bWF9mRaA1o/Ccv7p6ZJ+\r\nmYZ0Ty4NdJLTeUCa5+lYXILV4mDJ/mfrehjswq7LKCg5nYvhgcO1tOng8yJD\r\n6pDky3CJDGbcBqjysMQrufZ42CRZI50lYQ5lY2eJv4+HNfCd4vpUwy4/lBcX\r\nBDewDMD5HxYHxBg5+YlwnKjqY42oIG/qBxDXsfSBXYTe9IZitZKFRQjlDqMn\r\nKjM7Cm/SPnCZD4+Heglj2LRzbffbqiXAClnpW70CftOl2/hihIx/WWGowuha\r\ngAmQ+36jg7Qr2Z+HEpQBw9Az4KxfRLF4xA60Ucfo46OpBL5/H8eSOFtZBfDK\r\nqJms51ZrF15gOpAcCpDaAICvJ0mYAenTDDY5jEBg3Db1JvuJ2xGgkA4DmOzk\r\n9StLzr53CHBS+FV+NWYUkVVEijXQ2E3tNWtuio+j6eI7LYSOMtxjAE8+rtjH\r\nM85lsOSqdQDO0PomotOo+B6S1awSGsK/5ZDXo0KcO+/yt5yHOYIDEMTjXQ7d\r\no3svDjjjxsJ1ZDtwXo3/cDFTXdZMgXwUQIK7JtRXRYhGKEk/5QgHPNWdkO6E\r\n1WZvtHBI32GxIImplXl1ysuvE/fK/rQmwmDIn+kcLmutSlTRZuUYw9hVfJ+H\r\n3ceBzHTXILgYABr35gT53Au/VxcXYhiGQ6E=\r\n=xdM6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDoagDCVqWob3uKG4ttJ0yT4RCTnDfZhvuh5jzxM86rMwIgdmLIEQ/OtoTMheomsFj9S3EDcrsOVNPZzw73br+3akc="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.2.9_1647019349404_0.8303125730447625"},"_hasShrinkwrap":false},"0.3.0":{"name":"@flexdash/node-red-flexdash","version":"0.3.0","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.13 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.3.0","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-8/Pw1QP0Fn5atbjEEZLIsJ0cB0q095LSQJmAUC0dA0uKqPK0XVhKtIRrep+0Z3WnZB0FWKTDLOE3od7v5xXtPg==","shasum":"93bf10981f3811aa5cf9488025b24e9f3a16434c","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.0.tgz","fileCount":181,"unpackedSize":9552148,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiK5WYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrkXhAAoZwR3m9RP5ms60d1DrN/POUSW/1YyX95NXfFcH+GFjCWkiIY\r\ns7WPD6PzZfFZOQwXAF5utifKg9Sw5UP0VvNxkHC4qiii6wFuD3iWESl3bNKZ\r\nIQ37/JeBhM+90dwhlh0WqRgqGh5c58AMVx3Qm0dSaWOS9itIe03jjiWRh2Wp\r\nth8ZDnJgsQUlHSPriuz1aJpy1xwArrzV8Y1MQ7FMjEjxRjh7CzHccu1tN0MI\r\n8tpgDXihlUEA5503VW/IUxznfOMPHZ7KjwMxhO73oT7pzVEekKHxCzzzoaeE\r\nU5cqoheLAqgzyWqGcny89Fy+rSPfxfsTs9t3Tpbla2hgjyOQXzGwDOWmz5/y\r\nMwAmZlnrYAFCqqHkBrWmP3wbcwfemtOozVmqjpsXtcRMh7uIZtALms4LjLvt\r\nyvIegoUtKe2O9GPE8wkdnmoNAEOlJH0TGdoY8vDRPJsXzm5sUTWSd47MLDCS\r\nFXErgk4UXuLhPwNHt8hLD9ATiOoD1ZPFUpwkCn7mI9OJDejX1JoBemWiFXxX\r\nwYZAVNjlRko8UDymjzCPgQYgedHihmcvdP1mm/OP6JcokiEIWhgq7QGSjx1L\r\ne3WMRh+1xXLlkTR3OhOs1qZt9RolFpPTQ1Qexv4QXsMp1WRSMuy0jRFOmKHC\r\nWdJ56gcC/baDpdHu/XnV02uc62Cp1pGREwg=\r\n=Me/L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC7invdiM509Ck7RZ8OFVDeHSz2l+IzExV8eIPblR5psAIhAJjdFAGTQ9T0eN6eXAkgCijCSUI1WxFgVULl+gIaHdWI"}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.0_1647023512041_0.5977526263758879"},"_hasShrinkwrap":false},"0.3.1":{"name":"@flexdash/node-red-flexdash","version":"0.3.1","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.13 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.3.1","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-LJAIapprySGV2CHXSrBfudE48yvEmPMvM5cT5WunI1tfXJjVwBS/OYE4q9ChJIWfLBXQkOuf4JMeKIRSu+eAdQ==","shasum":"e1c0c1f9f05aedb3837e768ddf69dd297b9aa4f9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.1.tgz","fileCount":181,"unpackedSize":9552148,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiK5pEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp96g/+Jrgejo4VEFJKGNk01NqtotGpX9DcuKZbc/mHTmzIOxyZILF0\r\nOscYbcPwAkfk/PzpxKauFP6aH0x/rEXr9AaricsQM5CM1xtwnwY8AfDzclpY\r\n8mTr5XWLClBBstjWJJua2nB7lzd/hkzQGOj6KU9w9itVWWewWcltn++Br0Qm\r\n24gw8BfrQlzJCmWwzkKCSNZNq3shaZn0qDVBNi5wR0IyDqeNLXZIpfNgDos6\r\nuD96EDjaKxRyHMnnJJ9mNz6ehj4PuTBu7Uh2/MfFKhzmvIgocqRqP11FpcCy\r\nz+utMVylxQdhF1FWFL/70Zhk6b45I6S8q/3NgtLGWMs0PcB6qgjwzpd66+gS\r\n7oah++/w26EqWNl+JfvWzMujHEtSLfaOpRaqwbcEqku/4y/94yQOd4XntFoj\r\nNaxIvcoCVp8ojuSm30eMwcQ5feSZfO6atDszMnUw+MGu4KxrxLi//A1txdwc\r\nRHy2Abtgj3B9c2Zll24aNtNwhQ7bITyXdf1pKK5YhbNvW+4Q2e2htOdDIN1m\r\n6T8qrKj7KpU4ShCtc3gghyzMJELif3UsuyD/PqgS+3Kp5SFso135qzeBgNJK\r\na3+EygJzChT8Vn3qoi9XbcdWWAtq0GQQ0VjExL065geYDqTZROi5s39PW++s\r\nlvfhksxnDlnEJs7Nv9iVRRfYWG1PJj594PQ=\r\n=2uVG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDlww8LA/dv41hzSA0iKfaFQiGboy1V6lEFLpyqPoiVkwIhAP45BovjwhWw/3FF0kpW8N//MpB7e9DEmyMHpGvlmgms"}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.1_1647024708471_0.4266561822047725"},"_hasShrinkwrap":false},"0.3.3":{"name":"@flexdash/node-red-flexdash","version":"0.3.3","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.14 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.3.3","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-odXbH5b2M66ju+TB86jOWfx8v9k0xQroW4XydRgkJ8DCsJGjyd2DA853XJoV7JAeOSmo8Yen/HrXWItJIO2l+w==","shasum":"6cb480d18a7a1959337d6e102026739f2e20e73d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.3.tgz","fileCount":181,"unpackedSize":9552905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiK/s6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrzLQ//aRcTmNx8q2MgYgQAGBfN8Hp8QQS7I9LQN78kOBcOtSnJbWl3\r\nZDFOs/SFgDoNib9rHXQpcIwuzn1rMJuRRaolnTRAbFwjx0MKtZnIsFIuXz8W\r\nsm4PNXqVstHejhbJqfsxDPyGYLfwapfm5KlWmNsESf1lXTBepyVlBQbEMb0N\r\nXYQFJ9MZL/EF02jta1nGGG3C5+bWNMppGuzYUPJ8ovKhbOF3MfQw2t0JSshR\r\n0MfLtayrbFGeoYG63QvHZXP5CPTUnwgUfstZSEjv6gRkzYE4uezFb6AmHngI\r\nB01o0Obgvken+EWFDwKSxE9lFEeajelmQyBe2kU8dtpoP99aOkJ9Dy+gaAJ9\r\nfj0OqVHsxvYef11+6B0SMO0A8Cx1+/TUfGMiuS+CdBvy2Jo9rvzvde+N1wdZ\r\nrDhF5t7yTOv0RFZHdM66lvb0ZuzZk5475nZwJzuMvPlbTf3ARLUSbMq5CS2q\r\nKx9Pz+v8NAPXiTk9hsZblHB2fqA/OHhZz+onzvqhv4lqNb62J5FUHyGcW1J1\r\nHHrgkwf0YyLPnpYvjPhUcZPpVndf7MRZX5160Me+xnGMaHqZF9gJVR5ULb6O\r\nbZaasyY7SJR6gZtE0NVgBPcdMaCEIQ78ITHMq9Ey3RcCndjfW5fMN3Sem12J\r\nIPGOx0TNvErP+w0zSSkVzEJT29nc2odvj6g=\r\n=I1Uc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDBzMBDB9446wmmVVEe1EzNaIdd0FHCvsQnIcPHxPGU/AiEAz5hwPW1k62YnV4WB0ed4K+kIH4s6Tm+KlPVAjU++MrE="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.3_1647049529866_0.25175432512317264"},"_hasShrinkwrap":false},"0.3.4":{"name":"@flexdash/node-red-flexdash","version":"0.3.4","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.15 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.3.4","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-EoD9Fyi2vTK+3LRkWkRXuDHl4fk/UoDbITAxeVZ3Cih4hzDeGUfrVvlf45Wt2cKQguXqTts3QNkj9I71eODSfA==","shasum":"053ef0a0422982e09dad59b9359040f100c92eba","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.4.tgz","fileCount":181,"unpackedSize":9553813,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiLNGkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrONw/9HLhV3vcil9gdbSfeO52CRY3nmUhNncjq2O4LWwQbQ0KvH4LB\r\n2Uw5MBv/+DFZN6cA4/L0Sy/Xe6FQS2YgFqA3AGlZjN6jLc/va827fYL4T8sR\r\nZdqxSOXD+sqnpKkiR9n7N3ZHaEdBWSzWKawmFTgr8NXHHJqNzj1QUrwWwAYp\r\nBSWNDDZI3kmSSVjcfh2Q8JJnXI6vluJsUq4hFNhAYyeYB5nfskeo+K5D/qAI\r\nIDgS7kOXwHAju0HjfPP4qRh0Ei9ylbzCUttSOObEuZT5vOT7Wt4hJLB26kAP\r\nl0s4EUnaeGFzRBIF8W2+KPlE69lGoMtY74eFDsV5jKp/wdwZULUgowfOoBaX\r\nHiSwdZs7AgVtt6+cyE1H5mbdoB/Aqzd8LnAd+o0HgtUd3/Gv9QEW9ws7j1/h\r\nyfl3lBkCRLcvflYh6BQt49juqbMRsG73QHI1B/iLqFfRpf9dHKvqsug6eADT\r\npuxEz6XKrBNhQ/8c7DaOb0Zl2BLyyDDDrvOCsbV2LaEMq8ktX7gZ+1gIH8sE\r\nsgUUjAm2ME0aJPlyzjBfzDIjFufnchYo2w3DPNbwhy1zp3T2/v4vW0DoEa5H\r\nPXbxn5T0G7Ff1m6I3+YTkMxUA8qbxtIfPMpHAT38DFd7kGSeCCgViYeJ//n+\r\nDeTViHzt+JhBB126OgZi29wQtvQvc39A2hs=\r\n=TDab\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEQVWOhGPbFl7tP1Yo3q4o9B0J9Ivz3Kje7+rj/b0CjJAiAY9i+wuKzx0CSAMJGlcWaX8YYoF/iQCGLk2s3va2okdw=="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.4_1647104420112_0.769565543052503"},"_hasShrinkwrap":false},"0.3.5":{"name":"@flexdash/node-red-flexdash","version":"0.3.5","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.15 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"87e8a80c898006bc15baf5a3862954d5f58dfa00","_id":"@flexdash/node-red-flexdash@0.3.5","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-q4IiXGdOG6P++ax5IpvaSt1OAlWiFBhl8xQ1Eca+sBwKrV+5W+lFtAV695P/Zkx4bsJWD7t0AU/Pz82FvGMUnQ==","shasum":"94e3a64ed5155f2be61c2988bad92f9140183ca1","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.5.tgz","fileCount":181,"unpackedSize":9555228,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiLO02ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq6txAAiV3jW9Z9W7/ji0QDnN4TgiyURSoboa22SCelQ3YWMaSy/Ypg\r\nuuMqNEoQU7+nyyRzl1/Y1SrQIe0uOdmZd/xZrcADXNCSVW+hSv1rYo7LbdWk\r\nHi/6NB6V25dfqqf0wEfdHCk5vV8KD3vbuRDDj5V7appVdcYU/qRO3Fub4jKu\r\nLhNms5jLBlGGmmKWo/0DO072Jcfx44IWJAhGrn0YguhzMaeqoyRr0OVE1qe4\r\nHm32QVetr+lATGuf5Pn1rirIIbmpZdPtXyy9ES6c8Jh8bkcZ5cz6801OtC+T\r\nPn5Pq2EqeTtVTmipfIFcswYd4gcQkUZug58ZNxE94yJpgs2dAQAWqbamxVPH\r\nt/ZQSwwt0Rkj6Onaekubm95MyWywCcpxkHtW2+PZKQKE5Z9ELpMeEWZp22rW\r\nHRuo/jqTsZOu7AB/UHu0Z58wwcUY5wK6df5nNlV3XKmukdJxm4zu0T8gyEoc\r\nz2wOJV2dm/R/D1ouyOSZP4PAr38QvSKC1kqg95tcQYqFDXi4krZFw9IyoZ5c\r\nssiIJYLvzOUOBW1DH0ZS+65ctSloQXeFpDxEgoHytxY/Kf6QtQvWp1aFA9Fo\r\nZial1oETaW0sMIPEFnLpmOa7H3lRnXsY/iK4VP5v/znUSDbTzLUpBk7//psi\r\nywEJhAczY43qfTuPkzo/5YTHoSzVMpYlbQk=\r\n=Cftb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID4Npp5Xx2l3gyjKo3uGryc/VaHjeE1kgIzvui37uYnPAiEAwMiJ0ZG54t6Gm1n9PzevM2Fsue6Q5vpvNZ0JeGJPlPU="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.5_1647111477938_0.8393600272580559"},"_hasShrinkwrap":false},"0.3.6":{"name":"@flexdash/node-red-flexdash","version":"0.3.6","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widgets":"gen-code.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.15 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"834ee23be2392e6ae20444d97aa02661a5f83641","_id":"@flexdash/node-red-flexdash@0.3.6","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-+paishJTxY2qGt2gZkKchetx+bxgTERQBo9+nZlg2PjpmWP4Gv8XcacEywN9R2X7By+ln0l+v5ied6w8ppdXzQ==","shasum":"5a0f15e45db78390c499729b9740ef8afb31543e","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.6.tgz","fileCount":185,"unpackedSize":9566836,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiL5A4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoRMxAAjG+PdG6kPkTcwLKBrRlYgsdsWT8+35Q62azO/2QrmOT4GVw2\r\nCcR9O/csYJuFBYKD1S/Cd4V9AdqZWEzZFm/xKdQc96D/4/e3kDlHo8hpAKO5\r\n34HNkHmtWNbx17jvJDo+7Ovkt53aynTYUVc8mLe7jG+F5z++I35hSuH/5YD4\r\nqpkl/M17QM6B6iJuhEhFHAiHJxj587Z8rFTrBhjRq0QhLXN+kZ3jLZAKzA2M\r\nSjcM8AnLsJFtUuXw6IHs4W8jLeZwLMaltNrww1rrPvlzHQ1l8Ntj8Og+p4e+\r\ndYtmKajR06RnoPdAWzQ7lC1XF8J62qiHmO4UwFJiRlhGGp0WMuyf/TwQnzl0\r\nQtqsiAhdghTJNRBhVJElqhfAszgMglDtADRGC+Ui2eqnvnvu5AMYlhGJjH5/\r\nlWC1CDd1nahK81blKD/TlN1Q2I23oNT6niBvSvpBnbGmbA38tSYDlahAncJs\r\nOm9EXP4QI4Y6pDsm/fUi1QAZ6abQ91YUZ2/zd0tvIKU+PvviaYZbsPocXGfK\r\n2T/QUfFw2X4lPXBLtoYcgQekdIPKlqrjm9G7Tqv4pHEmf9exvdS3hiJfL1hh\r\ndiWz8Kz3MvjDqrxJdpeaz5jUf6HB/NI6PHylLmJGPmJ3DQtwmrQ8/n1VCnjq\r\n5Y4FB85aAiI1NVdg9z6ijQrNBshN0QwDceM=\r\n=opbA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEyyIGdaD4uJIPBYLdo6tbqHIgDEl9aDPfEIKw6KzvRGAiARdA2Lt+A9gmeKP7nKwUnt4Z7zZm4nEjCIrFRuf62COw=="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.6_1647284280618_0.08629353384437821"},"_hasShrinkwrap":false},"0.3.7":{"name":"@flexdash/node-red-flexdash","version":"0.3.7","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widgets":"gen-code.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.15 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"53f5af49fe640226812c1b302312605744a8a6e6","_id":"@flexdash/node-red-flexdash@0.3.7","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-bl7fql0Clns7t3ofnVjv82bS86GqnessQ3hjdSAbYvEmti6hK5MOpyiSQwKWbbOYrtnU7ueP0MV4ockh+3ld4g==","shasum":"8cf3337a7c04fb16675f4843fb30832ea5129ad6","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.7.tgz","fileCount":185,"unpackedSize":9566814,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiL50tACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpVoQ/9FjzDL3qRq5ShboaFROP3RlaNgSYfkSbnICsNQ7vrOXBfVa1p\r\nysfVeK9NVU374El6YMx6WGR4SjQK9LfUBHTZib46UAH0IHhWWvI6qw39TBTW\r\n4Oy2A63FVG1qRbVNuYttCsOxlFlDEfGCD/Q0DjI1k4B4TII1gpvAMsCnphY3\r\nW3vcWL0WgMj3tjoTapH/OxAJpQ2uM6f6TtJwyxVLqUqEbRZz80CDh934FP/L\r\nxtxZ/j5ClgiCsiWv6btPlUedQqT45CoEIvJwhJJfHHPs7dvBNeWgA0l6mB4H\r\nAfXAQ0lbBouc9GYnliPAGkD59HyhuBakCfTVqNOCFTayxbgJt7TZbrtuNugn\r\nGkAGwpPRdXjWsIPKO10sLN6iVqLS/HDJVDEBuj9nUAdyftbs0iZlVu4x1YRG\r\nMhn8zMXTeWry2jsYITqiydVaKNLyYx8/zQKVHxnRfeWjffh9VPocEOfXgaDo\r\nT9Z7aaGXiePyQA66mys178CrAHe9NaUyiKRStYgMvY4U3vmVwgysauA4hOcW\r\nqscfVCavxK257U0Tizroe8mg6O/ONj4LaIOM0FmRID3rl6orLBFNslb2Fh2X\r\ncW4y14xTKELGSNg6ZD8axz0Y6WSN6Fu8pVL05jkcPTovu/7Jdg9Wj5v1HC3E\r\nDhDtKSjO9qhNFnk/PgSSYjxJHueRbAnNgls=\r\n=lGcc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH62eRjE0zDHlckTRIemnVreRzEYg5U43qwErHJrK/LKAiEAg5alyrTrEM8zJT/FBsPBEKKQHJlsd3NaMmPHTVJ6lb4="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.7_1647287596823_0.9845782915441437"},"_hasShrinkwrap":false},"0.3.8":{"name":"@flexdash/node-red-flexdash","version":"0.3.8","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widgets":"gen-code.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.15 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"f8fa4fe3a2e28400ad9cbea671d5930169c146e3","_id":"@flexdash/node-red-flexdash@0.3.8","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-RBhvQB25mG5CY01lwueeJnwC7vie6x0lPqAa9n/vc8xfB0B34+9LgXeQ9mOt06vdwK/UsXgkAxCH6iD0YM4V4w==","shasum":"98b6e4b0ee24dd460adc88611f288e4078bba966","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.8.tgz","fileCount":185,"unpackedSize":9568990,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQM0ZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmppMg//WsUBdbTctfDvonQMKAkVXiuW7341JBvB7CdDQHluuAetEhIO\r\nuR+XR6y5urhJcHt1yzcCsx9QCycW4ECX5NNPWkoNBHVN7K0PrGG0/Xd0Z9Zu\r\nKo5iRR6OZsOMWQlXjkSpy+dgdkWIka83wVHauHQrqy5N9fCXbHnxmm+ECSyr\r\nalfoguX1KknOd46SDXfWRAk+A3wWAHv69DZEzq81k/ZqtLHAhZzgim4bv51I\r\nxhUM7UznRyOhlb8VAHoXEo0N9qptOGbf+5vs9rfg9yypvtBT455Hcxk/sKrj\r\n35hmt7Uv8kRS3KKzqwv4X9zvQDpR41TkSiNurX7f0N8+kAifOvBeICh/5kg5\r\nbIPLqDczrw82gkzwfnRryGHceilr4gL3cJf9o3yvyTJncvKTJW0zvUBuHDpZ\r\nQSQOj4RqLVIwrPOMiUX+dEu+PtVSIT4iM506oS45i6JRl+ZAMd0Tu3jx3Ydg\r\nijz+wVylhF/YGAmV9da/MWzu99yYXDk6v96Qhbai7guVjKeuo0v1mdNcMGBE\r\nYJ67F+qBnx+6BSDaPJQHqEXULnnzRJVEDJfjplz2g93dObZdPFs7pW3OvWHG\r\n8UIkpGW2vb60S1gaT2k01XcXKChp9QqlvbhzDpbIqowNFBlcvS2T3vjcT1Sn\r\nzQ+JHfqG1SEg45q+cKRIgRY2XhQsplHUKs4=\r\n=bWtJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAM3dhn5iM2Rs7SE/wM33sYW55xNA9qpVHwM74X8C9ORAiAaIJVjPnh48rghk20X9B7PWOKhjUnO5sLi4XJ6rZIeXw=="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.8_1648413977346_0.9764078194697965"},"_hasShrinkwrap":false},"0.3.9":{"name":"@flexdash/node-red-flexdash","version":"0.3.9","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widgets":"gen-code.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.15 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"2ebded506abd225702677763c4efccb0d45a3d9d","_id":"@flexdash/node-red-flexdash@0.3.9","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-EE7PUjolMLAhQxXqQcyXDVk6Pxh9TOyPnbwkad6ZlRtRnfPALuB/GucJhbYfpmmAjaJ60y4SMGtpnblVxcHdtg==","shasum":"4662c87321219f1c455da10c1bc67ba7e3246901","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.9.tgz","fileCount":185,"unpackedSize":9569743,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQhl2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpAHg//f59ucpyikTlgCV/Xjuvsng66wqgtqBk1XsD12PArh24VVQ81\r\nnITzCQgY94DLIEb0IFCIAfYi5Ffi7gna4IWB1BpEkVgdNVjfwcy92KVPdRRW\r\naU2fQkc18+c5yTIkTGWLS1Fqe5M7X0QiVhr9AQ5exkaIohXquKQUkcqFtr+h\r\nuw0FHXrwMzkrRDNFEtFZJwx2qxRWs+OPu9AfP/7SLHA2UjLnOKsDvcYBzk+R\r\nFirAJAvaqh+H/peiCYRymU81QefJPI6TZgEnzInIVwsQR7cXEN9TKVk1l9gg\r\nIt+gEIhh2RPiWe5YXjA66GRYN4hIuvtx0oie5qv2Wpv/VtHwE0jXJs0Nk4XJ\r\nUb3pkqXge+wP+Ex5WB7Wk2FF9G6k6XCNrZcfgxutLDLaBROQgtD1GugaJfAF\r\nZN/6v+bteMVhCUBtdJbCRbv1vJEa+gtzUcqDedAg9VppVrzJDdITEKIoc9+0\r\n6E6YL4WJeFeQAO+G13xfILWhXOMU+rnksWuI52T70vq5hnRnLUjCLlncAhG8\r\nGRReGVqNi8UE67erfTxp7tSG/r6Xx512Q3SIYAB0iejt9BBV+2/Obw0YfINw\r\nowdlUz1n7jvv5NFwLkH0JBjv1aUghmePvcSrXJjZDjdhx964BYuQdWK4h4ja\r\n5FR1OmSCl+cjdlf+CkH6IXmGgk15meQir0s=\r\n=eMzO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMifmzw91d9Dmw/LT/EIGrmYYbWYpKudioVo+LNZJligIgSQaBx99i7jcdmS+bD+Cf9CMzlr34gqaFuOU5mKytnTY="}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.9_1648499062644_0.34118755532190237"},"_hasShrinkwrap":false},"0.3.10":{"name":"@flexdash/node-red-flexdash","version":"0.3.10","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widgets":"gen-code.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.3.15 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"9b8fc0ad10ca4a8f5903a554382d712fee759272","_id":"@flexdash/node-red-flexdash@0.3.10","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-XypxNqGRqK9PvDeenIlXCYqD9G0nHyraydNGCpijSTBgqcb6bEJwoLK500AzF8bm4hzp8p1+MLN++FhQYsBxQQ==","shasum":"0eac4d076cd70248f1ff68e8191573b0c43a3266","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.3.10.tgz","fileCount":185,"unpackedSize":9569918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQ9UgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr9thAApRxXioI2cOOC7AywTp3l+GJmHh52zSnYrbWn9W91Gr2lIacK\r\nDLwRDneaIXHDl1+ykg59AEx256UbaT9cbHCJWc8k6lx6jXw/imd9Wznkz6x7\r\nqaDOZCaVrhvW0zdaxZzR1wQYyFGcOfx0L49cX4InW7QdWNzU4yDnYQNPqN03\r\nz+C5s8ygnSH0c8/Ul+AeFbDj5SQ7jjTTpU/w76IJGgDK0rZTaBJDEJz0loqp\r\nzJ3fno/ytRA7MXhJFUHzqAU6IC+BtRUJD0PFjcoiR8eZ7GCV0PfsnErg2+VN\r\nTI8olOD+9wsW8Uz8te4lL8jwEMmdYBTj9taj/wyJd6/RS3JcwdHEvj4BePAM\r\njTJHO5wpMYG7PSO1oWpHz4z5abBL8UBZQiavhneHQIwsRs+taNcmwq0zzMfy\r\nbnGzGzvmHpOV/IVeRG27Wo9vptbI0qkkqTgomHP4yKhm2aIGTyn56NXgZV4t\r\nwVqfrHD3L7DT/1XYDHz1aMkdx9FYlaet4cE4o806BIkpqPKkdKobZ9u19oNk\r\nS/YX/jonXhBuhQOubAMP3rELX+ez47LM6J9EOCu1ms8ypGYJ1Fxm5dxANOpY\r\nCEcld3eq48i7dVx9wkmkH/YVHMvnEg/vAXSim8j8fB1gIA+Q+F7aWiY3m8yq\r\ndz2NozKPRwxhbNTui0ooMynHU4gQ/dlbgIY=\r\n=bwe7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCIEco9Nx5TFZ8WBwLLSmjoZETsvZuNydARAMZmMBWZHZ/Ah8I+THRTUOT404BVbcNNv3xXqIEjNIeN2x+FCINdxyB"}]},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.3.10_1648612640380_0.15439508340118135"},"_hasShrinkwrap":false},"0.4.0":{"name":"@flexdash/node-red-flexdash","version":"0.4.0","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widgets":"gen-code.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.0 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"e3c8822dc88908441e442effd512441a39228036","_id":"@flexdash/node-red-flexdash@0.4.0","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-8SBAZR0IaqnFa3Q6BeEtAUSH4lZ5klYZ7eJ8Thwu6PCWyq0iP3RNqjwdgiYPL6cJncF3zgGnBIWl8AMsMJEOZA==","shasum":"fe6ac5de62f4c0d62add3ce2cf6459170f5180b4","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.0.tgz","fileCount":83,"unpackedSize":5821660,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID1gXLQ0w88fvdjv8Vf56I/0Yj+G19odXjimhbWJcSOLAiBulkw2kR67Eq+hS8y1TbIvtWz7aXC/cbY+KrUnynJU7Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiSSzeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrFXQ/+JOXyyhdskGeqWrJG1OjrB3PMdNHHH5WxiJHMSPf7Ak9fz+z1\r\n6BgxgVjOz6JQFLddiflzfGAZ77FoFoo1OFGPfBUHSOqIHdHnXjsBnjH8c4U+\r\npuwufAntiVUy6MMSUehBHfiZ+8hMAAHBwAA6zRtDCZh6k9u+jgnlEm63u76m\r\nBeTZsg77YPWRsLi7WG7vgfiAF25BlKIrgbdDG9JJirtIMzTWncVFPgwu/bm8\r\nfjhwYn81u0tzq5zivUP6yPuvyXguKOBW+cTg2qG2KfEy5RCk6JKDLTjU3fG1\r\njow/iBQBsn36Bn/SyfcBeqRV1XhbWUo4b/4f8MZGPkl40Mf4JkmQFHUc6rhf\r\nFglXjv++U92930aIosHy4Vrh8ggzxzrYr+otTtRwDreGGiXg6Q/EQP7A32c4\r\nLqngrxicS4N5WmuLlpmxCU3qWU3s/68KVoeJvdeexq+QjndqVKMMF+AU9Sfn\r\n1Z3df65GdlP3et+HAMwQRDg6S6H7DgZXHIQ09nROiH883ExSZV1WYHbSY3Ox\r\nFTtpFOjWuVfQ6lJ9l4s8hkWITLAES2wt4A4DxMmOdxs6itZJ2BClQeOgQhUm\r\nP+3QmJD6Zl5qMHXFI3zIw8dY+1VgPa4++toL/3e5FT+kejW2XbsSjz8g0hvJ\r\nh7fy9FC+mEigDB/f2QMbC1mO23d1f/nbcCU=\r\n=lfg/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.0_1648962782460_0.41626241548756204"},"_hasShrinkwrap":false},"0.4.1":{"name":"@flexdash/node-red-flexdash","version":"0.4.1","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widgets":"gen-code.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.0 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"3abc90241b9f7521c0fda5cde19ac954140f9baa","_id":"@flexdash/node-red-flexdash@0.4.1","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-vMTwgwfTePVdnqCTzjcbXUourdrMeAi4OCyUhP8w0tFLgoM8lNdon/wWOHptxDuYAAiceJxZreXKI9en0/8rcw==","shasum":"71287db52f8b9d760371c62f13fe8722f31be57b","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.1.tgz","fileCount":83,"unpackedSize":5821678,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA015SkJ7beGrG6yQF/+gUKe/JNTTogPv2aXoTGmc/W8AiEAwyDx3UtOw6ayZn1WtwISteG12bfvAP+HYfepjm3n4uE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiSTUmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp72BAAlnAXBptihfuV8R6/ktUOdaCE13zXE7XrSaBxPUxnf76sNTIo\r\nkuN3WDiu6sAowPhbH6QYPo4Em+bBAQiYefMWJSC1HAfuLGyqU3pArjXhVjXd\r\nsSnhkEzgX9JPrPz1C9wnjnZM/XgQHEcJ4qEW3IJeVK2r8FQXTPduRd81Qitg\r\nybHS1hYNV39Gx6tK04VVZGiGitbohAmibeWHoiQVEGcbnbahsAoZ12ZE5xA9\r\nNGGCqlhgdIGaa6u93FSezK02GS6QZV34pWkbXR1hMlxo9efB6XH3IiP7zUT2\r\n15LQMN+5eWbcVXcaZseNYaIYLatAWTW6rZo7tLZXepXryAfgQwKhRoDH0Sjm\r\nHLNPpBYP+7LM4H/wRgl+zbN8RYgJvfE+jpQDScAHZLI9zdJ3s43M7AB/wV1q\r\n9B7FxdIHGEYmFOTpLZz2R8iXegDf/oW+3GHNvEdNTqLF0c5i9eJ1hhejhLHH\r\nKjM/8OXot9YTDAv22DrluIhuATk9JanSJCmmmrKXVzjLsUKI6Xwyl4hhwM/d\r\nEy6MHS/wqvueGeFuxgm5AaAZUpbR/bphsfpwISAhhXguy53VmGLI7H25tCtE\r\nLCoAQD4NerAmedLEexsEnS1fkC+6iWCLmEWLFMqCFh3ZrQGYddlBxrsleUlm\r\npQm2ev9VrK0tkdu3jXPFF0SXtAxgO999R14=\r\n=39UF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.1_1648964902357_0.5434628943313697"},"_hasShrinkwrap":false},"0.4.2":{"name":"@flexdash/node-red-flexdash","version":"0.4.2","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash config":"flexdash-config.js","flexdash in":"flexdash-in.js","flexdash out":"flexdash-out.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.0 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"0ea5eca012283c63817d910c965ffc07ea3ffc87","_id":"@flexdash/node-red-flexdash@0.4.2","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-QBzSC2f7I8xMN0r+dfs6Bsbanlfinqoi1+V6XJGfjmeqYCBdPPIsxmpMgZwWPbhpFUHx5j6qhdagON6mB4x/ew==","shasum":"61cdb854589e7b8f78a1af8c2069cb3e875783b3","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.2.tgz","fileCount":83,"unpackedSize":5820746,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxoGpd4ZvyRET7+sg5RbWUw+QMPQ2+OHGDSliS8APCAQIgPzJLhCkA1sUK5oSuJgt7p7v4JLrqStmwphXBjSO5RQA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiSj21ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+bQ/9Ey00XC1rzZxJXf6hvPfKapBp4SOVpenZUeL6zAZzL0igHE4M\r\nX8pYk+8ghLR8Pdj/Dir0Al6/xycmBnS3f7RABgtIMLNCbzJsUYrCZW9dytJI\r\nRB2zl/n1s+O3mURvuUbIgkBOtZh56XAEK18vocBPkX8rKlV0L/wXmk+gb2ol\r\nHChY39ImMUXZi1c8XrBHhhuXDk6KKcTL64mcyFmL1jSxpt5y98a+BqfN2Bf/\r\nwCFUCKJYkjzJIwVkQo6MdABq7eU3xxYVqfb2uNSk9JLQ6Y5JLw7WOBbKC3dT\r\n8u45lOFENm3qckacZxvgK624RhxmYToPqkP6R2GQAtdmROqXnHMWHimZky7Z\r\nloAOp+ypcyEe0nmgHnDSKSgqUrZ6Ino2K4DskGL1sVQKasxWlSU6F/kGbvxY\r\nDLLgXs/wA3zarqa2P9TlqIQO3SG3v8/06be+85sURA2+lHAZNCjmn330bp9a\r\n/sK/C/fcfCFC0qUuuK+ZsTZmQhTqRyDU054kcVZcNFox8rqqnZWqFHDI+jjk\r\nPSl0+iYbZC1U081rsFbB+A8KvEMRbMnUnkNyZJ/3vUroOaWgsRLpV3cYr5yv\r\nRXN0uDyIeq8cVjsEQulpfhtY1xlbelvofuXAQtLisv77w3ExhRATYwqozC/U\r\nNMDQoZOYXC+AuNW8SLlnWh3dG3iGxFbRQD0=\r\n=6Y1T\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.2_1649032628854_0.8187504936063883"},"_hasShrinkwrap":false},"0.4.4":{"name":"@flexdash/node-red-flexdash","version":"0.4.4","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","plugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.2 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"f1e055a83b772750af195e136a061cb62b117c32","_id":"@flexdash/node-red-flexdash@0.4.4","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Uydau52/ZUIatn0O+z/IiYt8bVC1gwuVpxwGHuH3EA87zslF6OEXnm5AngtbkShT3azKVmVEXQ89qV/8zwBTZg==","shasum":"79b8fc553a4995a42f0d4028e72a9c9cd440e0d6","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.4.tgz","fileCount":88,"unpackedSize":5850287,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFk01LrjjO7wWmaDNOdc0fiR6PPJakZ4Z/phzgFwp1fkAiB8W8SZKe4Z9HAgK03YBXaJD2VxdnnpjB9ZTJn018/H0w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiTzb8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmra2hAAicUM2PQ7rFW342bFSpAleoKOiJnzjy4/jR4ydfF127Iq2+OF\r\nb3F1e8IJaL/oRkNrAVr05xwjLHXrL+91fwN8Ij33pouHD77jSyUqTXLwuTor\r\nnLJbgBb0pB1aao0azM4SU1jdI9kd3cSq+v0bKfgqCjcKZchjD4b1fMqyvGiT\r\nBsZTLjBKA1zyNnk14oYsjiCH6152Zi1MhWH9hwWw17c03Os8zE1L1ftyDRPa\r\nXqs9hMI7Wm4locL98bb8hYr8aeRCCemH4LJyBKfqX/CPHy/XnfwdpklEZ0ng\r\n5c74EaFO4O44Lq+5H1wfI3wXHz8BxJctYfPUdP5wHJ/9Yel5VZlD+Naj7cBL\r\nrBhv//ug1NSTfyuNfgC5HqBNN0kzYH2RoDwP+TsjKy2rqZ8zwRfBBGwaXbdQ\r\n5J7CJmHC8RLotSVWQQffa7Fhjop+7YCuyWb9iU7Aj0strG8eN3rstmq0GBkS\r\nArgePH+ZM8jNC2hS2KW5apkZSTkVM9BUMvvcoHxhmdLOO3NjxnSjE8WqwLVr\r\n/yEliTQiveXFsXwRGziHIuyBGh8Rdofm1k3uKT7ufntYvoTRrAsY5d3dp7Qo\r\nCmmTcXy7K37SgqIwvfPN9EyXMSUU8oRXy6bX/hHuhwdAiZB7Upkhk9K+vi4C\r\nRceR9o+WM1QoExW7Gph9RJ4kP1vicGxLQj0=\r\n=b6cW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.4_1649358588447_0.3246331766372499"},"_hasShrinkwrap":false},"0.4.5":{"name":"@flexdash/node-red-flexdash","version":"0.4.5","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","plugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.3 && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"d0abd074eab3506b2f89c58e61243dcc6f9858bd","_id":"@flexdash/node-red-flexdash@0.4.5","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-gr2gkoaTJogfYy5+Zhl3K/AAff9RKqT11pvUxa5mQtWLvkJOBCwIDtgjskEFXq7kXS2D90WBNOJ88ymuLigBrA==","shasum":"c404320ae0b730328bfaace2c6278ba13d9675a2","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.5.tgz","fileCount":88,"unpackedSize":5852463,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxelwE7RuE+xDIkO41XFcEzhzGQ84EIvt7rPuwo6npiAIgT9aa4gJm1z29C3cjAoc4wrCLd/qHyE+/bPRGGGtpgmM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiT7gkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpuXw//W63kw4jy9AY8gtj2mgJhGVzXTGnQdcehxi2SkXujI22d8H6S\r\nO3WBJUpWROKJgeFMqv0p4qw/m3j7Sm8WxrB5UVWuFvlGrDk3i1AffH71gk00\r\nzYr++R74H+xzZA0HUzi/dDsvLtJwhiLBS9FnOUhsYdU5558pm9jE2s8IbYQ7\r\nL9OoYREpc9SSrJqHZ+hKY/vjubwYono4aPj/irNmhzibEAJ782c18vVnEOo+\r\nI1CAalUCVimONm+hk5D14HV7tDw914SCosyQ1hCWhuyYDyKVGh91Ky5MajW9\r\nMJsh+OaopGWN2SwsY1o+APL2+1ldOb7eJFQKRphYJmBlgNJtaiuZHC8F9chu\r\nXNNCAX2/7yuYJJOEnXNMoOch+X/jMf4GoXRmsFtEWLGN6zD1gnvyK123+lNZ\r\n6jugLkvKSwGGraU7rQlTVk+ig0aU373ZA0QhXO/SZVlFMnVhbWECIR0KxII3\r\nT3Y94Mw3wRmhXt+Y/ZC0k7/1Cr3A6f7wu3/cPQpzlVwqd/WsUpxulJO5a7+R\r\n+ebIivvlpgRhnP3FWwT0jcf0lHXzMQbDbWFDITws83DaI+BTAitBzuB0f17K\r\nS6g52vneT4TwLMXKU471GBl4c+D4S8kia4aP/3DlIeHZjHuFhKfuAPN+KRWr\r\nGfHdwc51N4tM0y2D2M1RQU8pGhseQzuAs50=\r\n=EaHb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.5_1649391652155_0.23852946210890957"},"_hasShrinkwrap":false},"0.4.6":{"name":"@flexdash/node-red-flexdash","version":"0.4.6","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.6"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","xxplugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.3 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"d0abd074eab3506b2f89c58e61243dcc6f9858bd","_id":"@flexdash/node-red-flexdash@0.4.6","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-fawZ/51DTQcGgfl+SzylfIout8Au9s6YVlv6JbwedWJLILpV5BJRHT9be3+vUARBf5VI+OZ1jnzFvBcGhF0Jow==","shasum":"98c9b79e1b024cbe9bc9ca2304aec1fe43141e9a","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.6.tgz","fileCount":86,"unpackedSize":5840728,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCEdmLOzF4CP2JxeX78QIT0o+zfRJDIspo+rdfqsfmuyQIgc4MXFz+5/RWmTMISAiB6knoZ5Y2/3kR4Kq1sIV/ZNyM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiURQ4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqrkw//dY9FCoUXfYysbIzBaRME2t0nVR64CF9b2W6mkxDkVqmwFhJB\r\n1dJ678HKjlSsFjordRJ+rz9N+3G9Xb+5sRcAu0GU1DLVvFy3772EqZZDkrR0\r\nWip9ziGG+HqYfj6/5hxjVuB3jb1gSAdhEg1Ve3K4pmZN0m+L/TlS10ypmHxj\r\nnBQv1Na9zgmclz2Uj3ZWHAQK09g3/Q+8eCWTtxx9c/qwIQiBFuZcuW5cP9D4\r\nhA8Z5Q2mvcUKCXfzt7tbLzaiT+t2CbIkhiUPw19fvR62lil6D11SibxAzlsd\r\n8thCuxjJ0IkyUe5hFZtsdJPCrS2ss4GncQ34DoPCEdi0JOH6PndxfJXKAZmw\r\n0TrHf2AeYoBArsa07nl4fOA6Eingh6f7H1VtiRk7Ss2z6ymrIijc+63j3uho\r\n4d6and2eUnVxa8ZOvp7rBFtNQZx/ZE0Na6Oxu045sYCwijO8zispMIvkpsak\r\nToHj8qZP8imnbbmfXezImwPt62Lmo1a7I8LE0iHDig2pAOCmpQgjE364ULAd\r\n0F5OcJputUcEFSxTBiVNyOqrUF5EiwyGKpBqH0HN6EpaZcSJFqMCGgEuhSSj\r\neFJnpImk7oF2qaA4+JISNoay/V2cUrWbEZVYLaaRF5v0entRJQroRKGA+9XT\r\ntQRFwuEiWm73MD0ErRL7095ljHyrPzUzxNI=\r\n=+Aq3\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.6_1649480759777_0.17340779406113205"},"_hasShrinkwrap":false},"0.4.7":{"name":"@flexdash/node-red-flexdash","version":"0.4.7","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","xxplugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.3 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"d0abd074eab3506b2f89c58e61243dcc6f9858bd","_id":"@flexdash/node-red-flexdash@0.4.7","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-vuiOhS0maKSKRWivHyaLqd4gZHfv2v6HGdsNQdh/gFvdhHi0sR1QHoYIfLulVTzbU3v+YDpQC4TQb0ifjPBsoQ==","shasum":"3c90d5aeccdcbb6b02507d0ac29989397c3c39a3","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.7.tgz","fileCount":85,"unpackedSize":5837876,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKaMHFKxLj/ilOw2HWDGVkKE7Jx5ilZzU+rJEHO89xUAIhAPhhPO3uYNDpKsVLkdAYr9eTmhIuwhzrR2neD7ez5PXF"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiURSwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpG4A/7BRd6WDbRdIob0g/jh0vwXfiRTocxwx7bq0l7gxqmK8NaIURG\r\n/Ct3hkWKbFt7I6AUc1OXPD6/bEC0kc2GTDNlXGhsC3fB6Uc3Hg8LwIUGdbTa\r\nTJ4gIRmiY10zjQqIgrLZT4Ii/KZllDeiFP7JlgrGUS4bCpOKAlZiQ7hNihCG\r\nnawE2xMltGMK55r/Bos5T9kvZVq0JnUk14TdUHu+UpCYWSuTgiuniaZtaf3y\r\nhYm3L4Oi2WfEnRlpUkWh1ZJyyRxLvlS+nTLNu3ww5fSdlDIvs+wc+aoNa3cz\r\ng3eFmYbooS7ve8KCL6PxcmgZEXjq8oRcv4YtMXjL4EGyA7oR4TX5TqL94c21\r\naL46hFYlrSnVX2ONeWB7gDELY0VFjv4k73ou3Csx0hqTGiD0707jtAQ1/eza\r\npgcQ9Si5K/GqsLXgF7OmKdfk89fTeS8k20lRI33PQMH7BxBi3k/QPV2/YNBO\r\n67KzXalmY1ks4HTSptTx2t4+RoLyzMDHJA+ph5OoiWuA/BI1mca/wwmjI4TC\r\nyzP/qFnLxFKyYuO0zBSQ1nEdLxYcVOLhuyW13WQ5wFXoWIMgrAmEWvNcAhTY\r\nMKU9ZTC2AzdTLtK4KnvVWXLcDhLxgK9up/lvv49xf0BXXkHBXLEw6PB9RtS2\r\n/NoGx0OHgpzzFF+gLgLX3xkPc2OjZ7DrDRQ=\r\n=l9U2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.7_1649480880613_0.4894278664755096"},"_hasShrinkwrap":false},"0.4.8":{"name":"@flexdash/node-red-flexdash","version":"0.4.8","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","xxplugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.3 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"b016ffedf17677c77b56aa99d64f83ec9f9538d4","_id":"@flexdash/node-red-flexdash@0.4.8","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-tvDBKJiMid9P5Ir2NQTkPNf/BHhM+Z48p/YAGlk1RbWhTl3TkZzto5gKUikVSjzuKQE1Tqg6EqtufyO4Sctt/g==","shasum":"0e001421189d791066ad6743ac5537b41dbe1bf9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.8.tgz","fileCount":85,"unpackedSize":5838618,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbcMDvYTEqvXw3EwuowR3DBmH5COVT7zypKlntDLKfyQIhAL1R9vKSIB9Y7dehPlNw1SK9LQK2ASP1GuuZVuDSEsiO"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiU2FUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrPJw//Y3J6A64tUi68lp31ARb5vggZNZsIioJ8ptThFYHsXUF+Tu8r\r\nDdcvHZ4x5lho1qJlOmAelVwUHW06RT2NFpSfKEv8yXl2e6ufewOpIaaZlau0\r\nwJ79U2PaIqC7HK2ItZmZuGgHml4DdqI37fLO1R40LguLTfA1T8TyUtgg84WQ\r\nlRzCr3frH2t8+Op7KnOgjXVhSntMBxWe6pCThVa7do4ONF8D4RRZMAX/Ol4U\r\nRncs7+ZK7EAUTFfaYtOd8QGe0C3MqtggFdfGMPwrp+Lhqy/LBP1MrQEkCK1w\r\necXXb7yLl9SXtEPEmKo2E+ixFVMWjWwMjdtChKLwitC3jxbOeeXrONP/LSuw\r\nYjr/vUwRV6nTiqqkdbUoHzIAe2amP7a1rRDQTrqw8bIhJVCr5P1E9UVR6GyX\r\nsjfnUeFI5Y1C1LL5luwXM0S6a9oYWyM5wi+EQ3Q+85OoIi4B3LRgE8j/Jd5H\r\nkiYJZtnsJlbbPGhH2WF34zYfvK1OU2oteaLnSb9mDws/8J6NGBDC1Lg/b+fo\r\now3crcPimRa2y0Ced8/P6tCD0Ku7G/gfaXe/o8UmgTLSvSgQvS9sU/2P1p7s\r\nrBmaOWaGmLr3f//vlVAD0LX9NNJxS8hT50q7ZpRg+a9ziQmPmhF9VEEbv7h6\r\nll7oOv+wYyab6ytKjixz0h+HNxfkVW2OvHc=\r\n=GzGV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.8_1649631572666_0.836079229971769"},"_hasShrinkwrap":false},"0.4.9":{"name":"@flexdash/node-red-flexdash","version":"0.4.9","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","xxplugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.3 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"b016ffedf17677c77b56aa99d64f83ec9f9538d4","_id":"@flexdash/node-red-flexdash@0.4.9","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-ss1b0P+Gpil/Z5nyd27gwyKmTKHlwtw48SI2v4iiicqdw9fFu1OTf0lvxsxl2TzBaM/kCYVR6GceI/UmCs/A1A==","shasum":"9ecbed22f229c8dfcd4aed4fed996aa6021a31c9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.9.tgz","fileCount":85,"unpackedSize":5838618,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCUICWs/cgyATbQIlGDw6CCNb0NiO9t3b7m+5PZm+l15gIgG5Ggal8Ep0VqynmzRixm2ZHFl+gQxEDOOONhsXGS61U="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiU633ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrnAQ/5AE3JT1EDMus7ZB66f0WMBfF2be1h6qb21iM70Odpd0xddtN6\r\n0G3mwDxLdnInyh3Djz9hOYIkEz4PfT2YcoL8C8XXMtGHxwse5hFB0GFbTxr6\r\nuDX0/so+QrhiOWle4g7l1jKL/rTzeEiw/7Gpem82kZHp/JIReZhVGGDdSfoP\r\nHWChLxmoD4uoGgL5tC4Aji7NxH78OwvLBmIdDUf41fnUjPIPDrZDiRuyQHoO\r\n+752SQn/GEZU3VMsdIFGE3GkCTWEGvCOngyMPDVWgNCm8/TAKHPVxdON4dnm\r\nIUPvqeoz3UW5yaTYrsPvXzzn7Pa3LBMDt8UIgbttrjCxGySOCSFEzF6xVy3p\r\nOoyNHDrhBslAiBGeEuGCps9dX2hfBXg9dvvO75A3dqJ7tIS20hCs8ziby0nz\r\nGnC7IZOwl8IyX+aIYh/3b1huWi5ROw535fLWwHGLr6yDs8w1fM6XNl8obPpx\r\nzE5UA7oKliDhFMW3zkYkjm3ug8IkqqdUKS3fRFnazl6FfvduE3V6w6UI2bj3\r\n788GqyO4I1XWK0APYEXAN5ec4RS/e20rRtUOui8+iC6ALbJ/WyR3XRV+FaxL\r\nyZw8ho5HKDLUepdyrsQggIFdnJPJmKMeBAPFk0Qp641tkgSYgkOBPJhQ6KFE\r\nCEeockSl0l3sBQGDJ9PJdrXXZW5iZxLfrV0=\r\n=2f/Y\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.9_1649651191058_0.2814567245400479"},"_hasShrinkwrap":false},"0.4.10":{"name":"@flexdash/node-red-flexdash","version":"0.4.10","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","xxplugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.3 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"b016ffedf17677c77b56aa99d64f83ec9f9538d4","_id":"@flexdash/node-red-flexdash@0.4.10","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-bxu9DucDRppZX3aTdbnGNr0+TgKjTj6kD2pmnmUETOKk25jloPMyl4p8elI5eidE63MMj4yoqpVT9Vl2nO3dHw==","shasum":"5e7068510ad4f893789e5663e414865d8ae0a9bd","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.10.tgz","fileCount":85,"unpackedSize":5838619,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDWLmut+2HpmJOFiByrpcLU2UKectUZ+knjmMVsP0PdjgIgWA5+oh5oR3N0LRG1/IFr8vzr8bLJdil+AMiL9mMttxU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiU69NACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJkQ/8CA3NPuyi9hOE4nPt+79aYUlO6eIouhGDgV/Q6e/Y9VtJ8ueD\r\nxE0mvS+Cu29Or/FyNeib+5B+MvfhMOt+WHx7izdPMah2vqp9/DbJ2wHUI/q6\r\namin+R8rf5iQfHtxvyYauP2PjqpvRblkhDXFIrLGZ2DcoY+PVAmRwqunzJAZ\r\nMIFgUZC/IpPbcd/JH0hztctNUV8XJkIGWSKZ9MEWzZVN8+xJfyyFtbjUlOQp\r\n+pDixUBo2Ce04bjsw4+Vz7qdcvEhzcXKdsdjN1+96dCsI9UWfeA+eFARLxKQ\r\nuwjhlH7pEfx+Bqk22jdyo1DFKQM0R1m4Bcv23BxFauIkHoIzNfFcivibStRe\r\nQ2LlM9TCmgahzE+U9BdwGahshU4ZgxX1VcxKb/zvbHKvjvnVr8+mHZ3s5ZCn\r\n/gqIYcYH+JqATaO5Q78LG9S2cFf5J1k5EWaDm/Fx9Jziy+7WcFgohyZKtw2f\r\n3/ps+ifEvCSZBAe59XmQiHib9HDh+HKSN1o5ZbkIDvognKr9OqMfSqB3Fxfr\r\nrbhJGsW29bhCyVAUvZEIZ+4jrGvk73uu/nEnyAuuAPLFl0k9xc4Ou+TGsdNT\r\nh+fw76FEC45jS/np8pAxLzkGkCTz5Ik8fgxbWE70YvjBoFwKEOFMfbhHktId\r\ndR4a3UJNcE3CQRqf9GB0boRyLnNo87MQzqY=\r\n=HaMI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.10_1649651533021_0.6623491413623648"},"_hasShrinkwrap":false},"0.4.11":{"name":"@flexdash/node-red-flexdash","version":"0.4.11","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","xxplugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.3 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"b016ffedf17677c77b56aa99d64f83ec9f9538d4","_id":"@flexdash/node-red-flexdash@0.4.11","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-LTVracsmxO4PQNoJDe6ao7+aLn4IwIgZ9q41WNt2BNSoxYRU2EXt5446g3qIdarEM00LAiNL0imYjuTnHBdnbA==","shasum":"13c7a3db162bbe47a81426c545a651ed01bc0951","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.11.tgz","fileCount":85,"unpackedSize":5838619,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDehxGpvbNGEy3AE8R3VCh/gQfLVHIbjqqoGTxtqjx6AwIhAPr97awoZ3xi1zrxSyWMBV24piVXO0MEAh5Je033oQ6Z"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiU7TDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqC/xAAjtLpwIvR6Wwt2HEc1KMLWY+40t21VOR/kfpIQxxbwYOZ8arS\r\n6diYtl2/U2rtS4gH/NDGhfvpSQ0Z0vrNKW9vB4DEcMiBGwnYVBcC1pTlbn9O\r\nf01W+CIx81DNcc14IC1R/EbtphRyiDDx2FcZryDcAQDxwqJurduBTXuG54YJ\r\nKD5/HPWpUcknpxq/R+4/NrupX1KjVyQSobKCb7r925itvc5TlAmdorovwXfd\r\nsZNq+gmnn04Hs80sYSa+6yJe37z+y+KQ//zcAqLQTv4zXMyPAXt9ZbVC6fa2\r\nYIBkpX/AMEJz4W15A03le0ihOVfWGXkVOtY0wxj11b3bSnkhiMysuDo+EtKF\r\n7J34dRAAWRRXJ3EyvT9hdm2xYe0k0B4IEXqXcWK0BFQKnd6fQuR6qw1Ivpx7\r\nSQAWEVhBzrN0XIR+WS1jnjsCyLjeR7tn4b83VVfhnpPVollGiMettZCkuWyt\r\nhCS1q8adDwZgyV57wFhXYd/dSLmj+mCJpEGwTg/g7uWm6719TMjhE9x5AMi9\r\nGl7rKuPKdKyxkDzjO0nQOcjhT4XUCt9jgHbeoJIM79DaX8+NnCHU5ucnCXLm\r\nGLW2GX5X6eEvmdoce85kNv7R/pwrJc5E1Jng2GFdVUg7Dtltm5b4BZn2aAgh\r\n1l35H55rvWewjX599IjyPGmkroTMC0pkw3M=\r\n=q2Dj\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.11_1649652931088_0.8347997339844442"},"_hasShrinkwrap":false},"0.4.12":{"name":"@flexdash/node-red-flexdash","version":"0.4.12","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","xxplugins":{"flexdash":"flexdash-plugin.js"},"nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.4 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"927e8b1c027c3b5af74d638d8e8342606618bea8","_id":"@flexdash/node-red-flexdash@0.4.12","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-P3pbWrpcLqEeiEAkHsiv51wD1TeTzjNoVbHStyOSvOitC3Kmw7LRgvJwmwuOS81UBWczqiCJQfhf92+83aGHWA==","shasum":"7a49332c5d46455c19722398f70d21ec79a5967d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.12.tgz","fileCount":85,"unpackedSize":5838629,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICt9L3OEMuVXBNWRhcyYvi+f5E+uyrObAz5J81SwGNVYAiEAtvv2fA8Cjw07UaSK/00MK8gQSqbHmq/YnW3wX2g7qhs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVHA1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqRNQ//Y0awXAK9H/ABn2xM6+yZeGKpx9N5LfOxaHN2/Ecmac0PkIzd\r\n98CGzITdqJgdhklTmawSPZreKbqe8knU7jgwzpkdMzSgsxLAA3SUZjVhkpK7\r\n0FDXm35rN2ATdBY/sdYTZrC7HqZmN+drDOssHLLup3dBBJusfawfnklfnpTD\r\n7mUuB3hIQ++axlcNxI3cjexI1YvB9j3/ySQE4rDfODL6XFePyBpfw3M9apXs\r\njpRxFD6VTDaNyt8B+qU3cU0SVRvJms7UZI/Hm/vSpcUUgiXcRj7ilLSwWuPN\r\nj6DY/s4ZxQr718ap5lvou+mtFG70HxbvNV7v2vGCRIpEH9b5m0qjFVZVKM5n\r\niX6j7ploZlkLhgNF7XQJmrRHaiMAVYl65jbaDiKx2g17oHWhif5a0ZVjQCwn\r\nGn+TNCu1J8FoXzwrM1SauwCZV8455ISG9EqbBBDykQBZfkUvyu9OzKnlG275\r\nJIGIbI6sQjzUgdF+D8TZ3/R2WFod4u+1vvcNuHCNKe70meMkvXgPoDjVDskp\r\nrLBgVu3d6UiXYGdbyu887i9zHQOPN/mfXpfsRpwjAbzO2E7U+Dod5NLzl5fq\r\ntW4F7ta9sxPHRzbixZevsEB0Y/5pe4HXEAeFnPZmWYZjVSgjkZ9zN6jmNpzh\r\njJT9MBxpxZjRrwVhpF0rmRN8hpiVhi8q8UQ=\r\n=O4Ax\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.12_1649700917016_0.9553624309662678"},"_hasShrinkwrap":false},"0.4.13":{"name":"@flexdash/node-red-flexdash","version":"0.4.13","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.5 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"5ca6304303c4398d10e0fde567b58340c0151cab","_id":"@flexdash/node-red-flexdash@0.4.13","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-JYvyLm5xi7xpT+mysWiwZvJu6V9EzuENtAjY/8mMhXs/UIVI8NMLqjgZWvFTjca2XyEewjXKDjsWbmGNEzN2QA==","shasum":"0caf3ca7e4a5531951fc578bf9d5a00385fe89d1","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.13.tgz","fileCount":85,"unpackedSize":5837608,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBSqYmSoeuPuMwbntDN/P4sS/OuQ+ZEZgG66mMfy/UhRAiAsiy0IQ0dl5Z3F0DNxT6h6BaWdNrDoDvVNSbpKjut8vA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWjdmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo8yRAAgCjhBYe87EyT0f4sWNPHrDzi6iFYzqXQoeTAoVdiULXajwp3\r\nvqQojI/79KNXgiBP3KNopvl1VQubgouy8N2gqf4dPcXNd53b34o4h7r87ppz\r\njsI3a8QwOAjhiA7S/9EKXwebz82ABs917OqHfQyUfalbfci8qXDUDs5ONX0H\r\nHKpICOoWp98nedZhryRIzlA8N2fxpnkOIxYpjpfmzJ/gBtTK/dRhUNcnpb37\r\nZ1X/4U6hxvhGI3tem7Ttj6H26KA2RvrkT60Pmp+QyS0SOY4e1PF3/dhsWatd\r\npF5De/5pWtDo7P3Xot0DqZyaARJUxatcTzgCtNzNHXhITIobUVKISdMdCzLY\r\nX4eYuI/eTxe5I0kF+a0WOwOSCwF9en89dH7w67m9wUxVxvfFoybEjSHTtMlv\r\nFHNmPDnC48BY8TBqEfhvQY2xisLlpOORWtXi1Y6ymvqNnpG8w3BWh/c/JtGi\r\nk9viW7Tn6ArcZ0CL0PsO0wSsTaAPDVQGYczcXfEJ3Te9DBvG8SRU2qskwHvI\r\nQYOU877ljP52MyhswuO0blzxZlUv9qsFLxTYE1e/enylMUNcbyL/Mai3pRB2\r\ncXEm0ikOFfQBA4UZE60kZ0511Mfsbg8GlzXvXVb21s/OhPbXB4sUwuZrGswg\r\nA0+MkWq5J5QrRpjCTGlt9PEa2aGdbn136aE=\r\n=OFXK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.13_1650079589927_0.9456526216708521"},"_hasShrinkwrap":false},"0.4.14":{"name":"@flexdash/node-red-flexdash","version":"0.4.14","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.5 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"f5b6912f4045e66eecf4181c47aa906186ef824f","_id":"@flexdash/node-red-flexdash@0.4.14","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-lPlOun4fnlytDZMcg803jSm8bTtvMkYhyW3hTTyPruvO04MimLAgeQMFFr6HoGrRFhCHYia4TdcYmBfpIRwdSQ==","shasum":"5ca7197a41856e636038e2f5992c1dd75f7a4974","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.14.tgz","fileCount":85,"unpackedSize":5839457,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEc/pWOes6Twjwx8ZeoPcWnQPhiB3MsckKGJgc6+D4axAiB+VLUaLDY9aQnM671zSlvLtb6NfWCTPOyOjQKUXwu8LQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWla+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoEqhAAgx+2r5wWsRsyOQk26wCC1SfUCzZB9cq+3u0vq/aL7HYYps+q\r\nfCjs3pyOT0Rr70ZyxIlWGib613BwWIStUNbV7owH/z2HmgTJn47d/tI72B0s\r\n68NZTYviqtXtpA4CDjrOYpI9tNdWF6K/v6Hi9f+L2H9you3FSmgwabbwORDT\r\nmYgUYuwSPHKYPF2cE0LAlbKqR766+zWg/7GG4VmSeE5oFSxzMfOBc8k4qdke\r\ntjoQIp4wWbDPkZnLNz2ZPZBq9GkCAyr3oilLd5USC/azKZssxyovw9/aHS2H\r\n4cZKUsdFQr/two9GgdY8F8qoty4rxPIZSxh4vztUW3lrUk2raCEfTO+rXKZj\r\nVUDo3oCJzco+Puhf9swBQNaARRZ36P08wMSEvvz6AnGqqqf36SzDNpLZ6PQK\r\nhbXOLUrKBNOcfyF41Y+Vuo/OGQSNjYRPmemPW/6wEbbSu63Z36VHUuWoTzl1\r\ngyY933pFvhp5/xP6B87RjpyYjjzCDakql3D6GDMud0WFHyK42RlmOuDXCOjG\r\naLNVR/6kaD5p6Jt6wnWOez0ajw4rEp2SauXW4Vc7HbuTWsU909PoznBRNKm2\r\nAblt65tsKI4OkJWgyJsDjlWvRUb2B8NKY6Gq2QgUkiQpFpv8+J9NQNzNe1pV\r\nmEQJwj0PutWqHml5ds/kCM6vCp131quz0oE=\r\n=SNQ6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.14_1650087613938_0.7078376937424509"},"_hasShrinkwrap":false},"0.4.15":{"name":"@flexdash/node-red-flexdash","version":"0.4.15","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.5 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"254f055fc0d25faa146975ee3106545d241f4015","_id":"@flexdash/node-red-flexdash@0.4.15","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-pd1ZQd9aB57ekXDsgLl5FNQ5y+ArkarfHHprP90I3xjZ5yECIJeWNq6qOTU4qSu9eVtbw1VFJGRAh9hSX7EA6Q==","shasum":"c11d3378968c4efc31778c3e18702e545737db34","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.15.tgz","fileCount":85,"unpackedSize":5839457,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF7dvWLugcsjctQyVoKS0esFTBdXRxHx04tIHTKBu02RAiBC/FMzOjf1TPa33cg4WFVnpi7qWlaQz8RKpDZT2AboTQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWlcZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrUAg//cMxzNXpjYWIbWTfNaqTNiItjbmRFcr6NnAGwjqMfvf08ixaY\r\nuFT3qlFiXXHNo8l0CDg5f9CEjpjENtlrw4Mhqf0gec4XPvhuMKPUL4bGcvVf\r\nQsTK6tnrhQ2DqG37TEql+9iWf4+ITlBu9gpkK+s++oDArHf65thzFyScnCl2\r\nnWUh5Wwav0I3wOe4qZAHtClmW6emianXk1hrIDu3zFZPv8xG0CQYiNupNn+r\r\nvBfaYiR8YpQaAOBV2rYxUMELnps6F7TLCkGhQGpSbXhkA/cGTFmg7onMjIkM\r\nM96i8c047II3A35p5aFO7HQ2ZMMhn1n82SmgBL5EmZBXnvTUEj47EHcpO/y1\r\ngwAVkBKi8PkZYDaInzFbdiC6sMDAk7nfajKuhq8MkVelhLv+sRsVHsil7s+u\r\nlL8YETQaffhOvY97g5wDMUohOSG8xOsSmkobTjWvlQcLRcoODM2K0fnIl7oI\r\nKscO3zA9aoW38Lxw3rEPZZ65KjAcUK1LZyfoEunR/gOP1c0Etgck/MFPzy+X\r\n1Syk8NFL0AoZqoh2QSNUlwf1KibAsau5xqncN7lUCqenfyuWCQVtHcrtPvU+\r\nMprVObWILhHhanR3MLafekR/O9RjJIj0WBQX6H1fyKPEzHWix/rWLqMDAoYv\r\n5CUDvrRzVVsVRBFpfBD+Cp4wKrlAkcx14r8=\r\n=79dr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.15_1650087704854_0.03206712130576084"},"_hasShrinkwrap":false},"0.4.16":{"name":"@flexdash/node-red-flexdash","version":"0.4.16","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.7"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.5 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"39e77fbcd1b5faa21c3752d707a20c651e45e2b1","_id":"@flexdash/node-red-flexdash@0.4.16","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Lk7IlmZH5QWnMQIDhbYN59JHU/As7S42JqiPmfxPxDDK7Q7DMhTkaTv7PtHo737FJvJ8PIqA1KoWR8we79rkXQ==","shasum":"066cf1561315229c1412e839a9658319d1ddee13","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.16.tgz","fileCount":85,"unpackedSize":5839457,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBeNmVW5YGbvI+G8VrhvpsbngR+9m/s3YtfuCbnNK7ixAiAt6L68Z9Zz27W03hJI35dGtSDCYW/iaWD0GuVckf1OEQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWmD4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCkRAAlSOD7q1gltbKmDJ7V0PAggQ7pQFUWQtvtKcuWYqCZRiN5oy0\r\n5+y+nLkkL24/3IH8P8YCeN/b/DWnNP0mnZ1hkbCEb03een5xwpU3EydCuuUC\r\nz+crjB0q5CQyw9B1FxKhvDaljs6kziZTbLBfRnGvsjlPhd+XX3KDOr4ql3+7\r\nSGWFj1KKY9QpXTC2GB22mxA0uCaYZT57i4RUSFi/xbCIAYnkwEXfP2xCf/v3\r\nJ6d9DQDtU1u0Zan08KwllnQd6ZAkL9VljbEWxywPLOpUw7lS6+QgcqNX8aS5\r\noRmefRvgDu1lTX39KAQ7GwpjrzcSyTBTuLVfGo5d+UIgesIHJ7dHvdIxPItQ\r\nlKurZ+JHW0bAOuKpvBUOjfgiK1klDTg/8wTBJkhnMwcSlWVa+TUcJy7cRa/o\r\nFaE5LMh2StisD+FWfFmF1SfEdt3uaXe9GNmmo1XXY45UAeO9SjycKbjLh0ZQ\r\nv5AL5r5ID2NlrXnJiL70xOYOy/C9f+GmXGvchX7KLk9dJbnEsDOQVME3esU2\r\ncy09xKZocnEPhH0UJs8Pu1ES/oI79W5apVyT2E0Hi3JlAIqxOnX7i0NrDGk+\r\n+SdLaKw6s/aerQOxMdsl0gKTW0C4ghLO9/H4UmI1ZWC6p6u9G0fgt8ud6YVd\r\nfgLby83BZRjJFonz4qgDwJUtECYhl1WLwkY=\r\n=DrY/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.16_1650090232329_0.1460804466520531"},"_hasShrinkwrap":false},"0.4.17":{"name":"@flexdash/node-red-flexdash","version":"0.4.17","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.17"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.5 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"ccc0890d99cf7b80e04e072169bfe40af09927c9","_id":"@flexdash/node-red-flexdash@0.4.17","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-88ZzQ+TZO4ZaoRyYFRRy1d8pAezeLynI/u3fPgvN4btJMW0tmzzwRWlMyEtiEowafOSJedTSyBxQzrvThHQmYA==","shasum":"43dd2ebcd3bf7d67c5f43410535d94baaa700c23","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.17.tgz","fileCount":85,"unpackedSize":5843351,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8Q7GCfr+t7XJFacYvZONVq17a+JRoV60BcuFCWh0UJAIhAPGVEYkbK+Cvv3gxhf2RK0vaAMHuf9Bny2ERqrvnjUKg"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXkRlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrlAA//TrlgEgtF4GqQO6ZhxxdcKy9QWGeONuAiD0ao1KMJvOc1wEEv\r\nzxXi6AqDNX/f+ThLAkOxl5iAHVhlxIEDjAVRiyxmfbg3bbyk/4KvDldFflQa\r\nxTB/joOwO6iz8YxYGJW+VK1dEXQPPBnBj/PuNhzzujTg3GtM35Wx8N6efgUD\r\nLIkZUCcAfHt5N64fTOYclg0ki7P8YpmUAaAKlNdmp+SnudtpR0tjP5IGsReg\r\nfHHoU5ZRnE3g1SrVdPSxwWCZ8F7+jGSA/d6DlWAR6B9H27J9fhxa5pcmoBHC\r\nDkb7vRjfppX5Yeaib9RwzAnQyEIGi8L/YiuDGjl+57GRkloSs3+alTVCHSu4\r\nmv+WX98BmUAWFK+PRfPYqatznY3XnugH/A2NWs4GLXbbbvJZZD8G/5w7B1VL\r\n+yByQ/wq47uGC/zmyI7qnLj6JD723UQ7wUTHTenkaF+iOdaFPiZkejrmFssu\r\nQSOlAlAD0PjQRE8P6Q6f/qZOLaKjnf05o+QHKZLyHjwmurXARkownVcrUrBL\r\nr9PHoA98L3twMpEAy1b/kAwH74GRpHCQ1BNXT5b2Yw5q0oqb86AilLjkkB9r\r\nC7uBiYfaaA59VgDRwSI1p6etMY5haVXK+oR0HPWG8ALXRDINiBjcwxeZHQlJ\r\nhzWG/Jzr2M65WzPeVZo7SjdG3eGvQ077phI=\r\n=jzJR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.17_1650345061148_0.7408220800341341"},"_hasShrinkwrap":false},"0.4.18":{"name":"@flexdash/node-red-flexdash","version":"0.4.18","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.18"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.6 && npm publish && cd plugin && npm publish"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"ccc0890d99cf7b80e04e072169bfe40af09927c9","_id":"@flexdash/node-red-flexdash@0.4.18","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-0mdi7op2A8ufbTJAFnVIiAl6EvXRPPpr18HDdXbae3I+kAFqTWuY80bRWJ4wiAmcqQ8XiEV07YKMi3tbl6obVA==","shasum":"80112c6fa38b5d9dfbd7520753385312158f68a0","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.18.tgz","fileCount":85,"unpackedSize":5844267,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBcGGlkWlFc3ODjKft8Pes3oPpet1TN2+jB2M82QTmGxAiEA2ub5rDAzVGFWDzmys4Gkqul2QguUJnFlBUaEKz9/JEs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXkS3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpWGQ/7BP5HpqJRpU91HSNpI/MmPWqBdtOc4w6vh2CqzdbWltHZ2SxS\r\nOUcTrOhsDXEqRk2ViVCq86+5Qv+EuIpBA8L1ttRCZqFlU0Q0BhYWRmTwRiZx\r\n0k6wBMOoOkhjdjZjbBa5N+lhbNLgSWl+Uce/SX1zcOQT9IJhoIQGP4yAcr0E\r\nVTu/BYuh9b6vPzJz5K7zGBP//bYR3lXI4UlFfzIASmvV+S2/FBJkkCIUveqw\r\ni9DCptow6cNMQReIyiRChOjHi8u7/Q/aP/183RPWi+AYebnOTcuTK3kDR4Sn\r\niM1aenjzynysJR4RCjSn480wVM7O7txpXukYxqjDS0G24B1XkehLosXyESv0\r\ni4AoTL4+gHeU9Wh4DH6XBNkSJjcz0Oi6osdlrZgmDJefTQzRrnVxJvl5AyG/\r\n5yyE5ySEYqKVMzMyuWThnwIRGDq6w8pRghW53f/lw0MidCiqm3F72utP5+s6\r\nzAVfD3UpVC8ei6fLoNSIa5iD8oTo+TKSOiuaZZB334Js2LpTGoU3adxkKrzi\r\nCZYIc/p5A3yktvR4T9RVulXCyGulyIuf2i1Na6QT5d9J25I4zJ5PFYv8V+/s\r\nLE2nXHdVSuhA0PnVBzUYaGKjfP9UF/p1Z/5ajQxMLg3iiy13UzJ2UcQTst/9\r\nmCEi++8ZhLm1PNwxy7CGyP/lPTz7GGbbUjI=\r\n=Iue+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.18_1650345143330_0.37060432160382195"},"_hasShrinkwrap":false},"0.4.19":{"name":"@flexdash/node-red-flexdash","version":"0.4.19","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.18"},"publishConfig":{"access":"public"},"node-red":{"version":"^2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.6 && npm publish && cd plugin && npm publish","bump":"npm version patch && cd plugin && npm version patch"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"c724988ac3703ec33f6bb0fc21e8d2425dd5bf30","_id":"@flexdash/node-red-flexdash@0.4.19","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-bZuPPi8p8SOuIG0mnUVvPcAxo++N/v1iVjfPGaPclcK7le18/89Hgt+86iPmRIZNTz/q/IWBN6/ksQnHzHvXpA==","shasum":"238de5bb892416822b4393054e5ee2e6a367ca9c","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.19.tgz","fileCount":85,"unpackedSize":5845123,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBVqRVO/sQ5pJOVIyFBHbECQO2qsjiGGoW8KvukKZsmwAiEAkqCiJpAuvjPvKUdEH/517bOYmPVIYixf0PmmhyBAbCk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXwM9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq47BAAotCAP4gCIN64TVnwR4MRlfsz98HCGhCfSvkb+ChT6SzXqPOc\r\nXgER6+WDzQqOCDbFWnCep0qSerNV2OgE4spDFhpF/L6wBh6KFOd2i6TZyhUl\r\nCFW/F9Ta2BdLuENvua5rVIrl+LwLsbQnocAb3TBaoPLsw+fRC1t3Pa11/5WT\r\nXqx6l6tUKzcb7kfP0i1qKp383LDqPuvLwvK5xd38OygUzBvf7gLuR6BEu45N\r\nU3egRFKs1242bs2bCmEprJ3ZZBQaQpnUDpTzZ2O0UIq1rR1Sold3XzmM4EyS\r\nNUTwqHP90KiKLXEMVxhwDX+gGIAQJ4QIB1VL+Pxy+eWTx2ArhqHtWrKhrh7C\r\na7TocduaRP0+Tq9OYyCD47un3AeEIvedg3RzG2qpTKfEw0nv7K3oNwFX4PwB\r\nobNJrtCQt7r3FcOQ+ilbH4w3xqQ+YzaflMnAX0scEGDlA+tB63vMMTe62MhM\r\ni+LzFfiLASTo19ni3rduXqLCaozuq1/CTHp4mM7QGWbn+9tB676/K9wKVd4b\r\n8nUM6LlENLCc098fjbnGIgjBYm+MxDlznUXcdNvf/NQ77NJZ5QocG5j65yKF\r\nfXGLeZZv86URNp7e1/ksJGdsON5tRkhp+wMPqDpXumOovlrLoR6vsFgYavav\r\nTFcepudbdKdKenJ9LWEgU6e4wm61ORrBPY0=\r\n=pxE0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.19_1650393917004_0.7918681178033118"},"_hasShrinkwrap":false},"0.4.20":{"name":"@flexdash/node-red-flexdash","version":"0.4.20","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.6 && npm publish && cd plugin && npm publish","bump":"npm version patch && cd plugin && npm version patch"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"48baff7e9a019f93ffe3d73ee709ed1b93ea52e6","_id":"@flexdash/node-red-flexdash@0.4.20","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Qs7TTGBjKU/5+8wuI1kTJpSsRaoDr8zOdzr1fpv/EidiJryHpOQ/pKxoQ7cGqBloBvlVgHXXnvjlCSIREVWSWw==","shasum":"e9f770099773529ec0d5a9ceab83d75444008199","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.20.tgz","fileCount":85,"unpackedSize":5857378,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAEZ4CAR33WFCz1bGsmvl1rxiGa4b46sV+0gFCcbXc34AiA0mCGzJtu8WdouUn73L/FLmakgx/2FkzUpnrtVZfvg9w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJigvc1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpSZw//aNSlDrS0C+krfiQw7i1yu+WKv5396aSA9eYWFoIBmpu9izhm\r\nE1oiwGe9M/kAxS6JP04O9S5ZUTOiT4MsYqSdo/EzXv7eQRk++hKg4qlOlPy5\r\nYeD0qlKTSVYGVP5ercewHxyR9+vNindVaV3BbFxF9B6nxAhThW1ERqVeHy7Y\r\nAyKSoFhEKAmb2hj/fX21cQ/KaQiYkazimr3QPIZH2rKkyZjloInMDfm4w3V/\r\nq3sXL+V4BJ6eOmfwJPwoAtWA1B3L9wkgb5bbl0CjsmgUxvjTmylihj7BYTq4\r\napnbl35DdS9le8DwqMXaPxvkjZreGsIVjrYllklbuiNGwuvXy3LY9Y+7yRXU\r\nhdGTFdC0boVcUb2Tz8CvGExiUjRy9rOUV0pBFup/7Hwa5HVpylp/pUV7WfSO\r\ntRcnRKt251+3SS50/deeokaikCcKJFiDlfxSBP2DhewDnmQAVIe6Qv2kM28z\r\nAZogZWnMGVyo8RZf43HTtCruQH3k9bu/9JBXdTdKvq3pAz7sVBRS4yor8Xp6\r\np2uPxulAYSABqNqSe1Y2KQa0CSxZQC19wonwEn+wy8oblV1HZZ8LWqvw2A1w\r\n5C912QfrTBMe8KsQrdZKCJnhGkLet63oxBrCJpsS4d7Duak7a6zS49aBdk69\r\n0WRV2P8G7pqmqAPaf5meQP8INdW5R6xA8A8=\r\n=gYbD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.20_1652750133450_0.22394018755370548"},"_hasShrinkwrap":false},"0.4.21":{"name":"@flexdash/node-red-flexdash","version":"0.4.21","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.6 && npm publish && cd plugin && npm publish","bump":"npm version patch && cd plugin && npm version patch"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"65e07f7128f82b58e0f66814a84a75e73ab1abe2","_id":"@flexdash/node-red-flexdash@0.4.21","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-3o4k2Gay6dFbzK61BVfhNav0MqxdU7RuPDQPiAqO47bjUFXov8SBlxbP9dFzzSiX4p4bz+OefONrzCiH9nRgdg==","shasum":"81ad1f4ff2e699ab2f55726831c987795e1ee984","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.21.tgz","fileCount":87,"unpackedSize":5863112,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5R8QV2334Jbj5hiMrq+X1RUg7i/tSgoED3MMufd7/DQIhAIqHPD83nMTWQjzmTCZnPzU7nUTjdncKDhiau9xjzpds"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi04gIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo0vQ/+MEad1IWaNPnnfXcVJKQ2pKZpV+nsE+2B+WjFs2TD1H/OcU5L\r\nFhEsj8YqTYhXgeDZoh9pts+9i909TST9yP0cHpVb6UFQe3kCKhDB5tBvrTE0\r\niBr7ohtUgiHtbHS0y2KcXrqSr5qk5OR5F48b238+G9N7+HR5Mf8c02nbYTGX\r\npO+vo1CYWSF+Wzb2Y0W3sdlTpf+noPfrlJRCuaZZj1rMgukjV0PLNGP1Thjl\r\nl9AsgQ6pWjC37kaiVjI9L8v8OuY3yGiWlwSTpJ5lCXvImdGCZxpWlRmA6Dss\r\njTxTdiTcJJoT1CZtiAXo1QP0PhgmdC1gB0EVKqP4AEp8D3U6wnr1clWw6aRg\r\nL30QHc6tRUXXluup5UJ+6llClykVpNkSGVLrt2nNh46Flh3h7Y9wxA8WZvj9\r\nIjKkD8fIt9N5gHBIcaB3fLOBdtNQcBuiBaFWFj5zKuzOt4VxxCxUQ5eH/2Lr\r\nQ9zBRRUsX39vTdyjlqcRDTu4Gum9sA1YAi05epTImYKQAfle6TCLn/VV8sOc\r\nSDQiuiHEg9A5nJ8Gf0U1ijdwIY7WLMFH6046GlJBmGmTQfG/+IFMA9oTgy3V\r\nfMTM9yLgOee4wtydJNOk6cUMMPg6pw/wze8Y07tShZaGm7XZs1XJcDhal1RO\r\nwc7746QcwHrKDPe0dYRYhlS4SkdxZNqcJXI=\r\n=IT5h\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.21_1658030088751_0.5841413471790549"},"_hasShrinkwrap":false},"0.4.22":{"name":"@flexdash/node-red-flexdash","version":"0.4.22","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.6 && npm publish && cd plugin && npm publish","bump":"cd plugin && npm version patch && npm version patch","bumpx":"npm version patch && cd plugin && npm version patch && git commit -m 'bump version' plugin/package.json"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"946b7dc8b438e9eff61b51b152d0f1f569989219","_id":"@flexdash/node-red-flexdash@0.4.22","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-u9OrATtEEzki7E2XU/3XvvDDwpmz7iDj2p1tJyq0MLNJw5ndzu+mt1Nyd7Tuzj8pooAUHPVG/nhlzA8GG03RNA==","shasum":"26970a12c1c50562d5543ae7d507f1dbd240ebb1","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.22.tgz","fileCount":87,"unpackedSize":5863233,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCIbe5fzYClDO8jY7MdLRHNpCnBc/LAFNuQcVHUxeotqAIgJM4vDApLcaPxfD1/AHMbhXXrSVS91M/4Z8j+V0KrOlA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1FPWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5QhAAg7RAQAYKJpxQ2u7LwbzmMlwzjYEh2dV/9v0NDSNDUW+Ie4CP\r\nDN1TtbJk/UcQ2sDOJjQ6YeBVfg5NKB/EgFFEOLjbOkJuPJsY0JOeTfdKe9Wj\r\n5hUdVNBPHKBl/1tolh5Qd72t+FVGHhoMX0nmVG7V28SQ9fmd5P+8P9Mu7Udy\r\nsd8iU8ptH/iio7jNs1yupCAHgRYsIFbNDQ0HI2U1sT7JmVI6U0pnzvcbk0ou\r\npOf+3Vs5GVukjxTxba4yYXk59pv7S4Zntsoce0Ykt1tQ7mp9OOw1dzpa7AWD\r\n7yMnETVVYgw2NNl60Wbdpyyz3kkpiOavmRPmLMi3ufnkLKuVjohBfsnG8Z4n\r\ne7mf1INFplLt9QLr8MEOIPHKFZFyHAXeB1gXDjy6d2x3LLSH0QFc+szMygoy\r\nG2KGh/KcwnhJlXCl0misXgf+uwsCoOR5QtVRaXyRtn+fiI36asLs6D8ViHKk\r\n3LV+GKUlva3gM8LZHE2Sx5jUc8S1QLGKs813mLeMbDWxE4gMj5In4fbDnK1M\r\nU5iBKWQSZBo0rwhHQl8YUOYTfX8o9Gh3cZ+rBdT8aVpXnJxB50aEQFkXg0H/\r\nIp6Ufm+e9fLBnKPxd55o7G5y5G6TFsjy1KaCl+iIWxE3zNpfe38i4uI/X7TL\r\nYTthiqqEaPBTOldi6oQ4KvEtzbbqa3Pc2bg=\r\n=njnt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.22_1658082261627_0.028477535576902913"},"_hasShrinkwrap":false},"0.4.24":{"name":"@flexdash/node-red-flexdash","version":"0.4.24","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.9 && npm publish && cd plugin && npm publish","bump":"cd plugin && npm version patch && cd .. && npm version patch","bumpx":"npm version patch && cd plugin && npm version patch && git commit -m 'bump version' plugin/package.json"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"f87c4eb8c25644e074edf47bff1ea8ab219951c8","_id":"@flexdash/node-red-flexdash@0.4.24","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-GazyrXC6qlrme4E0C4tJ0kyaOLEz8oa9UzZ3oQlH6JHs2klGxw7OiXQY2PxCheqf0nt7r+czeqFQVkFeCCltsw==","shasum":"ffe080ce86d1ad01cbe7b62a237893b823274188","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.24.tgz","fileCount":87,"unpackedSize":5887981,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDlcmLjwMuhPZZqRF6EBxfoq2wapPu6yMbKfkAuFA1pMQIhAM81Ra7M32zI9LdVpinXiTXKbmUDOSWqkSJI/c8ngR8i"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1FecACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpFaw/9F1ZSx+t+xq5IQyeWKbTdaa6AqX5yZpstw5Bc+gS7Pqb2J+3q\r\neYPmGR3jk1S0Ukpa3ChqKWFO1OA0lniu26qWAN7WHWNTG1xHofbtOBpR7zGm\r\nHO5HDZS4DjcxVSG847wIjf6lP9dczTSOXNzaYLbyR8xm3MxKgZ6u4lW+8qB0\r\nK4UwLKJ79KuSQe5FpDqbmLzauGWEvnDUseC4d7ergfUdngh4hj8LJ+y+gAIN\r\nrgLQSIJ9jCgOVL34P6b0Cojk7+Uaaratkz0NYHvW+USIwLJ++UbqG1SP0zCJ\r\nnLwuu4K4XMKIuQnJae9nbhKjrp/7mOYnyIvpmvnG+7tNPECSJvzBhHCONrWk\r\nVPjk7Z7ZXo6QcpPt76TzNWKvSN+erat/Or/4FqhimKyJSX/Arj7FXlu2IO2q\r\n3e+sgu3tJmmm22/vDd1BAgxXxQvFOVzcGf6A4d9Ww1zpBn4aTeLScaBjHqeN\r\nfBkZlWknLILANCFFGttqjHQqbtRMdebbavWznjKAhO3zXqCDPWdWs81B6s0L\r\na/VxSAUIJvwY4GX0WctQ+laAAsekSjaWUQ2H2b7Mxx9cB/qoFToNjCeel/5z\r\nHU5SQ6B48w8I7zUb+rCiPocnlx4RldExnIR001XwyCBl6pFS4MDkn783lTzX\r\n87NQUHYlmRwfmQI7N5B7bafotu5DaAl8YpQ=\r\n=40eZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.24_1658083227737_0.20667634220781728"},"_hasShrinkwrap":false},"0.4.25":{"name":"@flexdash/node-red-flexdash","version":"0.4.25","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.10 && npm publish && cd plugin && npm publish","bump":"cd plugin && npm version patch && cd .. && npm version patch","bumpx":"npm version patch && cd plugin && npm version patch && git commit -m 'bump version' plugin/package.json"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"d9958554b2e277385101a54de42e6666bc2ff42e","_id":"@flexdash/node-red-flexdash@0.4.25","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-GZ8jaZNqBk5/QxboIsX8gNw1uiis0hg46XfKy6NJEJB6uor8igFYP2nFFara1fdjY8n+8PA0rY+c7rg9ulrrJQ==","shasum":"393c762c8750958613536d755292687a13b2b9e4","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.25.tgz","fileCount":87,"unpackedSize":5890471,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFx+XdLb4nEe7h6egtOBxy630ba87uCTFdi7WkmDH0/CAiBuvj+m4aOgiRGN+ZcQJal4MADEdBiWd2cE4kjAgA64iA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1eT4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqitw/+LJUA2Q00M3IfN31GUuRHBzzHJEh7rOxxEgpfjVLBRnNXWgBE\r\nMOXUSfMa7OFvxaCV1JwIavLohT1UiXb2pSxq9NDULqiNcrbbJPZa1k2GxXSo\r\n6sG01i18D/k+s83xYQ0rWT8gKnYsc6CCjQmmaLhvh7koM7zzO4NuUqFcmgMm\r\naFR4MY1W4YyjF0C1ey1NZdKpzu4yIKatB8K+W4pP1EGsteXHhE5T79SSFz+2\r\nRNMOeSrf7CHzn61b5sLEw+teEghAcVDRltes1dc1JRyL3D6MBRdmnl6IzgXh\r\nMHXDv1R2vTGh4q3f3qvf6Ca5EsarTxFb3FveVbMGO1cpf4umeE0jFIs8PnJH\r\n0LjRi6S3bDpPBMBvCfijd9sktsCguQLGHltWFNXJOuviHowt4iKCLwgRijk3\r\n018RozOgUSc+cwcmvP0GTEOu+v+eHsOoyEyfo78RiEgR7ZvvsthyABV9bOmG\r\npq5iB2BWBf8Z+F05cDr62xhwh/j5D1j/3aHUadLpAyQkp/3bMM8oKSOhogDe\r\netTn4iyWVGLLmVDbGfQ5vtCdIDEADz1PiuNmsr7/ThzxXhMSIKSyyerZ2hCP\r\nZFBsnvJicH2kAdTrXzmncd5I6yUb+eFJ0isOrppYdOhoG4Oc8/nk3c7lmJk5\r\nWBkK8PHF5F9XJh2zPfBt5qzP2abAXFnKKqg=\r\n=5X1O\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.25_1658184952646_0.6052020760404997"},"_hasShrinkwrap":false},"0.4.26":{"name":"@flexdash/node-red-flexdash","version":"0.4.26","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.11 && npm publish && cd plugin && npm publish","bump":"cd plugin && npm version patch && cd .. && npm version patch","bumpx":"npm version patch && cd plugin && npm version patch && git commit -m 'bump version' plugin/package.json"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"f6576d4f26ec77383808d51e0943120eeb5d582a","_id":"@flexdash/node-red-flexdash@0.4.26","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-m3PWYmlLPXlbR7Sj+8adTQ2nCv9ygvqUYrw6rrezqfI8Unq+QG8ACWbmfUUSlr8TaW8Yv61wj+fgq4n4i63Vpw==","shasum":"c5a353ffa9e71ad0a7be992221200ea9bcf36ce9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.26.tgz","fileCount":87,"unpackedSize":5891135,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDeevaBhuzAuJ0UM8RRyl7JaheAGuNGBQhUhT6FMrhhSAiEAijB+4/wsFSUHZ0kta31tqO8l0KRCZaDPm9An3k0i3pU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1w/oACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp9Cg/8D0pgY5TaTyTDi6NNatzo+1Xb92yGoyCtGRHfdJeLIGo8Zi0A\r\nqa7IuVAB3Q7ccnLBxr2iC4Mr50MZFAwF6hEHSFQ8TP32L2M7PlNi0s6iQz1o\r\nj3CcZBsQP0SZXrAWnxf5760a/sF0M33AqeOKfuFVPrJr5SJvZVQ7YsKdJRb5\r\nMYUlkpDJonsGMyfKja5fJUGw/rWkxTC3wxlXYxKEMp7eR/I0UObAhgocdQ5v\r\n35rtTQlcZsKxWiQwxkzlUxOMf1O3ZyHemtoAJb25p07vMNhiEUpLHjKjHLb9\r\nFmPmKYlLoVyfWeIMhDtLfP9RPjN1SINx2LyChSlf4f9Z3qbDoFOOwmXX6F5E\r\nRhVgwWuZnXu/1N8YLvUnheplj4O2q08J1ctdtwXpu/wj53XZdL6/QZUyvR/p\r\nVwP9vA2Ok6nKYxdc5F9jqOe5IOVDAjdQh0l0pZeHsv+Ah0Gn/d71W8GqZcHx\r\nfj/h90Prp2vGAHXeVsw1GqSt+Ynfep0lmQbsRBxyh7n3BnqseXI0IWFREpA9\r\nvZoc0AGPKwR8vd2m5uUH58j6IeHCT+fclEeNz+8qq0FF8RNCqcHuFN4tCVhN\r\n/xI+ye+joEL7CovxPv6+GDOeBnn8m3jW4m8qzLnjWkk1a6xF7xp6Hg+4Y6tk\r\nZkLU3Mqt2dwUFXrpxwRVoNkXnwytuAftmjc=\r\n=4g7w\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.26_1658261480427_0.4084510545014348"},"_hasShrinkwrap":false},"0.4.27":{"name":"@flexdash/node-red-flexdash","version":"0.4.27","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.11 && npm publish && cd plugin && npm publish","bump":"cd plugin && npm version patch && cd .. && npm version patch","bumpx":"npm version patch && cd plugin && npm version patch && git commit -m 'bump version' plugin/package.json"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"bb542797ffb7259c1dc56c680336b15793a30683","_id":"@flexdash/node-red-flexdash@0.4.27","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-imyqD7jmbpcj/bkQQvwih0K6nShDS4vtMfkhbNMQqcTNyA2KlzXhsGttsWyynRd3Ctx8IvZCPlscVV6AGTBjEQ==","shasum":"749930e365df0cb3582e991d1a41c3d5f28bbea4","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.27.tgz","fileCount":87,"unpackedSize":5891163,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHGnoG1ZOhzV3m4+16UKEnZ/MWPzo3imsCMKkayTZuGxAiAQ94UV/P/NpRhTS9cnlnglpQcke2AC6WB6Tgc7nwiGNg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1xJPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmormQ//VcNkGA/1rmobosD5/s5VHOrHvly19R+5a0UVO5tps8YuYtgp\r\nnC2hCA+3jO8vZP/uXCQtJMnOd6Q3sSo8+2jrS2CxBDpafrOEA+Y40OzYUopD\r\nDFAOWwmv0MNKuTveicK8VLSMQP9UVWfmLbeoTGK+FDP+vQm8+LXWGxyKfPtA\r\ncerIlZZMZQ7EN7D4MaN4lhQ9AMY4WFWqPSUk9g/5ZjA1TTUxv0IIR0KR861r\r\n2Hx03jhMq5whZFWr8qg7UL2x9QcnKqKVnja0nYptSIBAEYEECKHqfpN7Xo6Y\r\n8Nsd0th6oCUYpxelmRoxTgQny5N/krPh/Be46yBT/NKH3IFLIFe23FrPvl7a\r\n2dX7RFU7C1RO4Kz/1Q6+dMezLvgC9xIHVA7aAS1fNm+9xbQLov7hpHW49JE1\r\nb/FurKZmlM8iZh6KaTupLs2eYXbzKji7XRqTxRLa7eTc+GRbzQjio33+zRnE\r\n+BUBd++BKWUIbBjuknN1rac97CGkwbBIAewAuU/iDSUqz6Aiwe/v3tjFLN+9\r\nEohjPGazm0hsfuXU9m/T3RFc1fGVHO/chcT0BvS8GgOLgnuHW3fakzicjI73\r\nQY+Q+nB++5IxyoLJJseCWNBfVBjiVXhFy5Jz/Y99H0JLFxHubhlHNOnfNcCi\r\nXM5mDeMjoTIFfM9++zoYLwwdFtAAaVyD/Es=\r\n=efRN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.27_1658262095402_0.5201658976002164"},"_hasShrinkwrap":false},"0.4.31":{"name":"@flexdash/node-red-flexdash","version":"0.4.31","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.11 && npm publish && cd plugin && npm publish","bump":"cd plugin && npm version patch && cd .. && npm version patch","bumpx":"npm version patch && cd plugin && npm version patch && git commit -m 'bump version' plugin/package.json"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"7fd51db42c157ccb9fa99855aad1624edb77772c","_id":"@flexdash/node-red-flexdash@0.4.31","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-lGKm7i9fT/EH57pdsG5kLKQZQeni1si/yWncX0/pnGC1+4nSq2fV1rxUPgOA8wNgPhTf2FICH+RtiVa8dChyVA==","shasum":"c782abcc50145e1015787e0f2b382794f57d258e","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.31.tgz","fileCount":87,"unpackedSize":5884549,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICyOvW9JyxCVPnVPrvT+HjoEDoEN6MM1ReL64JFQr60fAiEA8+kKwXMGWx4DiEEySaRNk4wRb94qvcvPDwiTKg1ZZDk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2GxLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrfDxAAmB0XiO+/ofXuldswnIZbrofGxLjNpj0RV595WMEcsmlCXdsE\r\ny89BitHerykf7D+/wfhgWk1I+jbtxXBknjodTFxqQaJ2R36QEQ2ApKWyxaeH\r\ncQTmPKZiA87GbXs3Uxg+vlH7KjCfeBlSxI4aQzV8hqOlI4y0uIw9wwVNlKC7\r\nOjiRwNXfnx7vlSSBJcEh8jv5iX8+Bw05WX7YrCPLNYCX8nI97PE/WuftJrmX\r\nurmcDpD1SbpzTPYZshOHrIwXYFvyj1zzKtBgeaQh0zRCjjFYUx57mG7rVGov\r\niRLIClbbcWpk/Cxaxaj3olsJPuJE4RHo0kRDn+UHQD7akh3lY9OQazP5/9AG\r\n+px4ddqozU8KCKAJh32+ABY/Y70sQStAXhd0K76oZ8Kg9be32l6EU7heZLWR\r\n/4Rc3Q0N+l9wIzx5wrBIRvYRjCaAByJ8fay4yXRsAdNGgvsRDDgdStBW5eVE\r\nB4jqzY7uLE91pj99VDQKuvo5KYh4BGlxMEu5sRMthEnSzRMqj9YfnrLbtYd6\r\nc9jJ8lr1mnaJNH/bW2Sr8L17f+tlk3tzeTd+HP9P1OdP5YdES4MROeDfEh5k\r\n8zJYjscCbnOZfM2hOyhy8NfnwJz9RdM9V6nJkOLyYMOQkWPKtk6mYA3ehzqQ\r\nUuB1ThBpsP7T/GV2njcUH0c59udyb904b5w=\r\n=B8hU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.31_1658350667579_0.9223715774679628"},"_hasShrinkwrap":false},"0.4.32":{"name":"@flexdash/node-red-flexdash","version":"0.4.32","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.11 && npm publish && cd plugin && npm publish","bump":"cd plugin && npm version patch && cd .. && npm version patch","bumpx":"npm version patch && cd plugin && npm version patch && git commit -m 'bump version' plugin/package.json"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"d0644868a4ff9a8ebe42b5ae02100e05ff2d417e","_id":"@flexdash/node-red-flexdash@0.4.32","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-zc53/99a2fKbGUHnhE7UPNY5M/aRY8DaQZglX4RLWnUYpBusMxoOOWR3JvDQNZKsFF4HE7xsnj6KWAx/Dza4pQ==","shasum":"88391333cbb3758a4c152685de329bdb6ea6b609","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.32.tgz","fileCount":87,"unpackedSize":5884558,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEtmxcTvDuQVfjhmGlvbq7LOsuKYOZGNqPkhSk5EFNN7AiEA2+62V+6fsWWZBLlD6Mvnb8r0dcCf8JUP1y0wA6V70KQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2Iy1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpXhBAAnnjpp4jgUo1TDqH2RaVeiFuX/nKHgGMs9BINFC0TJ/OlN/h6\r\nSYOiTm+58AI4coRWJWcnIN6/Mcbz7748JoFHfz+Ouz0UAeaYpZOCoN5zkeRV\r\ngkU62IVjEFCdbTMgETO8yKvP+QFf7mr5lWk7PRyILI2u5D12JkiN1un/nMHu\r\n4N9gYv905/zhKdQt5oBw5of/8prXBoLmHhxdp/Sc6utIb2cxK6D5mch6JCec\r\no7sutBSdYwqv/uohv6fmLITRraMjLCaftWPZUeutjHusyY919NEGcGqZBmp6\r\nguhGqa3SEEhC9w96uQNaIREDiCGwWRdyIwMspFbI1u0HcpaVROtg1CbJSb0e\r\nBYUyWGq0IPdoaE9CDgjwzXTbu5Zbap1az0HHoXZUYNhDidCGDew+vmz2ZfTr\r\ne7YDnLZ6uA3smI2uRdvcbK2cpSbS2n74L1899eVOarh0IUV0SON7/HZcJUfD\r\n2wlQsQoS4msZSFwFUyIZKB99OjEeQep71EbOEC1LKBN/Vuw6lkRhp5/oGCtb\r\nQQHbqGA+JsigmOyivV7x4rNUJ6MXEuUawuntSf01b8/uuD2TZ53QvnYPlmeU\r\njmofGjQwkY/6yqXACcSXlFBMGFHKjlkAQBN3YuF3eZtJw8Grm5XwsnMBPJLp\r\nEOaizlQ1zsMCQma2+GGh366csaTRLhxjvm8=\r\n=BWuE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.32_1658358965112_0.7384441726213486"},"_hasShrinkwrap":false},"0.4.33":{"name":"@flexdash/node-red-flexdash","version":"0.4.33","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","dopublish":"./bundle.sh 0.4.11 && npm publish && cd plugin && npm publish","bump":"cd plugin && npm version patch && cd .. && npm version patch","bumpx":"npm version patch && cd plugin && npm version patch && git commit -m 'bump version' plugin/package.json"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"202238c0893507c09c4e4dfefecbdbb733053873","_id":"@flexdash/node-red-flexdash@0.4.33","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-o+bfAqd8xtJS7Z2CFe2zn9yOY8KfUB+nCg2lQkhnqyMucbaAPuGC6cP7FNl9vzKVFHGLuIA+BSNNQxai7WLFEw==","shasum":"24630c9c92ab0e4de95c6d14e5557e2fcb036b53","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.33.tgz","fileCount":87,"unpackedSize":5884704,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHm1AyivoO8jYJAvHE8JDdDf9zrg12yymo5BHSobJ4/pAiAYyqqeNd3095xKo+BIbQ8Mwg6wU1rBckigIqtg4OTrqg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2JM7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr7XhAAiUVIxCm5PEfqR14cltvUiHrG0/6iUCr8TAV/ctu+vqGRMf6i\r\nsq2knAwmXnuZSJtmIwJm+WHHVMrd1gGY5IgyDLXJosV7ArCOrvysn1TkLBaq\r\nzi2niVEDUFfISFGhYPK9gVFVmNM38yECvCNOy0SObQ74Uwh/8StrxDcjO6sp\r\nRduMpBfyDyHFT3yKYLUuV7DvdPaiJhXgEYDe/fHg03c0umC2VLIXW4dDtV0H\r\nWSWE6IG6xMDzzXNU1xfqVSOa42K0sHeTWpB9DYot45Z83J8gcwVzRPVkNi1u\r\nbVFLa6oph0A7tAW8jxRJHNK8zVrubWk18T+LAqIdFf8RQqgbD6DMurMzYx/n\r\ndQmBNDZhPV4GoRlvNVtXR9XxYeyhsaSfsi+MTfeuMx+yfUbLis9PqjvjHGjj\r\nGq68ZMGo9Hyl1oxIViJ/orO5HwglES38gJ9PErtFPRdt+VBxK7JUGjd3gsr/\r\nCe5tImFU0WBiHTWqLuLmNYzmH/Ct8kAGQkssTwKTsQ9YKRQSrUm8TYDrW6k0\r\nJqV42cU/EdKmLfJ2G+m03VKf1XvMBaQX1hLfEQGA5UrMTAbXKh+2UPfXlYUI\r\nX8B/KRP/5iEeFhQWY8Yv/LU29bWBd27L4u1btxToKeMecdiqTk1ioet4+LZF\r\nlBExZhzdJS6gCLW2or6kFCmVsJLLfcGIvvg=\r\n=hHmS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.33_1658360635628_0.05641434243934085"},"_hasShrinkwrap":false},"0.4.34":{"name":"@flexdash/node-red-flexdash","version":"0.4.34","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"dd8bd127a0eea5afd43f035fd48cdfa87c86a3ea","_id":"@flexdash/node-red-flexdash@0.4.34","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-AtEqHuIqy1ox/oQFH1muEwurHNPMg3PyGSQCp6jxIm+Od9DQdmvm4Si1mn8IxtxCuG+uVkltFFhbXQ9L1yNjmg==","shasum":"ace5133aea17ee60c329a676cb0d57c779c8e4cd","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.34.tgz","fileCount":88,"unpackedSize":5882217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICOowmxuiIXPqCZdWcXUmfot9QCBOu1MNnQJ68SeMP5+AiBoVcoh1YF1qlO7j0ptngZMBfAGENQ0JmKc7dG2SOdIUA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2JO4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrZ7BAAlo5fLuEYeLLszMLNXNl7JOld+MJ1AwOayskBYRhXdueyUmrx\r\nC0TKrUk+U3M5q6WWZblNBnQo9szHn+UxGyRzmny3qWYdvKA5y99b7jKyXBYy\r\ncJYgNw2Ru3UFUBtrgRY6BEFoREBcu/2JtqmG7M84sdsSxsk6g7ynLR3yexsZ\r\n+V2G7aJQMbk6KOdtGYBYHRV9hyz+dkD8WSUKh0HnMZZARg3ePseHSOUbOIip\r\n3Xh8uz/1XWURuHlkJ6uvbYjiWFysm8H5JiOVSnE/rnhV3z2fckAQ+FpObht9\r\nc8XXYbRoTuyaEfYeVXUnc0AHWbhERuqiCe30PwqqizCFUoHb4QzI+pNouOyp\r\n7Ki0I+OXHnoI/XF6FXVXk8M0Opak/TgjC6m1sJyaeKb9RlMzg6Kx1vDG74nx\r\nPdDZDBSqE9d5tGwqu/qzg7ODTaD+5qXCszFQxnUWA1Y4Zrs2CDOq0hrKyYQK\r\nZLrLSML/YvjrsJoJQ49ZKi2SYFpaf10jPGFBYpAxK6A/YWdYGgsvRAhvLxtp\r\nJ8y5WtlHvCgHIAxCuIAIPNl85sXpwX+J7+TW9ADegSUjklbVXWE16kJhY4zM\r\nro5Rc15rKQi3O8bhB9HecV1e124kWStVJYZCPej993sy3/Hldg0piYdk0IAE\r\nzjweJLQ4Rvg7qhCq5XkSMtIe6CdzNd8+/2w=\r\n=X5lT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.34_1658360760010_0.350192566390255"},"_hasShrinkwrap":false},"0.4.35":{"name":"@flexdash/node-red-flexdash","version":"0.4.35","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"3923ecd101cf6b7a4f5e5c4d3d2c7be86fe6cb3b","_id":"@flexdash/node-red-flexdash@0.4.35","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-PK7F9o4KnG5h5bAD4sczzMy5fbi+3s1rqiezNG2SKpWdcpu1/mzGghoLxVWMrvmPoS91j8sZeD7gIHDUZe18Rw==","shasum":"9c64e92c5b29560f609e003fcd674749627b21fc","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.35.tgz","fileCount":88,"unpackedSize":5882201,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYI79Hj3f8Vu0BFvdj9PK3GxHRSVNbjsL81N8+wFQNTwIhAOyzJeiIIo7Q0kNW5g/fN1jhizU7ftQ8ZI5Sy8WLx6WW"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2JWQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpe1Q/8DeJpmB7j5Vgqz4pcLAW5K99VVOpHmxosef6JjQ9H/ctA83jP\r\nANTuVD5pYMUSa5ipNCSgefhBSG1uXpi+0QqTpwwlj9zKGVupJ0ByqGPKqTN6\r\nIetpCV332zXhktiP0MbxdKKwe5+6tC6p/CNObZFGyRgAmFeHGM0yajnVuWab\r\ncqhtqKBpMNK7iVzod72L4LPDQler4q17KvyHa+geGC/lv4H3M8yFmVZ1H5VL\r\nbHUUk7/kOtgCuBrjw3wOQpKGN/EQ/6escpjGhKwHtdi6wXtcYUWBcUS2ir5e\r\nOQXmIJwU6NeUGVQ0FN651oi3XGqJBOHGz+1z9cXAEj00I2GIxpa4XgGzrK5K\r\ntaaddcC/PPk3Pq7zOWeQmQEdJYpEHB8Inbru0ZUjReyZv1scm2ioKREL51iL\r\nucIQMaxwJe8cPh54+Ivyt7ElgUy/+1PANjC8XuOQXL8ohVkECsQcA7yazVyE\r\nTxSeWqVGu+HQy/W0hjGjmeZv7xGyPKJFlsPHl5nbzbMceUOnoDn2aLp2cgaM\r\n9smXp2mgecmphkORG0yoNsUqFtI4zs5qcx/GH0A4cxXRnspCTTeoTXFDHVcO\r\nvLSo+o2mDd3xOIzwGUP5OiiTZERb73vNjnPiLPGGrLVp3WZlGJm3HQNbmuQn\r\n2XywjkLWK1u8p9VvR+Miyp6NYKXKrpoERXw=\r\n=e0mU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.35_1658361232564_0.4945445340643917"},"_hasShrinkwrap":false},"0.4.36":{"name":"@flexdash/node-red-flexdash","version":"0.4.36","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"65d754624c062b7d9033359b5e940c5632d1bfa2","_id":"@flexdash/node-red-flexdash@0.4.36","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-YqHENxCv5GjKf0jKAEbf8JqK/lISd853LIAzzYbhD625ZDaG6VHlbrcwCJZyCOLC//dV2+KrOaqL4q2SGRrbrA==","shasum":"71573f37fdf07ec8c4420f712d756d4d98e14511","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.36.tgz","fileCount":88,"unpackedSize":5882274,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDrJcKmijATMRVSVU/MNgCjwAVRx1zzlFsDNtmsaduyYwIgN4PGOa984eUEFvpgQEUDmAP2HoNWdQIa5SEb3j1PfXM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2MIKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpKLBAAlXBs2z+jvOSuHTH6+TpbdhP212YLrqFcIXX1yn6XZRBMi+Pb\r\nSn1etvuxFDeOz9iULHbEUYnvvA3BC/dff2FQ65uHCBasoFXRQrRs3s1/GqX8\r\ncdw1EPrwC+URqltDd6EEzRrKPwbYBQ7iAXStZPGxBbB0JeH4BXSw698eA3t0\r\nDuStyscO5FHobEKFeQu3NuHkwL0XiNCUcAioDCPs3N4JKSCCcy3Uf8MUpSG8\r\nrwu0ZtVVYP0sb7UJTnJe0wa2ORV44gHoyEHvqLGycNblTjyXx7aNycBc8Kgk\r\ndYIKPmqqRqzRIidoM5ixypGpXwqIk98Qjb0EZ0vXNJ3i24MI9+ij+7BDOWD/\r\nzVh7QRK2Y6qzlzPnUSKpcHuk4ZW0fz/trAIo4F8MzvsqBdUiOikiCz28HDmP\r\n53SErXOhA0YSTtsXzhnpyLiez4ygNqHGOkzFmGujVPZA1fnRK9FRe/7hiPFe\r\nLOeiGYgqF4vVMtXkXx9te1EQ88kSSe1a/kLQjcCzGshR5dsb/GOD7/JuxGTr\r\naJqNWKCRNPegYSneXxSEqvGOS7QBNiuTiiSbtdkX1/1NGzqgYAmmrPN9Mp9R\r\nHjNZUJZNzodtMtmayfR0RWThQqHJopol7riD95A9/TQ+mDS1fmQwHdMxLiMb\r\nl6ngJq+xj53ph9vjiAqSLsEey8v4axd9cow=\r\n=5lXJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.36_1658372618092_0.0004902148635650416"},"_hasShrinkwrap":false},"0.4.37":{"name":"@flexdash/node-red-flexdash","version":"0.4.37","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"7416218fcc09da57ab00e8bed3c9212896456ea0","_id":"@flexdash/node-red-flexdash@0.4.37","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-GQUqjtaPv05/C1oRxRItWR9eNXYUt04hyiKq3ILgGnoHYNY/4G9ePTZChqy0lo1oo7KugVltIi9P9GsWf7tmLA==","shasum":"edfc079398b5a64dc68bae0c92b6a3297af9d441","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.37.tgz","fileCount":88,"unpackedSize":5882274,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHgAOuB3xcLLAKacSGVCebdCe2yL6bVBhCmldBZx//1yAiAuxHCWndiV02L9CACGEoct3AhR4gAWy5WmuHyIVwaD4Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2Mn8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqnYQ/+LbasUhZ1EXwHwWxzvNTSDlr5lEWJctlUZt9IIvgc+/+6Qqd5\r\nllnmhKrBv2QDuyyRrvIP8uj4ds4N6RLWKarNrNPpCEZaR51npzKtZXmG4VJi\r\nSKXb05jb4f8K4jQ7US3kvmBIuFjcpHCPagiKOFDKfWw9dDVcoJ5/B2pKivVL\r\nYpFTqjmgQK1hUJt4gwG107ceTVhl994gcoqPwQIM6UgSY9kt22d5Zp7kgkB9\r\nWrkb0Xne1wDI5xh8BaDH0B2J55qMES85vZCzsKwc5OUw6oDCWfMCTGty/icD\r\nxyTxthfS5nYS+dtAReIARwcpYrHP1/q8a8vKZ8EcPOvPa/7ZXO9pWxhK+znf\r\nbSlp4YcJEbsEXHoiXQQsR2uxjtNAGwl6wMMFFdPS6YbN55bCQjsiWVsaNtaq\r\n0kKZYhEb3iGvgyUr6ZXcxAvKqnAQIPt486PRE90weRpF1bO4xIPnHz3mHND1\r\nKq9Epl1ffyLWMsageTpGq7o+02mgmh517zaNimUP0wMN83jb5UC6vpEtsxiZ\r\n8dYpGD8tRL8VnyQq83sxHLzmMC0g5tIzvya0Nu/zVup2gK/Rd/Ad9J/nB/jj\r\nTyl9HxbaJkLoegUWXKdCZtdzwo8MWVwZ+qtXnLhuPXTmT8gmZGjt/7YAplKI\r\nOW0kI/03qVnmdnepJgj5+vbyShpx7wVeN1s=\r\n=qwDM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.37_1658374651860_0.4489773651658455"},"_hasShrinkwrap":false},"0.4.38":{"name":"@flexdash/node-red-flexdash","version":"0.4.38","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"5efe91875bc1fc812afbbf64676ac596c4b85471","_id":"@flexdash/node-red-flexdash@0.4.38","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-ydVZ1go28bFP7JAgpTLGJzisgxKpRZlhyY7lFUCUbegOs1C2NEDwnXqHbHdpJ+s03Q/UvCvw4gif1okQoC7ybQ==","shasum":"8a872ae04aa6d307b73ccf2d07ae82350bc30f75","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.38.tgz","fileCount":88,"unpackedSize":5882274,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3qPKrnaqtURaDKo1CGFN+z0iaGZikE8mqkRRhwgUZsgIhAPpPmKu0yy+cmxN3Zhypthrk3vsihKD8C8PwGw1h/XBG"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2M6mACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpZaQ//UG/JwJwAgR7D6JI6yoYPSQJZ291bIkjgWyIMMgmzXB0wZHk+\r\n5tLNZB3WA8BRxHW6YQibZW+0Q8g+N6DhPYZkIqIDoMuHFfrNZ20ibDeFOGpN\r\n6sAXsz1MAnIiqfnFaqTGIsaBILda1WSpPjc4uuZxmY0qL8rDuH2BK4Fwas8f\r\nLQtK+Vt+EuqTX/7IFVRSMzNPjj9/XmDsk5pI76dy7WX7UlchOy9FPa/xowqp\r\nre6qwfuIabTaNQdTso1ytbC4WpiG5nENQdd1+o7cDOt7kRORUVujz/Ycx7kW\r\nbXvk0+a4O+u7fnMFa6bM2gwg4/+CZkOMf2g+DwnJQ7gU0wZV21lQH56Cnimz\r\nxh3GssfLoWX87C7pXDjWmQTTDWf3abu7tmvuWGxs5dsgQ73XRotV5vLuG6GY\r\nv/VAV/mObTsgITa8Zz+seSPw/EPjkAGdkqZ7WmdIAL7OmKvzGyESZRJdYOyc\r\n7h/8P0uWASVTAgvggI+usy8+rTrWRe9rAL/J/OS3Ylp9bPcGcuc9Ui5p62aa\r\nUkwnc5EZVQ0hjJ059AlblLJeuui+eLFvM7a+3QDv3Yoz8IMJN3xdeDV5fo66\r\nlDXmh60Aq41buBmpK/W6tjuRp2dq7ydHCjL6+CplTUF0G5ormzN0j/8tCQqn\r\ns6xB6ax2GTSHZrIlwUpV+p/D0ZCN3a+IU94=\r\n=x3TY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.38_1658375846502_0.7844295399525887"},"_hasShrinkwrap":false},"0.4.40":{"name":"@flexdash/node-red-flexdash","version":"0.4.40","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"e27aecb1d352fcab57aa76fc21d01ee918561c90","_id":"@flexdash/node-red-flexdash@0.4.40","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Zx2b8UrkjQt41Szo8rltJiBgIN8bxqu68k6vgrq/Rz2QGrmnS3bGJ7KC/iiB63zCvO5FshP3E2TeehPQVi7NXA==","shasum":"703ccf3e9df8815f550449bc148d913f5b783273","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.40.tgz","fileCount":88,"unpackedSize":5884198,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA7vwL6l9Q75D9BSeYGF9TLGf81n9tJH026TkVdLssL0AiEA4LuZvDU2Z6kAn7Rddt5Rnp2QZs1LfjXsNcsTpAgfZVs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi20ERACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrqcA/9HZLXoRmDlMuoa1I5wJ8QAwAadiYyCG8hA9grYvnt80UqYFde\r\nr5MOyNum7VupgPxJSLJ5WbEcM1bTZLllVjyu6e3Ozgx9qtAqpIPCH5H/TGc8\r\nY5+esziNU4gtLDzRuDRAOmJCUnJLmTyP/EQSkIpWtbp0PiqqgjqrGh+mq8ZP\r\nxqLXe/HksRPP8q4Kbs2kuqlBTviu2fbZ/U88vlrVW5uFoIqrSkEhvYANyXGL\r\nzWIoFB0ELZ0vsvy8MKU9srtyhg3wkiREztLR3PZ3i92u6sA82VoE7DS74Ksq\r\nYzgJOjn1muscW0kUqZFr/089CiVScOyrhrwdtwoPRh28m+OD9EWACwI4dHwG\r\n2/Ohchew7Hp9djJ08UudSm/p7KIoWSv6y6zO6O3pOrTP5J7phF4hR3sZbTAX\r\nVM/Zg3IOoR9CYzl38VDC74iD1IQeJTdyzzyT77XXLuBg0je0qQqMGV2UxTXs\r\nZrGodWf7o2EUffcbFDyMQ1Rbo0jKACF33yHD40VsockqSQsEtXfkJv47vd3b\r\nFte5oUEhZaVSBA1pFXG+/K3qOXY4eTJBUmoBZ7k+IwX11SAoRwl/Kst3CI9P\r\nqETbic2WkWCyTc4t6f8/56UNwgY5MpFp9rMDKt38EqdkTiNQi68zPiBQOjm8\r\ndZK5I8RrUmyBedPRfsTv6SLlweNuXhJMToE=\r\n=Kl3L\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.40_1658536209440_0.5904263040853812"},"_hasShrinkwrap":false},"0.4.42":{"name":"@flexdash/node-red-flexdash","version":"0.4.42","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"e30ad5751e03dd525e397648dcdc0759f44604fb","_id":"@flexdash/node-red-flexdash@0.4.42","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-i7+wu9gVgQiqp7fapPlcjSgCNuc+hv+f2SAv8NbsEyO4fedlnDnKRQPY/2wKhCTBhPnI4zuzDgTZGL46ml8a4w==","shasum":"8682296dde3798675256a407528106ed1895a7e3","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.42.tgz","fileCount":88,"unpackedSize":5884231,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC6p4XrnB5+5jSfX7+JEJ9GPkEbrhCm76l0YKvRjVirugIgOSl3Xu3js8wTyrar/ZyOekbdIfbRKuXYgzYRenhuuIY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi20IhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5CQ//biNAfFLpSXzVwdaFqUkHS9A7NdvMprZhltxJononTqHvhTaf\r\nwwyowxXvw5DOeKwho7GQausvthjvLwFZHErA7FCb79HvMcd9xteBOfB1albp\r\noANh5Lmh1s45z7nv6iWfmXvFdV5shciRePXq0BXdachaRvnzubVj3kWumL0k\r\ned7pzDLGJo06orE6vz5AbdGgJCE9sus+WUyZARfgm3j4I26BP92QSZsP5pQP\r\ncyG/e11KKUqhCoC+ciLiscU/4HHRFL+hKmvGmEA3sldsJgKEbyF813MLaSAO\r\nnw7YyGgOwyLxyzVcb7rZ1797vsMMzex4ra0X0SOtEkWwlJSqfr3znSqZN35I\r\nTjLjmQFHYCABOTOyJNE7aIDCEw/7FVt+Lia/tSoXxClTZ3P01dyllWAX0YLc\r\nlaLb6u0gTkDcdQGy3u5acdWsNggGy2k6wwdkSxHdOOBjQSN8aVCYvLnVzwiK\r\nxxrL+4r84RbhaKh9EkJ/uQl0CMmNLnyIOx8EulkzMd/C+t2/j8/dLCwvkon/\r\nYN6kGimlfkuX0+eTiSyhkH7RgMhmjY9kXCi09OFtJmakNv0oE5SqxCLOb9aV\r\nT/nFNFzHrpH7DV4lUcD7XKF2JEvLpyVYV05FBzSggmuZc9ASq+0EYGOYzmLP\r\nQoGMdjCE9ZdrTP4TRAn1bRQy9e6GkpUWhO8=\r\n=+J9W\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.42_1658536480986_0.36192529899143877"},"_hasShrinkwrap":false},"0.4.43":{"name":"@flexdash/node-red-flexdash","version":"0.4.43","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"80a20fdef0c0ba1062d1a378cc30858d4bc107d2","_id":"@flexdash/node-red-flexdash@0.4.43","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-bPgMXHQ93totEmhl7lugl+4VmTCeXifDCJFRGXHY9ld1zsYy/c+y3NRBEELrYyXwI6Zazw5lMQci9WAQcZalDQ==","shasum":"222fee854c6b70234500d2057fe419741026eabf","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.43.tgz","fileCount":88,"unpackedSize":5884231,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDOL/+fLho4qz/6LqhLKzBa2AcQGJBxOEdetd9uFKYpXAiAImNb/f5VJIbsXZXlMdsTQdm7Lf+zoMsP1BRxwOyfzig=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi20KnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNpA/9EGtoLJPlzbE5uc/klN93hX+rsOXNgmWl9IMCMnasaMyTlRfY\r\nEzDx06tbpg0Y1MC46ixv6k7kdhcsGHOxr0jT/LG2Mdq2FMNDeGjX9YX7Xrf1\r\nCz641an5oqI0nKxYgRCv/TAhoqTR9L3lDoXJAhKvk/ZCWeNb9zxkjZBU2FSs\r\nxez3Xrh/n3JC+DVdi83P7IjpSPuVMp/ZfkbiytqQNmN8zPMNY4LVC7R3djbT\r\nq1xWUDoAhRizTR6/DzFZp3BvapP/M3uRaUjW/gk+1+cKcQ71QfiuncB8MuKY\r\nXaQBk1c71JUUT/NLohga1/e48zJq/jj53ADjIpcpb//cRR5B3nzq54AGma9I\r\n7Schicnhsl1OjSaxmA6C7N+NcZQmrN6mXWUPdS/D7EyYfp8xVYLCQB/EyUlq\r\ntHCm56oJqmYnEJf2jbRJ0I4CWyfmOVQPfFOmwSauweMhEmy0rO/sWAvXEdbx\r\nptPnhZmfHoOnbPPMr0HHNNJbrAUm0BkKPnxIyCXYkGExYZ03Y7vwTuWZk/yC\r\nAInh3sBF4OJjn3SHadV19VcFVkzatYR+KFsPDx1wAq3ujBLyGLDBg6kfoq9u\r\nHk5dSAE36W951e03TuP5cIZIx9Ecyg2O3AcTDjNcUhCi6WVK6DMf8WPP4ByX\r\nu1PIxf7id0HiDmfg+dg5UZxksgX0ssWPdzE=\r\n=lN0B\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.43_1658536615428_0.2693510056950308"},"_hasShrinkwrap":false},"0.4.44":{"name":"@flexdash/node-red-flexdash","version":"0.4.44","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/tve/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that interface with\r\nFlexDash making it easy to send data to be displayed in the dashboard, and to\r\nreceive user input messages from the dashboard.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nPlease refer to the\r\n[FlexDash Documentation](https://flexdash.github.io) for a quick-start guide, tutorials,\r\nand more...\r\n\r\n## Installation\r\n\r\nTo install node-red-flexdash use:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nOn its own node-red-flexdash doesn't provide any widgets to fill a dashboard with,\r\nit is thus recommended to install the\r\n[core widgets](https://github/com/flexdash/node-red-fd-corewidgets):\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nQuick-start (more in detail in the\r\n[FlexDash Documentation](https://flexdash.github.io/quick-start), see below):\r\n- import one of the simple examples from the node-red-corewidgets module\r\n- edit one of the FlexDash nodes that show up, edit its grid configuration node, add a\r\n  tab configuration node (default config OK) and add a dashboard configuration node (again,\r\n  deafults are OK)\r\n- deploy\r\n- point your browser at http://localhost:1880/flexdash\r\n  (same hostname/port you use for the Node-RED editor)\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [ ] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [ ] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [ ] Remove \"Widget X has not prop Y\" warning\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboard as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin.*` is a relatively simple piece that is a plugin only\r\nso node-red widget nodes can call \"into FlexDash\" without having to figure out how to get\r\na handle onto the appropriate flexdash-dashboard config node first.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `lfexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-src` suffix, e.g. `/flexdash-src` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that the list of widgets in a container has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept. When the\r\nconfig is pushed back into the flow editor, the missing widgets should be \"reconnected\" with the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\n## Subflows\r\n\r\nIn the flow editor, widgets in subflows must be associated with an ArrayGrid (or a (Subflow?)Panel\r\nin an ArrayGrid) and listed in the grid's children. Not clear how a static order is represented...\r\n\r\nIn the runtime, the subflow instance widgets show up, they need to be mapped to their template node\r\nusing the _alias property. The ordering in the ArrayGrid is then determined via the subflow node's ID.\r\n\r\nChanging the order in the dashboard should result in a change in the order list in the ArrayGrid.\r\nChanging the dimension and other properties needs to map back to the template nodes.\r\n\r\n- the main trick seems to be to map N nodes in the runtime to 1 template node (which may not exist\r\n  in the runtime?), plus an ordering/data key\r\n- message routing then needs to use the ordering/data key also\r\n\r\nPanels need to be similarly mapped back, but need to be transparent to the widget ordering/data\r\nkey stuff. Not clear how this happens...\r\n\r\nIt's not clear how to handle nesting of subflows, maybe it's just a concatenation of the subflow\r\ninstance IDs for the purpose of the ordering representation?\r\n\r\nSubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<panel config ID>\r\n- ID of containing grid is in subflow instance env variable\r\n- Containing grid has fd_children with `w<subflow>-<panel>` because the order of these needs\r\n  to be persisted.\r\n- The panel node ID is pretty useless 'cause it changes at each deploy\r\n\r\nWidgets in SubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<widget config ID> mostly because otherwise it\r\n  requires an extra data structure to locate the widget instance node ID (prob would have to do the\r\n  latter to support array widgets in subflows).\r\n- When expanding the SubflowPanel's fd_children the widget config ID is converted to wSSS-NNN.\r\n\r\nArray widgets:\r\n- End up with widget IDs `w<widget ID>-<index> in order to support the one-to-many.\r\n\r\n## Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the node (config) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow \"template\" a new node in instantiated on deploy, its `._alias` has the\r\n    ID of the node \"template\".\r\n  - The \"template\" nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n  \r\n\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"0ae2d638b351e61482aa449db43a6bd4e714592d","_id":"@flexdash/node-red-flexdash@0.4.44","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-vXbIJLAzZCjCR/sED7OwLhFYBj/UyBnLbSnETpeZ9f6kn2f4zy1paFHfB0Uz7FAjdwRwZ/0jQoQQFJhxBdaaPw==","shasum":"3496f5953de79e9d8b487d8740baf24a6fe1992b","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.44.tgz","fileCount":88,"unpackedSize":5884241,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqGjap0Odh+BX4jI9q8oqcFEaAt9Wx5ArgHmphsr6Y+wIhALLh1myaQAinfFSp3w8h9Ygla9vBZ6BWzgUfoj8dRl2k"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi20OEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoq5g//XlA6LM6GXAUZCOuZdfa2jlszHSFWe2pN6LKRrjoO7Y8LC+3r\r\nYweUy1z8Vf9qR+cRUnC5vP7dhm0gthlJqzIVnb5Q/duh5h2lW06uggWxQ/SE\r\nLAZ6tfhnCQgEjb3+ALJWrOXBJO5ZmUsEDMDw8+IVOdsXveF4IXVSZ+kf5Xrr\r\n43YIY1zuh4W8smb2pQRcPRzOIlDQqI81FisZz4YvURsRNgdtnGV3e5ZzAgHT\r\nlv+C40DsdzCrX0y69QVBeGxxaAKBgmxpbgTW5Lhjfi9aXtiijBqzCYaM0i93\r\n43n0meQEd7lkdZb2JrOayVOPuhENQMiYj76TVIiYtxzIAs3fNTNaoQB/sa24\r\nk6/XEU3LYjvOiKMVManEFpn2PUvIj9PZvcZPij2u+92FubS/8/xuOHUygiAg\r\nIZQgz9O0YHX96GCu/xAZna1P9+6bE4lHirLNBqbyB2AWtst+rMpfG0OWwJ97\r\ngu+UyuT/2FmuoS8MV+WMnoyNiDLanrHAtkB8gda8AMso1OkyE8Z5mqpyO0aR\r\n91dqxllxFdd49C7zD0qCZ9hoQq16Va37KcQTm34Du0AB32/SokIlnE33qNGo\r\nbztSg7i0A969jgldo6xnlT7vEvuV2duJUIYA9NSTVn6mvyDBhp40D9DqS2Wk\r\nrHfBMd449vj82srXVEto8OQ5EPDd3ms3Wmo=\r\n=Oe7v\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.44_1658536836242_0.45541532877275537"},"_hasShrinkwrap":false},"0.4.45":{"name":"@flexdash/node-red-flexdash","version":"0.4.45","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/tve/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that interface with\r\nFlexDash making it easy to send data to be displayed in the dashboard, and to\r\nreceive user input messages from the dashboard.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nPlease refer to the\r\n[FlexDash Documentation](https://flexdash.github.io) for a quick-start guide, tutorials,\r\nand more...\r\n\r\n## Installation\r\n\r\nTo install node-red-flexdash use:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nOn its own node-red-flexdash doesn't provide any widgets to fill a dashboard with,\r\nit is thus recommended to install the\r\n[core widgets](https://github/com/flexdash/node-red-fd-corewidgets):\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nQuick-start (more in detail in the\r\n[FlexDash Documentation](https://flexdash.github.io/quick-start), see below):\r\n- import one of the simple examples from the node-red-corewidgets module\r\n- edit one of the FlexDash nodes that show up, edit its grid configuration node, add a\r\n  tab configuration node (default config OK) and add a dashboard configuration node (again,\r\n  deafults are OK)\r\n- deploy\r\n- point your browser at http://localhost:1880/flexdash\r\n  (same hostname/port you use for the Node-RED editor)\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [ ] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [ ] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [ ] Remove \"Widget X has not prop Y\" warning\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboard as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin.*` is a relatively simple piece that is a plugin only\r\nso node-red widget nodes can call \"into FlexDash\" without having to figure out how to get\r\na handle onto the appropriate flexdash-dashboard config node first.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `lfexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-src` suffix, e.g. `/flexdash-src` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that the list of widgets in a container has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept. When the\r\nconfig is pushed back into the flow editor, the missing widgets should be \"reconnected\" with the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\n## Subflows\r\n\r\nIn the flow editor, widgets in subflows must be associated with an ArrayGrid (or a (Subflow?)Panel\r\nin an ArrayGrid) and listed in the grid's children. Not clear how a static order is represented...\r\n\r\nIn the runtime, the subflow instance widgets show up, they need to be mapped to their template node\r\nusing the _alias property. The ordering in the ArrayGrid is then determined via the subflow node's ID.\r\n\r\nChanging the order in the dashboard should result in a change in the order list in the ArrayGrid.\r\nChanging the dimension and other properties needs to map back to the template nodes.\r\n\r\n- the main trick seems to be to map N nodes in the runtime to 1 template node (which may not exist\r\n  in the runtime?), plus an ordering/data key\r\n- message routing then needs to use the ordering/data key also\r\n\r\nPanels need to be similarly mapped back, but need to be transparent to the widget ordering/data\r\nkey stuff. Not clear how this happens...\r\n\r\nIt's not clear how to handle nesting of subflows, maybe it's just a concatenation of the subflow\r\ninstance IDs for the purpose of the ordering representation?\r\n\r\nSubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<panel config ID>\r\n- ID of containing grid is in subflow instance env variable\r\n- Containing grid has fd_children with `w<subflow>-<panel>` because the order of these needs\r\n  to be persisted.\r\n- The panel node ID is pretty useless 'cause it changes at each deploy\r\n\r\nWidgets in SubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<widget config ID> mostly because otherwise it\r\n  requires an extra data structure to locate the widget instance node ID (prob would have to do the\r\n  latter to support array widgets in subflows).\r\n- When expanding the SubflowPanel's fd_children the widget config ID is converted to wSSS-NNN.\r\n\r\nArray widgets:\r\n- End up with widget IDs `w<widget ID>-<index> in order to support the one-to-many.\r\n\r\n## Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the node (config) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow \"template\" a new node in instantiated on deploy, its `._alias` has the\r\n    ID of the node \"template\".\r\n  - The \"template\" nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n  \r\n\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"7eb193f10af4953e6353ed9db4e5331edb82bc23","_id":"@flexdash/node-red-flexdash@0.4.45","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-CQsxgn51GwqGmTESikuxhfsh9/0Q0XBuxJDEXGTu8yUGwUF2B5t9zMwisIy2sTBiDaUtPTTqncuT1XzKvJIMEQ==","shasum":"08465d31cf0e50853d567319fe946e281e306a18","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.45.tgz","fileCount":88,"unpackedSize":5884283,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA8aFu68OC26HTA2lLe1pTxQ/uww1FUPca79UD8zQ0Z0AiEAxIXlMPHMk5LjjyoRBOtuH8wO5jir6DOmYzWRVpc5+QM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi20RwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmorfQ//cXsz23jzo67/zjI+eGvziSqnFvfF1SpD3EQcQP9FRjZGMSm/\r\nGog73cEdwHfuZT94NGmQyre2tjNuUOZ0NGOUY0Cg2XdB+uVElVJodybjn59x\r\nOEJD4Sx3G3Nm0jPYp6B9+B0lEez9ntakfWmPDtptKvzkz2yjmxnuwqcsQg8Y\r\n2MgphaLt2XlxRTxc2pajUHQXOHt5nt/IOf3jCGIlXnSZM50/UVKMCgY0deXL\r\nK4ANmwLxjLylaBGUcXmJGfCnHrFDoKO+PCK5YscfUFDJ8843H47jiTdIyNBA\r\nhCMIYOb4n63Fv9uw2jKms6tFV2Ic1zOGv3Lu9YjsIiCtyH73hoikjOXJE6Um\r\n+kjzbP332/HBpRkX6+wWx4XDZfZgU8vV/x4qniFcfU4RfOYTgmVhMqLPAOgf\r\npJ4Gp3T3btO5w8CvT5oJOvDjkCsoc/lXfloimwy0gClsmas/iO1k5S5VqPVW\r\nMITUOjfoTAtORcApd5c0gPCuDt2yYFTm1KZ+HklW49ENRr6UcX0RYKLFN6jk\r\nrPMNtRJYHMQWW1uR3aufBBVjA1vJsguQVd40EUHIIpG0rY6tUiiYkZ1zen1k\r\ntO6wrUJeSJHUDuB76KU7SqwjJM5Koz4Y23MBTGrIiY7+fvM/tnsefDOmhd/8\r\nXO6TmDM+B4FcanAn9JwJtQJLGmhdZNx1Eac=\r\n=7F98\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.45_1658537071863_0.13673375937669285"},"_hasShrinkwrap":false},"0.4.46":{"name":"@flexdash/node-red-flexdash","version":"0.4.46","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that interface with\r\nFlexDash making it easy to send data to be displayed in the dashboard, and to\r\nreceive user input messages from the dashboard.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTo install node-red-flexdash use:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nOn its own node-red-flexdash doesn't provide any widgets to fill a dashboard with,\r\nit is thus recommended to install the\r\n[core widgets](https://github/com/flexdash/node-red-fd-corewidgets):\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nQuick-start (more in detail in the\r\n[FlexDash Documentation](https://flexdash.github.io/quick-start), see below):\r\n- import one of the simple examples from the node-red-corewidgets module\r\n- edit one of the FlexDash nodes that show up, edit its grid configuration node, add a\r\n  tab configuration node (default config OK) and add a dashboard configuration node (again,\r\n  deafults are OK)\r\n- deploy\r\n- point your browser at http://localhost:1880/flexdash\r\n  (same hostname/port you use for the Node-RED editor)\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [ ] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [ ] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [ ] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboard as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin.*` is a relatively simple piece that is a plugin only\r\nso node-red widget nodes can call \"into FlexDash\" without having to figure out how to get\r\na handle onto the appropriate flexdash-dashboard config node first.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `lfexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-src` suffix, e.g. `/flexdash-src` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that the list of widgets in a container has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows:\r\n- End up as DisabledWidget widgets with an ID starting with an 'x' (that's not really important)\r\n\r\n## Subflows\r\n\r\nIn the flow editor, widgets in subflows must be associated with a SubflowPanel.\r\n\r\nIt's not clear how to handle nesting of subflows, maybe it's just a concatenation of the subflow\r\ninstance IDs for the purpose of the ordering representation? Not implemented for now.\r\n\r\nSubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<panel config ID>`\r\n- Changes to panel properties need to be reflected in the panel config\r\n- ID of containing grid is in subflow instance env variable\r\n- Containing grid has in its fd_children\r\n- The panel node ID is pretty useless 'cause it changes at each deploy, while the subflow instance\r\n  ID doesn't ('cause it's an actual node in some flow)\r\n- Panels don't have any output in the dashboard, thus the `output` prop doesn't need to be set.\r\n\r\nWidgets in SubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<widget config ID>`\r\n- The widget node IDs change with every deploy\r\n- Changes to widget properties need to be applied to the widget config\r\n- Output needs to be sent from a widget's instance node, whose ID changes per deploy\r\n- The containing SubflowPanel has the widget IDs in its fd_children\r\n\r\nImportant: the structure of subflow widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## Array widgets\r\n\r\n- Array widgets have a single node in Node-RED, the array aspect exists only on the FlexDash side\r\n- An array is really a hash in that indices can be numbers or strings\r\n- The existing array indices are only persisted in memory (but survive deploys) in the FD plugin\r\n- Array widgets have IDs `w<node ID>-<index>`\r\n- Changes to widget properties need to be reflected in the one node (and then apply to all)\r\n- Output needs to be sent from the array widget node, but needs to include the index value\r\n\r\nArray widgets cannot be placed in subflows. (Really?)\r\n\r\nImportant: the structure of array widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## IDs\r\n\r\n#### FlexDash IDs\r\n\r\n- widget nodes: `w<node-id>`\r\n- widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflowid>`\r\n- array widget nodes: `w<node-id>|<topic>`\r\n- array widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflow-id>|<topic>`\r\n- config nodes: `g<node-id>`, `p<node-id>`, `t<node-id>`\r\n\r\n#### fd_children IDs\r\n\r\n- widget nodes: FlexDash ID\r\n- array widget nodes: FlexDash ID without topic\r\n- config nodes: FlexDash ID\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>`\r\n- output: `nr/<node-id>`\r\n- group: `<array-node-id>`\r\n\r\n## Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the node (config) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n  \r\n\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"fb1fa751eff3be36b7a9c523c326f3c9299e797e","_id":"@flexdash/node-red-flexdash@0.4.46","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-sUNxEWk/zwup5KRJ3FwSxbQ3bFCHNPBUB0JtiKyHM2yKkclR+tEyX8hri3MPV7AKL33e67NuqPEsGVw6Ny3O6w==","shasum":"653cff2ab243c38e5416de43c1752016730734e0","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.46.tgz","fileCount":88,"unpackedSize":5885396,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDH1S/kJ0ThJH9jZnZZaKMHt7OSRWBxfNeHBBvboJ2ysgIgDXj4t0jBTbP/2O45Sv2+5dyvoKpNNZ/jVOwWG3ZIBjI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5L8HACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmohfg//Usao2uBNt+HcjMktOezWhdWuCUezqSesJHXVLKcTP0DBGfjL\r\nsxuJ2iSm/YMBl1GH88QnDr3fCBUItTkPg70xyPvPKq4GI5J+Mcon08G9ufxA\r\nXmsV3cFdywJplif6NFFn6N4bm7Nzl9II3P10szoq/zsPt5X0DESzRXS6Du9N\r\n4rYWXvgGcngvoWLbZ9Za4Iib59V9A0+tqUA13caZNiS7RMJPPx9hy3AsJ1op\r\n7U5idmFng4q/TZvDWRJAdhqBgnUlNok///CuHMCUCKC1HSI7lVM49u8bS/xh\r\nm/rwZDy/rGOwoLY786iax8WrooXPTCTEFz/JA6/cqZrfm5Jjnxf9E9L29Ux2\r\nH504EQnRlHPhoJby07PHdy2epX0N2dHbCenn5C4j7fmrKeLWq9SHb8GPz5po\r\n6JNmFw74JSHraOPhymLi5gvI8jyr044TjUFgBz3frWurXTlkMlNWvqr2TlTP\r\nbwNak3Of3lEWhhtpCwcdqZN5zJILVUkeK9GkwXcmjFBrPhq5hUy/TiHehHwF\r\nZXtdxSxhTC0w6rljUOX0KRoDIBY39lzLYSYmg1YMD1DdKh45tiGTetGvkfus\r\n3Kd3xnpimn/HbODDVYSAtwDtb//zZaPahdt92TKcc/BqrYBT5Fd3HgVsop7p\r\nrEuatdNzumH/7q01cP/VPABib/xnum4grqM=\r\n=ASDm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.46_1659158279467_0.13871043074432765"},"_hasShrinkwrap":false},"0.4.47":{"name":"@flexdash/node-red-flexdash","version":"0.4.47","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"^0.4.20"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that interface with\r\nFlexDash making it easy to send data to be displayed in the dashboard, and to\r\nreceive user input messages from the dashboard.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTo install node-red-flexdash use:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nOn its own node-red-flexdash doesn't provide any widgets to fill a dashboard with,\r\nit is thus recommended to install the\r\n[core widgets](https://github/com/flexdash/node-red-fd-corewidgets):\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nQuick-start (more in detail in the\r\n[FlexDash Documentation](https://flexdash.github.io/quick-start), see below):\r\n- import one of the simple examples from the node-red-corewidgets module\r\n- edit one of the FlexDash nodes that show up, edit its grid configuration node, add a\r\n  tab configuration node (default config OK) and add a dashboard configuration node (again,\r\n  deafults are OK)\r\n- deploy\r\n- point your browser at http://localhost:1880/flexdash\r\n  (same hostname/port you use for the Node-RED editor)\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [ ] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [ ] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [ ] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboard as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin.*` is a relatively simple piece that is a plugin only\r\nso node-red widget nodes can call \"into FlexDash\" without having to figure out how to get\r\na handle onto the appropriate flexdash-dashboard config node first.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `lfexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-src` suffix, e.g. `/flexdash-src` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that the list of widgets in a container has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows:\r\n- End up as DisabledWidget widgets with an ID starting with an 'x' (that's not really important)\r\n\r\n## Subflows\r\n\r\nIn the flow editor, widgets in subflows must be associated with a SubflowPanel.\r\n\r\nIt's not clear how to handle nesting of subflows, maybe it's just a concatenation of the subflow\r\ninstance IDs for the purpose of the ordering representation? Not implemented for now.\r\n\r\nSubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<panel config ID>`\r\n- Changes to panel properties need to be reflected in the panel config\r\n- ID of containing grid is in subflow instance env variable\r\n- Containing grid has in its fd_children\r\n- The panel node ID is pretty useless 'cause it changes at each deploy, while the subflow instance\r\n  ID doesn't ('cause it's an actual node in some flow)\r\n- Panels don't have any output in the dashboard, thus the `output` prop doesn't need to be set.\r\n\r\nWidgets in SubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<widget config ID>`\r\n- The widget node IDs change with every deploy\r\n- Changes to widget properties need to be applied to the widget config\r\n- Output needs to be sent from a widget's instance node, whose ID changes per deploy\r\n- The containing SubflowPanel has the widget IDs in its fd_children\r\n\r\nImportant: the structure of subflow widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## Array widgets\r\n\r\n- Array widgets have a single node in Node-RED, the array aspect exists only on the FlexDash side\r\n- An array is really a hash in that indices can be numbers or strings\r\n- The existing array indices are only persisted in memory (but survive deploys) in the FD plugin\r\n- Array widgets have IDs `w<node ID>-<index>`\r\n- Changes to widget properties need to be reflected in the one node (and then apply to all)\r\n- Output needs to be sent from the array widget node, but needs to include the index value\r\n\r\nArray widgets cannot be placed in subflows. (Really?)\r\n\r\nImportant: the structure of array widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## IDs\r\n\r\n#### FlexDash IDs\r\n\r\n- widget nodes: `w<node-id>`\r\n- widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflowid>`\r\n- array widget nodes: `w<node-id>|<topic>`\r\n- array widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflow-id>|<topic>`\r\n- config nodes: `g<node-id>`, `p<node-id>`, `t<node-id>`\r\n\r\n#### fd_children IDs\r\n\r\n- widget nodes: FlexDash ID\r\n- array widget nodes: FlexDash ID without topic\r\n- config nodes: FlexDash ID\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>`\r\n- output: `nr/<node-id>`\r\n- group: `<array-node-id>`\r\n\r\n## Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the node (config) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n  \r\n\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"4bf1e5188d9576ce008586d4171a1599a55c8cc8","_id":"@flexdash/node-red-flexdash@0.4.47","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-1nGoqeKZD6K0CBUbcXInviUEMTrnFrzzZYKYCTMB48EcMGkO8Z6asFX/LOV2ePQE/6kw/bUx03aFo+DQkvipaQ==","shasum":"86e8602aa412defdd616f29e58951dddfc8d4c02","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.47.tgz","fileCount":88,"unpackedSize":5886762,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2G+sQBgASLPsNZVlYAr6/E0Tl51O02U5N4715xsxRwgIgSLgXZpAiAPscg/UZv5pDXD+XNVw2cAt7+fbcbHPNu7I="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5X/4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoVbQ/+ONa5SoyaTPV2cUhMahXXqDUQWKfP8QOoQPMzKFcaIp1TpcgI\r\n76SOCOMCQBQIC3VKiOSCvp6tZUZ/IEFYykIJhFryRv/vdtoAxPQkVCXmRFZy\r\n6Ui9epyjZ0lJmx3LS77oo/9hMynYzIndtN3FaaPTTxS7upF2nv3ZCmRis/V1\r\nSnHocxgWzHDCB1B93qTGmu669W66Lh1ke67t0QNwPeBWjlgsq7qefgEQKMJk\r\nm5e7a7/bOAuP8VfjcpH6VydxfaZJlxkCjtYOj+35FpXQfgspa9VpVdUARF6K\r\nUx/hOruNcLud3D2Rmz+myVc1kjps5nFSrV9cSxw11fo/Oa3h2wb3jp1hO5tn\r\n8Bif1M4l0ptCD7yteBWWuvV4SBQVnCMMoBOLu6ZkYSQ1QSlSvx5m4RxagSvA\r\nHra/Q+Gr+VDtxnxpiLPQ94WlsApL2vKigJU+iL1nS9jLRzF9Cq+lox76zaDa\r\niqWB/q+fOZ4OYqfoDQcxnoYpuZ9rzh+axij6ay7WzFNIqcfhFamct91HhV1S\r\nA9Jono1EQa/fdERyv6bR122oneFcbQJbVPSYUntiZWQz5N1i9/mWNz3STrGR\r\n4lJ2AWuTPPNmM66s8DgP4FVPKJWN9CXaiclXwVbJW4BZ1cL9Td6+Emq3zvIf\r\nyeg623a6yz6l8+9sXB3aKnsZ4xzBKrJ31AE=\r\n=Nx2I\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.47_1659207671741_0.8221371082257087"},"_hasShrinkwrap":false},"0.4.50":{"name":"@flexdash/node-red-flexdash","version":"0.4.50","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=v0.4.50"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that interface with\r\nFlexDash making it easy to send data to be displayed in the dashboard, and to\r\nreceive user input messages from the dashboard.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTo install node-red-flexdash use:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nOn its own node-red-flexdash doesn't provide any widgets to fill a dashboard with,\r\nit is thus recommended to install the\r\n[core widgets](https://github/com/flexdash/node-red-fd-corewidgets):\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nQuick-start (more in detail in the\r\n[FlexDash Documentation](https://flexdash.github.io/quick-start), see below):\r\n- import one of the simple examples from the node-red-corewidgets module\r\n- edit one of the FlexDash nodes that show up, edit its grid configuration node, add a\r\n  tab configuration node (default config OK) and add a dashboard configuration node (again,\r\n  deafults are OK)\r\n- deploy\r\n- point your browser at http://localhost:1880/flexdash\r\n  (same hostname/port you use for the Node-RED editor)\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [ ] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [ ] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [ ] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboard as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin.*` is a relatively simple piece that is a plugin only\r\nso node-red widget nodes can call \"into FlexDash\" without having to figure out how to get\r\na handle onto the appropriate flexdash-dashboard config node first.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `lfexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-src` suffix, e.g. `/flexdash-src` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that the list of widgets in a container has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows:\r\n- End up as DisabledWidget widgets with an ID starting with an 'x' (that's not really important)\r\n\r\n## Subflows\r\n\r\nIn the flow editor, widgets in subflows must be associated with a SubflowPanel.\r\n\r\nIt's not clear how to handle nesting of subflows, maybe it's just a concatenation of the subflow\r\ninstance IDs for the purpose of the ordering representation? Not implemented for now.\r\n\r\nSubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<panel config ID>`\r\n- Changes to panel properties need to be reflected in the panel config\r\n- ID of containing grid is in subflow instance env variable\r\n- Containing grid has in its fd_children\r\n- The panel node ID is pretty useless 'cause it changes at each deploy, while the subflow instance\r\n  ID doesn't ('cause it's an actual node in some flow)\r\n- Panels don't have any output in the dashboard, thus the `output` prop doesn't need to be set.\r\n\r\nWidgets in SubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<widget config ID>`\r\n- The widget node IDs change with every deploy\r\n- Changes to widget properties need to be applied to the widget config\r\n- Output needs to be sent from a widget's instance node, whose ID changes per deploy\r\n- The containing SubflowPanel has the widget IDs in its fd_children\r\n\r\nImportant: the structure of subflow widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## Array widgets\r\n\r\n- Array widgets have a single node in Node-RED, the array aspect exists only on the FlexDash side\r\n- An array is really a hash in that indices can be numbers or strings\r\n- The existing array indices are only persisted in memory (but survive deploys) in the FD plugin\r\n- Array widgets have IDs `w<node ID>-<index>`\r\n- Changes to widget properties need to be reflected in the one node (and then apply to all)\r\n- Output needs to be sent from the array widget node, but needs to include the index value\r\n\r\nArray widgets cannot be placed in subflows. (Really?)\r\n\r\nImportant: the structure of array widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## IDs\r\n\r\n#### FlexDash IDs\r\n\r\n- widget nodes: `w<node-id>`\r\n- widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflowid>`\r\n- array widget nodes: `w<node-id>|<topic>`\r\n- array widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflow-id>|<topic>`\r\n- config nodes: `g<node-id>`, `p<node-id>`, `t<node-id>`\r\n\r\n#### fd_children IDs\r\n\r\n- widget nodes: Node-RED ID\r\n- array widget nodes: Node-RED ID without topic\r\n- config nodes: Node-RED ID\r\n- subflow panel: Node-RED ID of panel instance\r\n- widget node in subflow panel: Node-RED ID of template node\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>`\r\n- output: `nr/<node-id>`\r\n- group: `<array-node-id>`\r\n\r\n## Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the node (config) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n  \r\n\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"350010152778159e2e7b1eec86c25b3cb4852863","_id":"@flexdash/node-red-flexdash@0.4.50","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-SM2SC92uKA/TgwYAHe4b2sdmvLE36yKBeBxEUdSkASuE9RaZ5GRZf4fosq26O668BVPhDpgUvUZCnpdjGdu7xw==","shasum":"0211d3a93e02ccd5f1b0979196bcf5cd38ae0723","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.50.tgz","fileCount":88,"unpackedSize":5887142,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPlqcniZ0sUoMto+N36qpJE8VUC90vjZiGmnKiCMxKQQIhAP7/SKjwX1QY14r0aILsQlNLDFfvsNL/jSKOeS+Dgg31"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5YdYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoO5Q//Z3EBSRsriACt1OGX3gbNUK/ldVdOZjDHfM2LbW388qMrBuz3\r\nXMexGRgsHErWyRU/IYq+fzdJfM+2WMrpupLLTlOLW5JqiIsxejbOPdSG/cBs\r\nZVF0QQ2k7jTeQOI5zWYyWil2/5yYOlvz/8IN1Bz+Degic4mATiwlLObGctmF\r\nOjf6+GrqcAYppB2+4T7//plhsAKl43uxPzHxDaJoTgbt6IotikSy7CVDvLXS\r\nkbPp1+olwFjMJWfSJKIS0r1q1YNrZbnegtO/uJUwcWrHzHyRvDHdQlcCOHCI\r\n9XAbDsQdH7YpSv4JejRZ7JI0JOuhOSnNzuZ2Ku2VCGtV9KhjuotHQBpeIr6E\r\np4YvkyqnCALMETU89Oxo+qebTb18TH4gMStSVzeOioxeKEyOA2RIoRSj/u2P\r\nIh/3ar2/7bdnraaVH+9H2lWuzPPR1iuGoPtLCMcQVo71d9HNMBCHjukR7xcc\r\nI6Pg2X+r5x3elpRN2Y2V2tGGdKi4pd3yl9rc0gIdRk8Dx5qT74mHN1IWPqFz\r\no4ssP0LuyXx+9QkyR4RASyVQFBd5SuLeWcU24Pv/cvbPXUZ/ohxYdS5prX+x\r\nQL8fwXMkYpjOSsEDIul0hxlEabaj3W/6HL3YDZddl3yEjZUjSAWBj3VQCJ02\r\nE3PVjk9BNu280FGni9f6KPp3RUAnJ1tJw7Y=\r\n=0Ejs\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.50_1659209560692_0.32217096925561495"},"_hasShrinkwrap":false},"0.4.51":{"name":"@flexdash/node-red-flexdash","version":"0.4.51","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=v0.4.51v0.4.50"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that interface with\r\nFlexDash making it easy to send data to be displayed in the dashboard, and to\r\nreceive user input messages from the dashboard.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTo install node-red-flexdash use:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nOn its own node-red-flexdash doesn't provide any widgets to fill a dashboard with,\r\nit is thus recommended to install the\r\n[core widgets](https://github/com/flexdash/node-red-fd-corewidgets):\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nQuick-start (more in detail in the\r\n[FlexDash Documentation](https://flexdash.github.io/quick-start), see below):\r\n- import one of the simple examples from the node-red-corewidgets module\r\n- edit one of the FlexDash nodes that show up, edit its grid configuration node, add a\r\n  tab configuration node (default config OK) and add a dashboard configuration node (again,\r\n  deafults are OK)\r\n- deploy\r\n- point your browser at http://localhost:1880/flexdash\r\n  (same hostname/port you use for the Node-RED editor)\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [ ] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [ ] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [ ] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboard as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin.*` is a relatively simple piece that is a plugin only\r\nso node-red widget nodes can call \"into FlexDash\" without having to figure out how to get\r\na handle onto the appropriate flexdash-dashboard config node first.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `lfexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-src` suffix, e.g. `/flexdash-src` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that the list of widgets in a container has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows:\r\n- End up as DisabledWidget widgets with an ID starting with an 'x' (that's not really important)\r\n\r\n## Subflows\r\n\r\nIn the flow editor, widgets in subflows must be associated with a SubflowPanel.\r\n\r\nIt's not clear how to handle nesting of subflows, maybe it's just a concatenation of the subflow\r\ninstance IDs for the purpose of the ordering representation? Not implemented for now.\r\n\r\nSubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<panel config ID>`\r\n- Changes to panel properties need to be reflected in the panel config\r\n- ID of containing grid is in subflow instance env variable\r\n- Containing grid has in its fd_children\r\n- The panel node ID is pretty useless 'cause it changes at each deploy, while the subflow instance\r\n  ID doesn't ('cause it's an actual node in some flow)\r\n- Panels don't have any output in the dashboard, thus the `output` prop doesn't need to be set.\r\n\r\nWidgets in SubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<widget config ID>`\r\n- The widget node IDs change with every deploy\r\n- Changes to widget properties need to be applied to the widget config\r\n- Output needs to be sent from a widget's instance node, whose ID changes per deploy\r\n- The containing SubflowPanel has the widget IDs in its fd_children\r\n\r\nImportant: the structure of subflow widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## Array widgets\r\n\r\n- Array widgets have a single node in Node-RED, the array aspect exists only on the FlexDash side\r\n- An array is really a hash in that indices can be numbers or strings\r\n- The existing array indices are only persisted in memory (but survive deploys) in the FD plugin\r\n- Array widgets have IDs `w<node ID>-<index>`\r\n- Changes to widget properties need to be reflected in the one node (and then apply to all)\r\n- Output needs to be sent from the array widget node, but needs to include the index value\r\n\r\nArray widgets cannot be placed in subflows. (Really?)\r\n\r\nImportant: the structure of array widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## IDs\r\n\r\n#### FlexDash IDs\r\n\r\n- widget nodes: `w<node-id>`\r\n- widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflowid>`\r\n- array widget nodes: `w<node-id>|<topic>`\r\n- array widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflow-id>|<topic>`\r\n- config nodes: `g<node-id>`, `p<node-id>`, `t<node-id>`\r\n\r\n#### fd_children IDs\r\n\r\n- widget nodes: Node-RED ID\r\n- array widget nodes: Node-RED ID without topic\r\n- config nodes: Node-RED ID\r\n- subflow panel: Node-RED ID of panel instance\r\n- widget node in subflow panel: Node-RED ID of template node\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>`\r\n- output: `nr/<node-id>`\r\n- group: `<array-node-id>`\r\n\r\n## Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the node (config) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n  \r\n\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"70b966cdf593639546a73ad01b85f86c240d8cba","_id":"@flexdash/node-red-flexdash@0.4.51","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-tz85XIf9sMQIdiqlMwnOl49yZlBoNsWgE/+XGiNn1KXiOd03MEstU/prxcRfxQyCz2SkPnun2kgW9d7pIR0QAg==","shasum":"182cf5774b05374890d200d0a93eb06e2231bf7c","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.51.tgz","fileCount":88,"unpackedSize":5887189,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxIOMcVVHtjS5deQh72p625NO4ra+3S8+N8KGxVqZvPwIhAO23/wwM68+NBISlfvPa5++Qd9vZ50HwKZkBA2nGwChg"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5Yt4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoT+g/7BOgfHJkHeDZ/3GUULIeZE2Gi0uolP9+uGp1FhAOAcNQIIGHe\r\ntuUM7V01QBJs8wpKeNxWkrOmUHam+VsNzbCf0dzyuk86Uho5ojm6W6ywXJLd\r\nI+zx7ekyF850sayfnXPi6aPGXzqEN4ddmg587LjfD391iOuCj42SytcrlG9G\r\n43fSzfzYaSLNhzJt3i068VVMX39MglExeZENng0IOF5Fb1lHa7C6YWiTaoVV\r\nkA92ByJDsvr/66RV7zF+UfOSapQscpMmmqCVXxCHaasxiuMr4c/TKTQnez0t\r\nWTAxnARquEI6XSq4VdmnqKFOK4DCtd0Dz5LAuYaTWToqEIsCJqHFznLHmPUc\r\nS32f+hucLAsBzKWPt/6YdVEkNkPKLxYsrxFto4QA6Er5Iww7mfwUJQUqn0Ja\r\n29AxBP0aAZfeydwXdeTG7qB5jIUi3NltnpeU71eJn8+8a++d/8Fg4OFqlRRd\r\nQ8xEbdshqUC/vQ3uUQ/yU3lKZKijfPtls3/ZvRgzTIe6X1CaMo6wwJaM3mI8\r\nfdgqs+tVLBVJyYkoBs2LkXt5j1125fJMgjaFvirNk3PyBdHYtAqz6+iuXKEH\r\nBD5lqPPXVDtKhw/YjG+Idrc6iPbvDynCaqO/vRmTAfId3F9XwM7H74go8S8V\r\nv4NsHgEU5pIz1mCwsFJWaVciRLfBbK3P9HY=\r\n=jC8G\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.51_1659210616482_0.4519111074797213"},"_hasShrinkwrap":false},"0.4.52":{"name":"@flexdash/node-red-flexdash","version":"0.4.52","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.52"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that interface with\r\nFlexDash making it easy to send data to be displayed in the dashboard, and to\r\nreceive user input messages from the dashboard.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTo install node-red-flexdash use:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nOn its own node-red-flexdash doesn't provide any widgets to fill a dashboard with,\r\nit is thus recommended to install the\r\n[core widgets](https://github/com/flexdash/node-red-fd-corewidgets):\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nQuick-start (more in detail in the\r\n[FlexDash Documentation](https://flexdash.github.io/quick-start), see below):\r\n- import one of the simple examples from the node-red-corewidgets module\r\n- edit one of the FlexDash nodes that show up, edit its grid configuration node, add a\r\n  tab configuration node (default config OK) and add a dashboard configuration node (again,\r\n  deafults are OK)\r\n- deploy\r\n- point your browser at http://localhost:1880/flexdash\r\n  (same hostname/port you use for the Node-RED editor)\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [ ] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [ ] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [ ] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboard as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin.*` is a relatively simple piece that is a plugin only\r\nso node-red widget nodes can call \"into FlexDash\" without having to figure out how to get\r\na handle onto the appropriate flexdash-dashboard config node first.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `lfexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-src` suffix, e.g. `/flexdash-src` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that the list of widgets in a container has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows:\r\n- End up as DisabledWidget widgets with an ID starting with an 'x' (that's not really important)\r\n\r\n## Subflows\r\n\r\nIn the flow editor, widgets in subflows must be associated with a SubflowPanel.\r\n\r\nIt's not clear how to handle nesting of subflows, maybe it's just a concatenation of the subflow\r\ninstance IDs for the purpose of the ordering representation? Not implemented for now.\r\n\r\nSubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<panel config ID>`\r\n- Changes to panel properties need to be reflected in the panel config\r\n- ID of containing grid is in subflow instance env variable\r\n- Containing grid has in its fd_children\r\n- The panel node ID is pretty useless 'cause it changes at each deploy, while the subflow instance\r\n  ID doesn't ('cause it's an actual node in some flow)\r\n- Panels don't have any output in the dashboard, thus the `output` prop doesn't need to be set.\r\n\r\nWidgets in SubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<widget config ID>`\r\n- The widget node IDs change with every deploy\r\n- Changes to widget properties need to be applied to the widget config\r\n- Output needs to be sent from a widget's instance node, whose ID changes per deploy\r\n- The containing SubflowPanel has the widget IDs in its fd_children\r\n\r\nImportant: the structure of subflow widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## Array widgets\r\n\r\n- Array widgets have a single node in Node-RED, the array aspect exists only on the FlexDash side\r\n- An array is really a hash in that indices can be numbers or strings\r\n- The existing array indices are only persisted in memory (but survive deploys) in the FD plugin\r\n- Array widgets have IDs `w<node ID>-<index>`\r\n- Changes to widget properties need to be reflected in the one node (and then apply to all)\r\n- Output needs to be sent from the array widget node, but needs to include the index value\r\n\r\nArray widgets cannot be placed in subflows. (Really?)\r\n\r\nImportant: the structure of array widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## IDs\r\n\r\n#### FlexDash IDs\r\n\r\n- widget nodes: `w<node-id>`\r\n- widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflowid>`\r\n- array widget nodes: `w<node-id>|<topic>`\r\n- array widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflow-id>|<topic>`\r\n- config nodes: `g<node-id>`, `p<node-id>`, `t<node-id>`\r\n\r\n#### fd_children IDs\r\n\r\n- widget nodes: Node-RED ID\r\n- array widget nodes: Node-RED ID without topic\r\n- config nodes: Node-RED ID\r\n- subflow panel: Node-RED ID of panel instance\r\n- widget node in subflow panel: Node-RED ID of template node\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>`\r\n- output: `nr/<node-id>`\r\n- group: `<array-node-id>`\r\n\r\n## Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the node (config) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n  \r\n\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"8745052d9aa318407a65a67ce576d8c2b8cd72a3","_id":"@flexdash/node-red-flexdash@0.4.52","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-0EawqmVUrd8YAMc5d4nG+cQUZ6qrnjGimDdHX55S7JHXteHxVGc45IhGC8ZATE9/pCI11QjQZO2Vc/pH2nKZwQ==","shasum":"81dc939a2995f5dca7a26df7f0397dee0ac1ec5c","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.52.tgz","fileCount":88,"unpackedSize":5887185,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH9ZoALC+jZQZ8xfCFfeHHRqsMi1719DtYJChnhRwBrOAiEAm8UtUpcec+6PAF7gA+OYpwxi08orBS2lrxjR8PYmVkQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5YyHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqvSQ//QR/MGh9CZRlxYsjtAod0j1WL/pPbqS80hfSTq6+hzUEv4wce\r\n29HNJg19PZpYUmmOmz1EC7AzcgZJ1ysRuAZZpSMx8UlPcInLt5ugLhB+IkKl\r\nrg+MpxGOIqJ6cUd88hLi5YLKbdXbOMTcJjf+RYxGYX7jgR/dbpMv3ORf3Mx9\r\nIsn86R2kBb0ugVmg2A7UJRxz5egAbAvQCFHzvZjhEjOoyFG9Q+L1JSVpJCpP\r\ns/9mzZQC9oglaAsCNY54dN9wKzQb7A0YMgzFT9ACakMhanPdxmL5gVwK22Q+\r\nRl3vUvMZ8KiyxWbU8DQE1PRTrn8aLKONSPGVazp0yVnKizqdXFTYFqn7dViQ\r\nT7pmR0I4Y6Q86nyqGm0tYBrqrDtOOAqIrmr4qOpw46gqhACWLA0ap4fpqec5\r\n9j5N6wTP+4cMKDiZKmlTYLFYbGRahDe74lKe/rIQt7R5kHhjgaYX+l115vxT\r\nwIhsxlPs2p4pmG6OO54yVxoecxoAPXwysGYzYFC48YknHKg39wKsfNqoMReM\r\ni8q8vfRLR4bK0Q3Fi2ys4tolW1IyTj2QTO7ltxNTL6aewgZZlwbVmXVDJ8cs\r\n9475xqec6TG2jZ2MAoQLY15BPWY8ztsLaYpz2iGgejLERyFFbP6k/0YV4i6N\r\nN6/lY2llDZ3GfRM6U/3WrzddDJx87vqBseI=\r\n=uqL1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.52_1659210887659_0.2130583864754172"},"_hasShrinkwrap":false},"0.4.53":{"name":"@flexdash/node-red-flexdash","version":"0.4.53","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.53"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that interface with\r\nFlexDash making it easy to send data to be displayed in the dashboard, and to\r\nreceive user input messages from the dashboard.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTo install node-red-flexdash use:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nOn its own node-red-flexdash doesn't provide any widgets to fill a dashboard with,\r\nit is thus recommended to install the\r\n[core widgets](https://github/com/flexdash/node-red-fd-corewidgets):\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nQuick-start (more in detail in the\r\n[FlexDash Documentation](https://flexdash.github.io/quick-start), see below):\r\n- import one of the simple examples from the node-red-corewidgets module\r\n- edit one of the FlexDash nodes that show up, edit its grid configuration node, add a\r\n  tab configuration node (default config OK) and add a dashboard configuration node (again,\r\n  deafults are OK)\r\n- deploy\r\n- point your browser at http://localhost:1880/flexdash\r\n  (same hostname/port you use for the Node-RED editor)\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [ ] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [ ] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [ ] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboard as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin.*` is a relatively simple piece that is a plugin only\r\nso node-red widget nodes can call \"into FlexDash\" without having to figure out how to get\r\na handle onto the appropriate flexdash-dashboard config node first.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `lfexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-src` suffix, e.g. `/flexdash-src` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that the list of widgets in a container has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows:\r\n- End up as DisabledWidget widgets with an ID starting with an 'x' (that's not really important)\r\n\r\n## Subflows\r\n\r\nIn the flow editor, widgets in subflows must be associated with a SubflowPanel.\r\n\r\nIt's not clear how to handle nesting of subflows, maybe it's just a concatenation of the subflow\r\ninstance IDs for the purpose of the ordering representation? Not implemented for now.\r\n\r\nSubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<panel config ID>`\r\n- Changes to panel properties need to be reflected in the panel config\r\n- ID of containing grid is in subflow instance env variable\r\n- Containing grid has in its fd_children\r\n- The panel node ID is pretty useless 'cause it changes at each deploy, while the subflow instance\r\n  ID doesn't ('cause it's an actual node in some flow)\r\n- Panels don't have any output in the dashboard, thus the `output` prop doesn't need to be set.\r\n\r\nWidgets in SubflowPanels:\r\n- End up with widget IDs `w<subflow instance ID>-<widget config ID>`\r\n- The widget node IDs change with every deploy\r\n- Changes to widget properties need to be applied to the widget config\r\n- Output needs to be sent from a widget's instance node, whose ID changes per deploy\r\n- The containing SubflowPanel has the widget IDs in its fd_children\r\n\r\nImportant: the structure of subflow widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## Array widgets\r\n\r\n- Array widgets have a single node in Node-RED, the array aspect exists only on the FlexDash side\r\n- An array is really a hash in that indices can be numbers or strings\r\n- The existing array indices are only persisted in memory (but survive deploys) in the FD plugin\r\n- Array widgets have IDs `w<node ID>-<index>`\r\n- Changes to widget properties need to be reflected in the one node (and then apply to all)\r\n- Output needs to be sent from the array widget node, but needs to include the index value\r\n\r\nArray widgets cannot be placed in subflows. (Really?)\r\n\r\nImportant: the structure of array widget IDs must not be used anywhere to drive logic, everything\r\nmust work if these IDs are replaced by random numbers.\r\n\r\n## IDs\r\n\r\n#### FlexDash IDs\r\n\r\n- widget nodes: `w<node-id>`\r\n- widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflowid>`\r\n- array widget nodes: `w<node-id>|<topic>`\r\n- array widget nodes in subflow: `w<subflow-instance-id>-<node-in-subflow-id>|<topic>`\r\n- config nodes: `g<node-id>`, `p<node-id>`, `t<node-id>`\r\n\r\n#### fd_children IDs\r\n\r\n- widget nodes: Node-RED ID\r\n- array widget nodes: Node-RED ID without topic\r\n- config nodes: Node-RED ID\r\n- subflow panel: Node-RED ID of panel instance\r\n- widget node in subflow panel: Node-RED ID of template node\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>`\r\n- output: `nr/<node-id>`\r\n- group: `<array-node-id>`\r\n\r\n## Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the node (config) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n  \r\n\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"48d7fb5b83c53dd24209996a8e54102addcf7db6","_id":"@flexdash/node-red-flexdash@0.4.53","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-bduKmKP7kLHrgX3sR39gdYv4DXSP5Kgyf3WdJvB6t1fxJyvBnmem5Dnc76bhirijbQGccQbL+nDSJxf0p7GZ4w==","shasum":"25c0ccc76e94d8b7d6d93e23a8e47f34b721ca9e","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.53.tgz","fileCount":88,"unpackedSize":5879859,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFVtK6gkUJvf9R4WGydj5GQXn8eYDyOTHz8G7HzmV1SEAiAKqVr8XG0sn20ahYLkLrphgLmEc0T7jOz9OYBaOhLYIQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5ZJeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmroUQ/+MgUy0DiQzgU4zeFYYaNY5PaZyscxDSJPg4z474p6KV4g+oAy\r\non3QQhtrW6nLva/JmGEirjXqvFDoh8Kh6hDM7/p4fnxRDPUkXxPc19bHgC91\r\nJt8SiIhS5A2pxPIG53YVOG5rnGtIwomIq6GhkP/8oud7IhlJGAXe83/S7FT4\r\nQ2ez/arZlfeW3o4CcY1sPsH3b7PxwcJLvSRt/soEGpI5JO9JJQP1/KDRENB6\r\nPXKFM/OQjkjkEQm28WQd7HDwdjXO/6FASGxu4YmvRy33Ra3PD6ThV0wPTkRB\r\n0WLlMyJt6y/epUUlFmIPM0gLR4qOVmY/yM7vbgz82dUh7zEDsmRdjUke/vOt\r\nLSEiXStVNlhRuCPOutA2ppueyFmXvQ4RzJyBmEy8khEGtaOgDM0QOsMUYdkL\r\n6vgAFmoKO/0r6iRot35iMnVYGb1VsXAdyvtcBiKXvbdN0+B9t1Lj/smTf0a+\r\nGtYgJTU3aAiECtfw8HktmyiEETkyvoAXWsZKllV1XfI0H/0sJB2NurqoopTc\r\nhByfpDuf1HbGLlpr20ggxnLMNezm+E9S6Sck4+kM5wONYRKSL5khdYgQ6Tuq\r\nTtNFQVqgzc6K7VKsTnp1F+AsIwy52WeX7IfszXSbij90jJL5V68G5hmkfbxY\r\nYqWHohffPaKyYHxI5kuOnSu0uIK9UFXJwEM=\r\n=ut6t\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.53_1659212382497_0.8960700993589381"},"_hasShrinkwrap":false},"0.4.56":{"name":"@flexdash/node-red-flexdash","version":"0.4.56","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.56"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"a7a1051e6e59c957b70d1f9a47917de9fb1d8963","_id":"@flexdash/node-red-flexdash@0.4.56","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-YCV2Nvd8MVKRgDD9sEa2eWE/hNGh56BPdWtdQqcLOKOwdc5At3aN8ZsBuIUqcUQkFHR5C/hrIcOprkCFnL+lzQ==","shasum":"eac387e50fb375272c19881f3b037f6ee167c3c7","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.56.tgz","fileCount":88,"unpackedSize":5883989,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHb0e9b3b61eFfzoFHeh+ikT0LheK32O+f03uOIB4WFwIgVCj9pOvdXmANKysOe3NOe38zD12iHVaqCVdldx6ngGw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5tu1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpT5A//bbr9xKz+VjUJAVXvY/64z8pncSuGTNG/+tc5TnRCCUZvYlpF\r\nQRSx58jRjsefpleIR9nInmZuuRcgZGVVHm7zfiszfBIYYpDXzu0PLJupwkSl\r\naj5a3pLA2RCQxSLwyWNZQ1/YOjx126Sp+/nwnM8JYuoLoHmn91r2M1RcvrI8\r\nxXGlhnUwgl0E4bdAw15lGge8AfWmo2i6Ki7DnbyyCCSmkfLc1gYGR0OcAf85\r\nM+KiGupW/0fbjaM39/NWay73Rl1Awrs5Bnc6L7jkS/T6KeSpToJreqJSncmC\r\nytqXKmB01OrvIP3RTCg18LOC7TXPmmQsQ7G8Cmk6LqX453dZxCVFgGzotfjD\r\nD3N8isgh7h3GBCWCoiG13MslV88mAAM+7b4E0TJ4nmJgH8ARKsBfro4FsUFo\r\nkEO4BspcqdcW1/bxyeoCKObEwAfmnk9U96DLV6pbuXeAZ1UQ9d3o1hw6Bf1h\r\n43Bi+m7lBeWZzrzFFifs4PUhgrralL4C8tFtvCyVWPZyzKuUKX1DSwELbMvG\r\n7364Kla4VMLJcqxIFjzX2cwAy0/wP14QmQ3y1ilE8U6iPgtBe7zYmfdCVP30\r\nqH+aoU5VitG23+wP1UlP3xZ302aaDr8Ml0Qj2pHCTKU5LZiEAVVVC6GV06hj\r\nGllMD2qAT3AyquanJyR4YZYay2XBMRbqspU=\r\n=00mZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.56_1659296693027_0.5705456215186371"},"_hasShrinkwrap":false},"0.4.57":{"name":"@flexdash/node-red-flexdash","version":"0.4.57","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.57"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"5523fd56dbdfe1169a35ac8d682f43db74644dc2","_id":"@flexdash/node-red-flexdash@0.4.57","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-PPM5KEO8CkRfi9sU0MCQhi86mFepfcXt7Mb98LGT//RCKiawmET7ly8c7Uuucs/OSM+DmJO/cCoUd+C04mhPbg==","shasum":"9f59e2373d39bb967326bb41fa22c7ce4e91dad4","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.57.tgz","fileCount":88,"unpackedSize":5883988,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIoI0xczopEWskr+X8LFROKkZDk3PV9QgluBSLqdKQ3wIgI8xJxajn+qPF1noxpBkbKSMBfXZo8/JY+J5SxTMFnyk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5twRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5zxAAnipUf3dBjeHuDG6gpEXFFCg7n+odx+ynAiMr23ndpX4+i8fk\r\nr8NPfqLKKbq6yuvgYX69Mwa/gQRSnlYWyejYVCCpfeCINEN58bQO3gE79oUS\r\nJadTzwS/fVBJHH8I7qyGUNbIqdG7x7EqTMnZmw+Q1mh8tqNnGfkzAFCH2fk0\r\nB/oAwe+LI1fCIkCIbp9filjnkt2l02nNuRlNrCGXn7dXnqrFRYP0v44yx9kU\r\nIxwO4hZk6Otbeg3ICPsLrHpN3NZxVrcHkWHa/NFX27MgHHmTO59tR9VxVH8b\r\nRAmRPnLECvJ20bp+j97DsjTFQyBuyz2EsHG7dsm4fAMHd9u5nBnGmFYyAFdk\r\n0s/OSDjjsalgb7TpVdyj6o26Qwc7lCIy+Cr6+V8ErYz9vGMJ2XI9AuUSTzSu\r\npxOtWNG0WKxA2VKjic/ceJ8lkgz9H80umzTeykBTkdC6+KI98oh+vozdnRFA\r\nuOnHa/04UIoyw1veaJ4X16nDcsQsFQz3lXu67L/gFeIKXhLS9Vm4AZQl0nm6\r\nCOvFU6vanMMdD1UQD4Vbort7iHADSmKzucfAY8QvGNuPaqyXaglKP2WEVkKT\r\noagg1pQlleWh+z3oRSUH9rfYU/vgtF0EA0xACWMJmjlDtdOL4WAwXM3aPY7z\r\ngLinYNOHakZGfp63a+PAyewOxAaXzrJoj7c=\r\n=li5P\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.57_1659296784790_0.3153897062280093"},"_hasShrinkwrap":false},"0.4.58":{"name":"@flexdash/node-red-flexdash","version":"0.4.58","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.58"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"161410c146c3a837758d0e218f19e3551c0790e1","_id":"@flexdash/node-red-flexdash@0.4.58","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-qITt3VzBtXbrwGuoBLp0tY64ErjAAnLvytzyzESaxDQxBSPyLt1Hg/GQ+fmXaGJp/wLWW/uyGv4+Pio5+8fFZg==","shasum":"d79aeda97f1044d63c551b4b21feb1589aac4744","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.58.tgz","fileCount":88,"unpackedSize":5883988,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5Suc0S3axUNwcVwqwM/7JOLG0B5XZgvs3G1/hV19rJQIgQF1n57DockyfimCIFbdp8Or+kW1tn5oxVG093Ere9jg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5tz4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoEMg/+PtjWBEZOtxHHCVKsZJ9te7Kow68k/CnOhzilP+FSf4Z4IsBb\r\nlY0K60lA5ajyD+LBQyx1vRgraVRPuihRERlswZpz3ufJJGJrFJgzdPesCv0m\r\nwoQ5VWRtxpeNSBg5zajZ0JhCNgcCSHgH8td0/XykD4DJfioDt7umO8w06AEV\r\nWnFASgOyffQQqlT4EsHFCwPqBbksIUWRTlTAVEfvL3gPMsgsqbtYZfjfLU9M\r\nMhKGSBRfbTl0abKiLdPTi+ZzL/+y0bQDilNILmyDix6RagOsoZQ3hX1kXm7Y\r\nNWqO/c0a3T0lVOEH3Z8+10manZ0DoilyeIK0W4RLErleeSh+yHU6Odb+2tDY\r\nUsg9G+ckAUTCQAhADnHtsxeNbvS0/98c84RjSv0X5T+26SQLIlPGz3XCqCGR\r\niIKPiwqnVcc3p34+MfRWCov2+gQIglPvpfCt9bG6zFuWYofHAivpUSDg9j6f\r\nJQwQCLDMj7XA6eSAm9+SSenp8LAqQBulJ9cl2tCC+qckjLPNVSwT/xAmBJc2\r\neQxyf5yPAYuaa1b/JkGkZ1JhFDN7lYOA5rBwjXsy79oWo19a50F2uVk2mBK7\r\n1FWcfVctWywQC1UXundZn0qbVxIssumx5rLxB840l6uIAChItKiomH01KyVE\r\nh+HFVBRWcxJPaGoOILipUuztGB1NMSQ5QPw=\r\n=R+T9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.58_1659297015961_0.9028476264265426"},"_hasShrinkwrap":false},"0.4.59":{"name":"@flexdash/node-red-flexdash","version":"0.4.59","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.59"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"40e837d2a41374abbd0c5dfea07aea66875bbadb","_id":"@flexdash/node-red-flexdash@0.4.59","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Bg+BGtNmpXUQsu1N9IrDoyIjPiUiFH5JdI2/lJPdbhmOi4dHVJD8lQGV5TPkPBKJmyQPIpLC/ge/TOlaxpleCw==","shasum":"36602187ac6ad03303be25016ec8912dacc1cae6","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.59.tgz","fileCount":88,"unpackedSize":5883988,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICJlyEJmvLt6lAkfWbat81WsPd39ufPm7ASE4OBvJrFLAiBEWcA4i/ovMjUYze8AQsTujrzauDvwgFgtF9TpaMvtGA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5uElACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqydw/+M07jc8CMI7F9wJ+yjcGLuPsBYD7JJ8ybqXlVBwfC01xAN6rl\r\nYhi2IjdJR+P7AtzxrgbP+TZNhMSYs4yL7WesTGczd86eggkLbglOlCvkK7Rh\r\nVXTN9MZrzfp5+VAmGpGfXlL0GN5j2HIySUOCkTtDljgIpiVsqyYXrdoxu/17\r\nKbpA6C+Yx0geBqpMdmck/8Szf8XEVgH0jZHj6Xv/G1A2Yaz2oaiS8tUJe+nF\r\nnagcxV0CQjkRD3/29xo1xyylcEyUF2FQz+gLacxYtRopyIQsTpRzhBFC5TQm\r\nAto0DRWtyTjHsQSk6kbcJ/QcZqGC+EJ0bBM38k4LHMqmWzsg7zDFz3Bi9yDk\r\nQTJiX2/kehZFWu+QX4scJMu6Kw8NB+Mcb/st7IB8T0s+7J7yr3zd5eZUQyJr\r\nMqjUSxNu/yeAuok5eWLhBJOhgsfDnneuAolkxyqPzDBpJkzWyHCgT7GkqgDU\r\nUn9bRT7QcJ3gC1AbEiV/b/5wlBfAqtgN1Bv50bYczPkscyNGTdZofSRMo69I\r\nfTVpzaDOHZlPTGsHm8o3QifdOYUSqNLQcu91rKJJ6pxOZQtCf1JzF+nrAc4x\r\nIuKMujqEnUFCaqPW3ibBdU/cPJA0l0VOb/PKA8soGcGHxb2OTmCGu5T4YhQB\r\nK421RglIj4Cyz2pek3PJSjFOgacwQMjbHfY=\r\n=bN9B\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.59_1659298084996_0.2360847544635889"},"_hasShrinkwrap":false},"0.4.60":{"name":"@flexdash/node-red-flexdash","version":"0.4.60","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.60"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"3c54493a7b6f8473da766f3a0bae933ff3d2eeb3","_id":"@flexdash/node-red-flexdash@0.4.60","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-ZHGx19QzZYIvGFkaD2diDgn2upkZWqsrZ1nW3Psxu/jgszyzAo/AaAKIWDBmOod+l5EL3+wz/eA1lA+b1vC29g==","shasum":"ac340189ccb2c3295fa74f0d11d0ec714dec6e00","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.60.tgz","fileCount":88,"unpackedSize":5884018,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBIdjp++4mD6SZ7SZFxCqtTN64KuXG+7Hd4J0vc7N+RSAiBKtlMncVHeAbTWT367MzHjhgmiMvItjpG6GyiMxAZlYA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5uLTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqhdw/+IHag9un5gGZeHEC1hA3r0okwEH8+R7yldnIiwasW+f97im19\r\n6GPYG7LhRFt+1aZYLNsTJBqGIyL+nZeHRYjeaI10wNhHI1uQRrv2bEXM7k6X\r\nGqyQiaaBt436t+csHYU7imR+JqbtHt+3LGq48i8K49Kooe9S4sNzI5vykHUT\r\nxKKskR72UxuDz3YK/M3Bm/AsjeHiYASJf21tUrAnwwxzOt6ybOEyORcGN1Vc\r\n8RhaDMCpGejpg05d1LzOMER7z5NeQ1S5ez8hikHuV/dF9e4+NxeE2WHIUu03\r\nA1Q3wRyTTeQh81FiTx/9wdexA9JZG3KRE/5LBDEtEkCl9nV2398PSppzlHbb\r\no3Y4u9nl/yx28j0x6y8TTOqo1le9ZX2lVH/L7OREmyV4NShkBt1pro23Axlv\r\nKDVc3TQEkC4fhcQRL/rHtbc15Hi0b0fhAgDTWpWjnDTH3Kl7Uvp85/tGvHMO\r\ny2gMTGKQbpf7a1X0uxeqam4w/uG2XbCoBHzThMlw8HMqy1LBgAumNe6Ak6BP\r\n8pyW0UYleaE7EL8VJ96XMPMAACboL4FdypR8nXvoDK0LQ8yBCoxiMhFbBACF\r\n2f4H+IuSCtm01L4eSsPGp0YyI6zUaivOKKEPDVqO2qAg6SkysM3j7PtvVvLj\r\nT9rgQdz4gzBEDe2P8aKRC/daIplblyES3Z8=\r\n=GJ5V\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.60_1659298515303_0.8397777354943663"},"_hasShrinkwrap":false},"0.4.61":{"name":"@flexdash/node-red-flexdash","version":"0.4.61","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.61"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"a9e7a8fbfad15412b1085ced0f171a0803e4fed6","_id":"@flexdash/node-red-flexdash@0.4.61","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-T1tCGyOhDTs2UNm2BKzkwdIhbNZT7mupAMCVuvywCvJOwfefBEKzxuQnxFrWC4wgmYuR2GcLqwZiIizTvUEiPQ==","shasum":"662be72b8f8c5bb5cf14d63469159d4c431779e8","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.61.tgz","fileCount":88,"unpackedSize":5883977,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuI1fFpOlK7l8qPzf5rLcj2uTHXoQ23DU8sbwDs/yaSgIhALB6vDHgHVa/zGUDWRV733an4X5Y4826kBJpl6mvhFk7"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5uhmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqikg//TruVh80Zt87s7/SSUeLvZ/W8QAvwSkhPSvXkBxKQnCm20bz+\r\nQwnmgF0AkQFXgqjB6yDjtDAh9kIeQ/wG6Wl0qP0VZHj2a+uPJZDH+TyTjUO4\r\n68pbU2+EaGXz5nAVnxxsut6UPR+U0Bgm8amlHujphI06Nqg5ntsj/JN+FlRJ\r\nxmIwYk3cYnaSpJHiPCo0u+6sY5suUi2EmTSRq/V6esKo3MsrZFNPFx8U+wws\r\np7K2RMMwujzZiXeuRd2QbvPk7g/13cC3aHuVAmYPjV3PYdauV1zEjTKJzjnV\r\n3ssBbEYoTXuJMvo+vqwugl1jFkQCUxdDx9QssVXyT8nr8H5kDEl3blfjTgZ3\r\nsK6aUX5rV94WQW5dW2jXHbvklDiaa7y0h4RNU6xYUkOI3AnDqVVkKcaBRnEk\r\n9KN69Idu9XrMXvtVDREUef2kxW9k6Yc/82Wfn+2EHzW9avdre33UrwdCmX6N\r\nPktoYe8MZPdwPLnf1BvYlzKByPHE1RLbPMaMvwzifw4qEXMYvcP9v5Cf7sN9\r\npFtEMaOiJ1boBPwR45CndJfXINFJsSGCIMU9TY/Yg+j/pve3/vtPCoPHbhnj\r\n0onAr3DMBmpoUFrQ6rxSMkCLTmMLO7lr1yFFMLben6IijCoCtZCo0TPfWZfo\r\nI0HQM9irRyT9YBiMECBcLnVdMwLT6vYh5Zg=\r\n=ngrz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.61_1659299942384_0.7395344636595849"},"_hasShrinkwrap":false},"0.4.62":{"name":"@flexdash/node-red-flexdash","version":"0.4.62","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.62"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"4c9d144528b6cf964a7a8b33d06434559c257a4f","_id":"@flexdash/node-red-flexdash@0.4.62","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-PQABkfkFuvs/kkIb8noGGH9Lvkyk1M5wYTur/4fG8OkUSX276+IDtJ2bvtE4xoFqEXUiFtwkN91RZQ1OkkQz6A==","shasum":"cb6497b839d8c300c433fe203e38068992208602","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.62.tgz","fileCount":88,"unpackedSize":5884007,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSKGxGTEM6MAyn0MBclmP0fh9GB2aRErpFsWAJqrDCdwIgP27XSLNk6aesSp6w8rBNgCg9Yb/v6l5yliC//tu4X5E="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5umBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoStA//Z5A1aMz7n5j1/zmk02cV4f6nyEv3iaKElyNyI0fAAZICCPzi\r\nk1WV0l2cQ52Z8PyXWRsu6a9r/RknAtHN9KVhMCV1/vNEFJFZGewf++9CS0jL\r\n9bafApFuCtOp7Iu2Epn6KmQynaYGhJwojs4sKP8S3uW6qInxEMM31A2upLyS\r\nOFOGd3xHBQWB9X2QGWavlixNbDkQ8WxxOXs7qdI0jOrXelsnNV5C5uV2Nkkh\r\nEIvA33Syp9LAFeDLtpRtRlLltRvhfnC/8k0p4yjFK4Z4MLRaFNCrKhf9woC7\r\neTkYpzruy2JOby9QeGmLzg/kjtxK2HD5NMP5XWR2u3I5LzKu6fVj9K0igALj\r\nJITzfr893o0qDP3nAKrBMELGAhjmrEaMKDBLRs7HYhDyQqRre+PSgGzdjJ2a\r\nZqkr7bIvWres2j8+G1iavadADitoA/o5jHXvzKPpSXsqqfbl7iSD09hzdOYQ\r\n1YguuuWqNDn3EoFXhTyDN359Rjxn4sjwVZV3R04/Wy73GfpHfUVEE6c9rEW+\r\nsdROIameYhBkhVgqWLKm0QIUw49wGIuDPywjtA0dBF3dm9rX/OEt9HcILvwA\r\nbBSxIOOjGJsqYyxhgSH9Gq6Cuoy4BeBt4rTvW4GqDITGU+V1ha6eLwVQkCj3\r\nwrIRcC8Hg10FTFC0RO+rmX6PpOKPUeGk+m0=\r\n=L91R\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.62_1659300224732_0.8985326050217608"},"_hasShrinkwrap":false},"0.4.63":{"name":"@flexdash/node-red-flexdash","version":"0.4.63","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.63"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"f9623226719ab8850b76af0ab273ff915eefce87","_id":"@flexdash/node-red-flexdash@0.4.63","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-mYN7BAogCX4EsYIFiMwozZvHgXj/qnDXDAnFpby3swHObQAKdVg6Ogql+VacUJ08u0VZWojmGEmXwFLCQIX7zw==","shasum":"f778bd518a93dc7795f821c56cc754318647bb7d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.63.tgz","fileCount":88,"unpackedSize":5884032,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDs3jRnMbkqEfcYvKPdnuI3ZEqDZrbHUdv7roS3CwoqIgIgYKpREojJaqMBLow+AwRfDoKe2vP568FMo8iwct0WtnM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5ut8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmooVQ/9GeW5ZoGeALK/u8MVnkLtlcCqPvXTbMFIkDi5aCo4qiUOv8vo\r\nwWuRdG07MVs8D5C+Ksy03muv2FGvQMY1t24ZBwfbQT4JuTsR5uZ0rhVN7dWX\r\nQXk8LAbJBF8Kh8CYwf/pey+G7vH3Em5HQkYP6t5Hnu1m+enBz5ErmtEo2ZTp\r\nMD9aRF03fz5AauU0Xm6KKUZi6IGMB8ZFykpRTknqGt3HMaJ5ECz4YP7AiNsm\r\n/8erBYs/PEpffMdHCzpelkDDgutGdfTZwZEztlGaUsBhr6L/wskegSpwfs1b\r\nSUIuqZCTI+DVCAphkA24CMLaKE3noPc/AiOIMS6ePef6x/y9lPKFOrwPO2ak\r\nIkYsIQYVgOrui/DxD17XQ9m5XH8rT09+YCC9//2Q/b5BDZW03qoXQ2PMUiD5\r\niultQ5SWPojKJnTLNNcpWZSTsvNR4ramU+vEBb9gN021+W2IRe56QyKfCAXt\r\nTuo27IV2nixqcFgWwtdIlQqtdlndZoitav5W9PB4dMw1Tki93iFGAKwmYVE5\r\nTuFtksO24k9ozgC4XxCkTi7ssfAq/mNHuY/S2hgFx4+F4EXyq/U9tz6pFnQg\r\nVapGN7kKOtur/8Jy2f/WOJPdKRvqlq7b3MSM5lDOlYwAmF9w/4IjnGI6K113\r\ncLJ4Ene7r+uZa5adYenJyuVgXCz4Mp4s7Yo=\r\n=eWo8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.63_1659300732595_0.029589093015346624"},"_hasShrinkwrap":false},"0.4.64":{"name":"@flexdash/node-red-flexdash","version":"0.4.64","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.64"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"07e354f46a8590f5a298645f3d15ee67f38c21aa","_id":"@flexdash/node-red-flexdash@0.4.64","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-GE+RwgpIWvo3istkLPLS/G2/Byii21gCI6DeaH6PdmaOIQUYH9cBra2o3f5tQLnV9GpR/Bo4X0tyF7e1wWWsNA==","shasum":"cf054b6fb236bc8bf828b20d404feaedfec83668","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.64.tgz","fileCount":88,"unpackedSize":5886726,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXCTSZGgff8Pzxj6ugLKs0mQgHmPzldyDcw5AqXI7KNgIgXnCqthujHrxlNwxcx6vJHrqgtgw1s3jO6S98etFaxQQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi51E8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoTLBAAjh6QPCD8Py0Z8Ri3G0smyjfpu6EM9PQ9WT0AOChgmWSSNXvt\r\nSnorSxoj1oHn4w48dogtYfIuyK3karUSGW40hLM0uTIT9DTrQT6ZaHHZbw4i\r\nFLr3GgL/SzL35x6l8xEEER6ZQV3iNX0QCo1C0T8cHohr7T38vRVjodj23Jck\r\nzhUlBlw8tHrtYHZ0DzsB48kaMPC7MD7rXBcbMtCl+v7RQhsda6N6PExz0UFl\r\nT2OMDGisrN2D050FFDuZsZYM+loarnwQ1djW2WuGdVxxYb+EsSPpyXdM+REK\r\nZabGB7x8DSdRjc3dSvcTSL4tadlDiDk6+ma7H0St9Rq9gm+s7S2P23cwjtbL\r\ndLcarK5Y6cxCocsAK0Q12/pipuZOTse3VM+GviUB/TBgm01hAIzdDeTLHjjy\r\n6zI5eBCfWkhV/iN/knMCxuXfjh1imBVgN5vFNUeH4BsfZF6ZqNlhVQMSqwSd\r\n7G4vy4YKQ0T/GEg2nXVAYZLlnAt3Ny3XqFwwDFbs7fdygGa4DlznFS83ircM\r\n262R1vM2a3iRzfPgkxXOkv+DJYbuHPk+N0s+k6PeHbWbdTpw66KHXyqkVAD+\r\nixm5UB8KEkLgMZrFQBsiTB6bicA2Vu7QGz+Ccs2IXC/uIK1cZ97fBD6mdUW9\r\nUCwFxTDtutDgMwDnacxg+vcvKscwVdJb5qo=\r\n=6Lej\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.64_1659326780534_0.1918273629470344"},"_hasShrinkwrap":false},"0.4.65":{"name":"@flexdash/node-red-flexdash","version":"0.4.65","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.65"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"7b9d4acf3f829a06ebc55f6e4db1722f03e024d9","_id":"@flexdash/node-red-flexdash@0.4.65","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-t/XIzZOVaHU/mtb7MUGg7Rf2bq51SNEr4zAlHpH44PIKp1aQvMp+HciLxaBiN45SGQFq6znJXVXyDfwVla/ndg==","shasum":"29bce59d061fbad89a218fa26d17590bad61c55a","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.65.tgz","fileCount":88,"unpackedSize":5886557,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHrwJ0/1i8SXzR7nvWZuxEPgrKZeZocQedCyBnV6gG4ZAiEA32dhqpaT2ymwyNW7pCKZe19JbCgWvBBe14/+8lpOE38="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi52IsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrfkw//Qhbc0MagY8iIivzSUlOZPGx7r3VMyuOge06cAhAYcd/Qz0wq\r\n2OUbsUrzTFYee6mS2CDicXRV5BZjAnVwOVNDNIpqReN0X94H8+ATMeKOkf6k\r\nuIGUFPxTPzIXVxyygw6Au7oXqZzSDJQBW5X9+ZpitGA0LdnbX1dIwzXWXjq4\r\n0bI9WxNY1flflXCXsyI8z+zLQ5ClXX90AFEdDo0ilJGnUrCm6+GfjrFU5vVM\r\nqfLsLgV35whRc9LnxAAp9v0u66iLvnirv4gH0HZMBVUSz929/WevtgtgzN5C\r\nZg5bghE1Co0Rkz+L8e/kSd+Me2grGIrA1z7vnjTWNhPx1VdH+eaDriGol6GP\r\nYqevLP+FUQZQPjeAdpWTfhlJdnmAiSVTIMSwKHHsLS9eorO8HBofMHPsetPT\r\neQHuXe4vdz2UnvaKUJYEMNfHnAD4RFOWcIRxsSENvdrxxb2mDhZKZNDGkMpz\r\n930KLEjZcKrstntzs0ywQdO9TrGO8S8IcWnyGtGUno2khMfsLposdp2a8huM\r\ntwA63JFDbq5jNTQhv7pDeUJyVOWSdDrgNrppOojUOVAgdvkXdiWmCLsXeI3P\r\n6yCPqoHAcDc6Ax/UAW0r51ZqcjVDHrEoDPabZ1HMMlsZNECzxCIpayX2aAvH\r\nzSuOyHfAieYxQeQ94GCuifG5eOYfZBOhSbQ=\r\n=Ldqy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.65_1659331115701_0.507898382682465"},"_hasShrinkwrap":false},"0.4.66":{"name":"@flexdash/node-red-flexdash","version":"0.4.66","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.66"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"75e6ff42a9a80277dd41e29557301ff059f9ae80","_id":"@flexdash/node-red-flexdash@0.4.66","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-B4TlrkzTbPy+AcsWgJaNhrfPVLeA7QT9Xwgj5qqvQ0/Nezw0C4ddwjOuzFVaULlKFeL4E909CMP+ftJ8NAEE5A==","shasum":"e092c25dc5fb5783b3e81b46d2c10c01078c869f","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.66.tgz","fileCount":88,"unpackedSize":5886730,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7i6xCoManbAgoIdn0BQBUoD5YZzJJ/LlQptj/ERhieAIgS0bzNRHOWpwzRxttSVwrr+7OBCTE2OhhjPe3/XY7JtQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi52XKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqC/xAAg3G9nGi6rwsZ1j8Hi09X7e9jh1T6ejEvO0ZpNZ/hfW0/JLpH\r\nc+hLID1j09umUe6iq8xzsv92PiD9fXvcgzKsP0kQad3RDC9V00zPY+qCM/yC\r\nXJ1DkxGQDCZJdzUzPX/SqKD3Q6+GnSv4vC2IOAjB97JAGrAM3kvt6r9wZxxV\r\n+xTRpndlQEb9B4r1J5WIvr9hRfInnAt2eeP3dLbQfFtZ2nFOxy9Ydp5xDXHX\r\nzvqkNze0Ep2r/DTqMt7OPQ02UaASxiWrJIofJcKXZhrRHkPRXwV2e16btCDy\r\ne4PSWSHjnc5Vwbg+WjtY6c31u/CpdP09WiYiESlYE4lUaZRmiisBUeLG05DE\r\nqK/sFlqzZmMQkcEhSgtPi1HVYJO0ZrRjQKSKVmQE2NIjdsRFtCBwF8Aum0a/\r\ncEQoh4cyWEZRqfa+1wCly9I82TpVodd25pbmD+Tn7BAsGWLSHPh97QWOAFjB\r\nyJ9zTI0KAx4ZeYB6y6t9FijaihZAvXW1cJl5iXhwjRL2T+jA+pZSfU1XgdfL\r\nuG9EXGC3pJZE3hM6XAOFVyc/i7FOqZfu6im2TCnRRnIIoj6DZC2LD0TTJaG/\r\n7phauJcNYoaDI/EPZkf/+nZZa3qp5FYZrY5WtJ1s+s/ZomSHFxnK7T9k4Fzg\r\nYPKR9Bkfl6D/7vbgOPRHFkWeiSWcvWe9PGI=\r\n=tUOe\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.66_1659332042284_0.6280730253378344"},"_hasShrinkwrap":false},"0.4.67":{"name":"@flexdash/node-red-flexdash","version":"0.4.67","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.67"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"51748a9041a839af6dd243772268038546cdd34d","_id":"@flexdash/node-red-flexdash@0.4.67","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-sEnW9H6nVnysqMpE1zo1BTSI/pBHYFdaoF0KW6aJ0TEjn5stUm0EafM31H2qtkclDri5QR+b689krK03nE/8jg==","shasum":"8be7e15078055b64143b0e1134ecb2f86e3ac5e9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.67.tgz","fileCount":88,"unpackedSize":5886745,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDFgWNqjn+sDqKqxq9rpXu2rYf46YOlSujfip9KtKgsQIgXOFg2Uf3GwWgwR3Z/ZN3ZZp2/htFgUJcd//jHnG68OI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6CF+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqeVg/+NC+XjuPSjrUNFf21ZBr4EfBr0QvFlxXkMtIejRCGMZc+2a38\r\n2JTscif1AWht4daHwReRO0h9u7sEgrSodU6iiTrYaFICa2/Rg8ozysNI3Hqo\r\ns+TtaH33lge8rvKgAGkpJohF8YysKRFP8w97c1Bndb+rurxpx0nG+nwUnJMJ\r\nPyqUHU0ag/QH1xn4lc7oGL85GTaIieBFPakcdX1193vQshwY1wZR7d9BH739\r\nSiPm+Z2tf+SozEc0607GzEa1N1KI61q9h3HlnNtnXJSOG/gkoPAb0HGqNC1O\r\nbrzDesZuPTHhNJGqVPNXuGtuS0m7hsKZiz8BxG/NJbb00uOK49uri+OPL0Dr\r\nadS0cVxq1f8g/5ygRXXeL9DExjek8NT1YEbO15Lk7amcET2EImuHB+W+kdjP\r\ngRRk1P8c3nB4ecwXvFF11Jo6lPcHhsUpvck+qPCn/8e9/FlFlqTQrogrsMtQ\r\nHbtMtK3kCk6qnVhae4bask5jbCTaVWrus/rcVEZS1yu42HlcwwkN4v1Wy8AD\r\nkl1nRe+ilcL8qYMjKA/GP/j5eE+qFzEbpwuphzkvWlLTus96axolQ8dwOGnv\r\nlrXpFaFlWR6ZanBl7yG/DNpCMMGzyRPUQ4ZI1016Cx5oGLXLaAELM/6S/vpG\r\nZsCU85n6VFD4SodkWz+gSDcYh2CuAkxzipo=\r\n=LNTG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.67_1659380094355_0.897086549514645"},"_hasShrinkwrap":false},"0.4.68":{"name":"@flexdash/node-red-flexdash","version":"0.4.68","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.68"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"2092f93da583641a1d0494d8b6c7bd3c3c14248c","_id":"@flexdash/node-red-flexdash@0.4.68","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-pNhOumN22ywSIb8e+rVIiMSjm2lvVl2MUi5e4PCAYKWZ5q49lpIOx34SKotMElbksaoKnTT4gySQc5UDWk5vVA==","shasum":"487723707496faa61a552f2ea93e3e508fd642a5","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.68.tgz","fileCount":88,"unpackedSize":5887483,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9/3c2exMysUJvItHEOJlOQB8UBVEsN7w/j0p2+/fJhAIhAOyseKH2ccfLGc/Wuz7lLWJd1f2CUjvt4nISK/s/rIkf"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6KkmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoeQA//Qtt2xAnz5iBDdPJCQ7ux6WLvV75hhu4IEpHDZP48QRdPu4dm\r\naH1+vowuGOUEWiMOlRaNLIIqm3A+h4tQ1Enun96cxlPYUvPwR6N2vl1t/Xr3\r\niFSLFY/qqEqYkLJdcqUt2dtml5ORNPwEqzBM52yJvdK+FbtV/1/eXuNF+8gi\r\n1+htMrc3rRsibsFHuot1c3tOxDJAJMSSeeidfNiitaARkZNJmtRT1Z3JgvtP\r\n0wUiaOYNp+Q+bsK+TMJdfzxE5HeqGXpLGEhbprzW+d/EQ86ZjxB1tL7+bjAU\r\nNP9fGpoHYZRnC+hC8pnpmFg+ty2/rXIZmrrFCh9hmHphGyMoLJxQLPSou784\r\nAQDvbnGfhh4SKmHgFBoXT+ePgRzRUcumQXdpiux0og+nUeZV7xNouYT4yGav\r\nO1Xoai/fYvH7x3BibhJ22KMR+LlKfsw1jLD0g8OxlW9Ui9E/0QSB2ZpSUMRg\r\nogh9nJBYGkFBf8N5tKPPWWiaSfdBs/+DzpJ3xMkZzCz+xE4PGFmKe+AYKekl\r\n9CqPYO4a1a/jDTwfqA1qpkXOOcsPNhr8u6TWrj3OXs+0B/2ERZM2cEYKA39a\r\nBj5HcJY25gj+zk/Z8gCzCQ+BzSNhFLHIk5GKw9nEeGRbFbsCB2h5PjxhIelX\r\nVGNAI9eYOMsBOP7nZbnjlKDrNsEsDC22Ri0=\r\n=Pv8K\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.68_1659414822361_0.5725058576301394"},"_hasShrinkwrap":false},"0.4.69":{"name":"@flexdash/node-red-flexdash","version":"0.4.69","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.69"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"571b8420d88ce2dc282538c5bcfcbb10bb6bbb28","_id":"@flexdash/node-red-flexdash@0.4.69","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-K4KbjgycLNIjY7haH5JxKS8ru48STQ5fBwY9uiMKtXXOumhQrlOQxstyvKmGnlgiYQ/PYjzE9w1/UO+LMnNXYA==","shasum":"00e3dbea0c296bf93d9e8f8ebf6223e021f43b80","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.69.tgz","fileCount":88,"unpackedSize":5887822,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFoMc1Zrgm9n8XkyrpTMxKeLXI51dGtLeYGd5kFaYqM6AiEAxsXRz+4oxRoHamJcumaubwIXYLO2oxAGCmmJjTLHsps="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6gQzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq6gA//VGcJFlkjGdTMWMBcsvO0764Qm9FTE5Z0mOgZsoVQOVBe6Fn8\r\nrVblQyM8Z5/7H1q42ePbrDtNhDymQhCgWOpjlwViiOdUTm6DuWNyWpPi5NHX\r\nb3crXmgQkM69tVSh1hfe8K7O0/uCxeB0kGLpROXBG9qZps1PewYpDPGp2uDP\r\nHv7xRulKn/PeK4odHuj64xYj9GZTsCFha/Ej6Cu3iPogY6Zv54BEXEvWA+sS\r\nYGpY84ErsVNtiGCyaw1pf7jL4Oq5/3q6O9F6tkdHoCiw3S176g1aaNwm4uQF\r\nSdFmnuMSKsZYdJZtoDxVLTkWtf7aLWx0NPpOvn84io0HCGI3vtCWH3tPL03k\r\nbw1GvWNFdzVH5LzWKsUqLnbyiI6QG5jiJIty6FGq2Mq8oqku4y/Fg5JmG35i\r\n3F2iVfQ9bXIgw52nrB33yYMsbEfx4fU3nzf+us5B6ZdldZTgGPkEzwZBaMX/\r\n5/kjwPF2kA0HgKay2OU4mGEVLe5sS2QumvOSiXcZBZJh4F2FmvPQsf7cW6GA\r\nNHTr75r+zjRJWFIEsDDNWj0h/EGdXfzjSUs2knC7wM8vQ7Zo136QZ6Wg/1FL\r\nq540BthnHJyg4l3r6WiNtu6cbJLRUq4328516gVaSOSMbg9w7/nShgB4wE2Q\r\nDN9ZScyDGd2W8nmIlRyawG7ZqonIgegNhPw=\r\n=AiT7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.69_1659503667367_0.31735876659417794"},"_hasShrinkwrap":false},"0.4.71":{"name":"@flexdash/node-red-flexdash","version":"0.4.71","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.71"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"57c500fd48cdac14b7f21b8d8e9bdbc7d3c30e6d","_id":"@flexdash/node-red-flexdash@0.4.71","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-K62/qi8qeu+bikkOjn62V4MWoczNnNb0cerxIAjPgk3DTU7O1tpYM7XEP0khtVSHAEqaGYaeu2LaB/lrriLv6Q==","shasum":"6c6921461e7622dee70910b2669ca26bedb7e659","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.71.tgz","fileCount":88,"unpackedSize":5888005,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEk4dFIbXrnAk051LaSG0ORWD250Yevcc0/uMYLsYl99AiEAyN869p4H8lWUBAbkYIndGXfJDyTZREK9IksUMYtwwVk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7UBZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpgKQ//dDxS2AGSvsN2nKuhQvfKSP7cWvgXe4GORODYcb1Ffr7UITAO\r\nvFRubHyuQp4S64xH4qtR2B5QnCS8SMC1w+50do0J5weOBp6RKdugfR/u0z0T\r\nDJaaLs2cKdOI0x0ago+fTQUdcF1Tvb27pYqhwsJf/0uouZ6o9rXB/whQUCqV\r\nAtRfNyCNL60F0etECPy84+4a9gBGDtGrgVsCrqglTAj66d2jJm1jbOFCIlQy\r\nbF54S5wvW+yF3KMEFWB7Al0JRcMddkJP248Ks0fcaQkXoTnfnSOhi1QvrOxd\r\nHsWA/KYn6KoW9ebxUohty3mpvASrFFndMkjBceBrWirmqZw8+9ZsXPuZlotG\r\nwKMiv3SobKaEKzn6b421Px8SKCFPEpny+4WwoaWn63vEJlItCwOPfSXo1o8z\r\nDh2PG5ZNTTY4Out2y9QcqdXIqhpJtMEIbCPMWWC2Zl6NykjzLZaLrE9ZfE0I\r\nF0aNNF9SuvvIxcJqKCliCx+caQbWBFayT18vVRA0iUlaOEZUf1EQxpzvg8Gs\r\ne7Ss+qdWuk3546LIwsP7gdEPpFFH6oBXcoJe1fKVcnV6eP16Q+N7qxQpUgjn\r\nZ/mVzBLOzEhW+vqBnnujZwc2MMTOYAQ8iVah5vkBoXYkKj7wwfGCX2yN7zn8\r\n5J3mySRyiw2UGMSQlsWNfaF6gIw1wf9LWXo=\r\n=N+k7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.71_1659715673025_0.5649304740070649"},"_hasShrinkwrap":false},"0.4.72":{"name":"@flexdash/node-red-flexdash","version":"0.4.72","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.72"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"93c6713a950790b5bcc40bab84e97b3bf02ad457","_id":"@flexdash/node-red-flexdash@0.4.72","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-vn8Vys+P7QTkUpgZGQp9FdZ3KIpqWM32Yuf43Lr5dleR+pVxuBvfb0i6bg5IAcNBvEPeFk1Mlf7vsYHVeN02Kw==","shasum":"f7333f6508bae55af485ee9c1d6fc8d3a91623ea","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.72.tgz","fileCount":88,"unpackedSize":5888043,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGrP46b53Z994P5Q5RVwUqFZAgX0TjAJ7vR68MZhJ9iZAiAI4XE8dOwIbT7wt5iJyNAnpawwU5NHREDfoJbTCNSdlw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8F/KACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrNVhAAnM9sjfM5ogpFi/0meflpBfpnL/mWkR8QAf9luXYQLmGPZv9v\r\nMKhCw8tFCSvFPAiRyr72wAVKm5gD/zzxx7vWOf2TsVqREqS7Nsya/MqbK6ei\r\n+EnOSkxVFmbnxkMNqooUis8XPnmiP1vo3U59fwYHBBaWsVe5nVRHij9zlgtq\r\nWMjy3YdtqE8ZBwvQtiX1bFTXPeHD/J8VKk3Uq2SgOtdRAzSQNyCwSmR6QnLj\r\n5lwH0lwf08ZEQV2iKkCyEXudGoqvZM/1nJ13VFl1Ti0VdbOgA0gFG626nj7K\r\nLMCnIpxRbuw2Fl8nghRZjdJL03WuJhxn50RtYKiZw0yM8/TIXQ8R5vISE+tz\r\nCA9rNNfcLEiATVJB46V8pWnT7QujaiRL0O3Nb+J0/zue5xlYUYlAldd993oU\r\nrp85J7m3Jf2xgBV9Qb1EqjME2nM9ZpgTO8oc2RVqe2QRB8Te2xxir5DgQvZL\r\n0eIZA2LO3nlO8IIXY5ZhHjVZqzfVR8Rmf7GVTGBgFP/J4rDhXkLCL4ACfGwB\r\njY8voLIQfQcqW37PXq2K68o2O0VPzGbw+KGSvnU07hlrIo3DRa11+Xg+loCd\r\n6VvhoGOmv0DLiIMeMyTEPp40/vKpaOMr6ZTtgyGdOBgOyM6ysUExlSKbZYkK\r\ngtcoA2BQn8s4e4oCv5w03lcFI1RvRthARzI=\r\n=nHze\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.72_1659920330160_0.9214093856806749"},"_hasShrinkwrap":false},"0.4.73":{"name":"@flexdash/node-red-flexdash","version":"0.4.73","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.73"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"da7bc8862aa8e60b6a8dc062b49b39c5b2761d7a","_id":"@flexdash/node-red-flexdash@0.4.73","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-/xAkzU2Z0cB19ZDmdQDRFptsr2WXlzuzivl8Lkg2UArBBN0MioVo/9KU/viY1pXt5w6CpKbqUnyI3eH0Yn+SlA==","shasum":"7f2a812cd6ad56810a32f1496aa640eaca509bc9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.73.tgz","fileCount":88,"unpackedSize":5888560,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEnYwD2pTsdXMb+KorrVWZi3cx0GpEl9YKB0d7URLBNsAiBjINT26CdqsvUB/XNiYuBr7K0LTCxZMASKVv+nRwwQ3w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8GP+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqnTg//cpqBVDmlqB740DxxkYwtKp4JOeROSctO87IHfLM+XMTzsrjg\r\nsUlXW9swqnSTEVlc3TYPi+bSpnzOa492KUNs8o2BeyOWy23TSvt5y04LliIj\r\n8H7IsPpE0mjCprP0sqILRGrbUR/VWv5yCPZgq9yfJQlx9/kH+zC2cMQ/GxPo\r\n2TVlI4zgkpMfXmzzCumFvFXoudWVL1EGjJE9vXPpIp7jt6OsVSWFddlkhhIz\r\nOdyXDHoQ2LIObd80Jtn7Lxda/OS4SNA1AMZPVf+vk55pQHi7OY2TKO74TYTl\r\n7hyYYL28oET1IbFS7ux3nUJ6JubBFY5Vsu8Oxp5/xyt1VgkvQiaEWxD99v5q\r\nCSZ4bv/CD96g+MGujrlGi9FAHvwEU9b58WGEbzytGvhthX2uVhz2HHVMM8Y0\r\nXCH3mNbNGuftvtGpaM077K8WGc82zBK8WbzK9WVCxuqtTt0lwSLsWkCYPIti\r\nDIxSSLd5zP6v8fqRGrutj78u7LjWJC4M4hbXUGuOqwXhs7o3vR65CYOZCW8M\r\nTZ2bbzTueBBIZMnYV38hLncg5RAwJMPLHYRZGajoNSLS5VVIvCG2f/65TMMC\r\ncWWY5V5FRTuxUBgUXmnIo3BJvhGEEkWaOxs5Yqvh+uaqOYoFRhiunAt9PVF6\r\nl6x/FQlu7sImkQJDyMgh3MhIECYdbDo0+F8=\r\n=Zlp+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.73_1659921406279_0.4578180590284284"},"_hasShrinkwrap":false},"0.4.74":{"name":"@flexdash/node-red-flexdash","version":"0.4.74","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.74"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"f7ae6361f5f64147a3ced3fa05b420fbf164f2af","_id":"@flexdash/node-red-flexdash@0.4.74","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-JUsDk7dTUKGaeji7plK+rowodEdDOx0MRpCjrjNJGJRt0qEaVeMb/hVvKhaDSMWW5S3zbQ6jstmtQtF26nyw/A==","shasum":"b41ea1318c3c84c864d44e3a198b0dfa192d9c6d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.74.tgz","fileCount":88,"unpackedSize":5888560,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG8gkUCce9rDCDfGii/kXlhxdU8vAtfOd00CHD1B6JJuAiEA3K2zHanK1vB976M09jVZyJqyjkwB7PBjHJOVCbD0BGo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8KytACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqljA//QMOq02YQ6/ANq4bJoc9Llsf9D3AKCRuPLM1vCCUXSpewjRem\r\nCddbozbVcjtMbQUitqFQqzqM8R8oHz+Kg9yIM6PKsufl6aVNfEUWcnzc7t6+\r\nLmOW5Ei9o2hZVZmPjdW6PM4kDrYJtO7SWcI98BSGOYpUDLP+rmPCIpUyyJci\r\npge+PwzA5WB4jU0wn2CuPNy258ADjWcJDBgLR7Dib2JADkM5R1yaEi0c0xet\r\nFZO6BbCKbgTQOpmNkGdZ6YEvkpTOul/gXSyc8fEPe9wVNF85b+XB8VZQo5NI\r\nGM6vtDtBeHYp++DX634+TXVdqxIvi8TIMShtlw4KWGSFN9vLRM1T3sMvuX3b\r\n/XEnPTT7364/dPq38Pm7Th3lY3w7WNbhfR+ckEc5PfBMcLpqL6APjfik9MZz\r\n9Dx6yo7ID12ehNMhKOQtEOqsNPGvECEioAV0V7QYvkW6XN2p8aCunwKBSHWL\r\nG1/6562fcwIh9s+9yDoktw2jPXv0HFX8+RQxi2T/rPimjoeLx0gqCwRyO3TH\r\niJJTmIypoxMeMBnrGP6DXlVjS7Q5QUErcdOu3dmWa8YWJrebdDlSKIcZIJFL\r\nILrpA04ZI0JnEHjAw8IkHNq/Cd/v9DSKUFAmQFau0sdpHVtoD1LSv4UZcReS\r\nUZUovTRvlHzhB/rZriYKE/Gy/F18+Wi63eU=\r\n=Y/fY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.74_1659940013173_0.2834211088129186"},"_hasShrinkwrap":false},"0.4.75":{"name":"@flexdash/node-red-flexdash","version":"0.4.75","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.75"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"1247408dbd93d7d5618adcd39c93c3a32d9db8b6","_id":"@flexdash/node-red-flexdash@0.4.75","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-+YjgIPYapP4FgtueG2/f3t0T/ottLZpx1pe8VoPjo5ctecK23hpfuUVhIKOFL23WWB8eKh3OzCFQaDtBVD0Mig==","shasum":"10d15dafb781b64bec4e74d2892a99a37ef8944e","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.75.tgz","fileCount":88,"unpackedSize":5903327,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHyg4iHmxQeZQ69BlSmWY8DG0MPrlmS079lLNQSjj7CUAiEA0FYUZsQRLsRcyFQQru1HLJT1/fvnjxh67gJ26IBlglY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8fH2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmph/A//XExjB8+FQC8gz5J5IgulWU1vhGeA1kYtLr91QkZSfmLrQMM9\r\nCL0L0Jk9eVY8D5/CPOxWlfzi/BU5zFcF9f0EMP4/qwb2+HtIx+7lj1eDMR7J\r\nalYyobMxZYocUoGY+USI+17bVksiDGv4Y7sHgxCEFM+Gd37AqeUtsvzsmpfv\r\nZMT8tM/x/rO7i7pcCFhMh2k9v/G2dEqqSAksAyxf75L3dVpHU58tqaalCrMv\r\nJDa8K84hOZTGM8Hy80hNT+FqwsGf0G6HjnjfPx9JUOYvPpmsHC3m6fLu9z10\r\neuS6t7soGA4d5kps68aATKF8iCrI07KxujuXeZ1Wg2zIa6le68QERFy+qiM+\r\n8WMWsmvZubfDmReCkKUO+H/DJeD9JgVIaiF0ELXwdOWYgWSy6uQ1oF+bgEN3\r\nu+AkOWL82svHWYMdalkeyTQgBo0loLhq1bc7JchHUid8peGIYx9r7YwejWkH\r\nyhWagzb7fiN22M74e+uCnGjdij9Nw9Qb4jU1J9028FLKEhj5wUKrMOGfdIPD\r\noWvfwXIlDPXqmznQEgRkq/njbAXwRQ82nZ8LVknQ8BWy5Xo/YEcsn1xhfuSx\r\nC9aoWbUBJy+8TKXlgamtdmztnu227+VrQ5uB0rgzadRGzABThFaprteFYSqB\r\n+H0Hxn81FDLPMMKtKIZwZQdoNAOx617XM+A=\r\n=iZDi\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.75_1660023285863_0.43042006279647316"},"_hasShrinkwrap":false},"0.4.76":{"name":"@flexdash/node-red-flexdash","version":"0.4.76","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.76"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"d254dd3f95132be30c35070ec688a16e749c6755","_id":"@flexdash/node-red-flexdash@0.4.76","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-cCedofHnYDZEXwZI2Fkkf0ZN14bH56O7wz9U0LEb+2L/OmuwDDFPaHzAoOn8JXSxqkKazYKA3FeeaUBgCFi9Ig==","shasum":"bd313312077753fb17dc7fc4ca0e03548609ef73","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.76.tgz","fileCount":88,"unpackedSize":5903327,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnQf5SfQka8EXS6WTcCJJYlOnOSo5WXODgoXzpQpMnfQIgf/8zDby/TgoKcUNHRpvribFj3VJbWL5bRhpSjeOVPY0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8qxJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpxxg//bmAOQU9Yifg1ZjGiR7CZW/ioP7MyFSON/ZATmhHNpxalE6vo\r\nhbPy48x4sIgaQFnzzj/iFPgI0vdIwfHkf61HouYfHht5I0f7TFVd6xttVLTO\r\nJuygC17r8DLH3GxUVadrfMAVYZqP3oSfv7PfKpTqUcxUxsKm81OXHWoCQYtJ\r\nSblVHixgvqRokOoG69zuWleo/4HZdj09SVsUu5i90YkVLadmrE54Kbe1ks/x\r\ntfwHGFe3eL+HeildTfwfe2Dk+YKURz+TujLRhVWrvXRDFIrUgIZPPcA29HG+\r\nGsQCDg/gkP1BFXxu7Gp+d1MV3rKDOuS8llKLwyEaYUhupyCkPPUAbpt73eqw\r\n4pN3kdQWRX2pgX9lN14KEOvbGYCaYSoXgkkg8dykDxEFXqRb80ZyGLSPE+JS\r\ni3tx9X43U1N397aozBWtvELn5aDEFCLgw/T5PKnWHBelo42qORqTPdLP7V5c\r\nVxVG0qUKg9KQlkdBUHxF+B2otIid9/1UdF2a07FENYOxUgomeNWD5o4EWj+8\r\neUX9gbfKRdcSXxK7J08rUZNJerxzk7ANe0o8m/6n5BnBo7HUkxtMqEsEqjDj\r\n/NMlyxRyCuvr01R8N0Vx6Qe+yNGkLcbG0PmCn2L8CCTaYZotS5swt2Xdujte\r\nX8D8QGaxKr2ywqvsC1KuVjF01iVbAC2swFY=\r\n=GqKZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.76_1660070985610_0.5144375825184111"},"_hasShrinkwrap":false},"0.4.77":{"name":"@flexdash/node-red-flexdash","version":"0.4.77","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.77"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"ab28ae43dd03ee7259c5034b65ef7f9516fc306d","_id":"@flexdash/node-red-flexdash@0.4.77","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-JXopVju8T6ronDlopo2om512k76CFw8tHV7g1pNxvf+VqCamVDhYYFm7S0j6AAn+41F7kTDWleN3zJGo+0abXg==","shasum":"84c70ed80e89d8179be4c21e54a4937e16a3323f","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.77.tgz","fileCount":88,"unpackedSize":5903413,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6LcYgbRbFcl+tENxC6PFSd3EWMFcrlsTi7BjTxWuEVQIhANhmzk9asUUxxur3SWgL0B8aNYcXQRGabi0TGLSiRp2Q"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8q/jACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpHeBAAojMvTuUfe/t3x7nKb9UQrRkSPnQsqRh67THJS5482nXTI+6E\r\ntalbUvsjSivrPKX9jRkBxd2yFC3pQmGGeAD0epIFi96St2q2ITlxCDWWeklt\r\nl/xR6IGZZzjEaLIZHrvzyO2GbyepBdMR3syOgE1UZrrLkh79lDZnsnjXJmdr\r\nfeOEaYpBlftI8GQ5rtRPk55itqhka4Kd1P5IcwyY1DUUphiMb69G0hFChy5R\r\nZVwvBYnwv3b5vmawUDMOa1eboFWiIu71TpqLw4llXqsHfXSEwrmeFoIBSufm\r\nRysby9NtmmAyMXUckHR5LdF75I8sVE2s47rM+KqKdGH7LZWd/CKLzKLWmzgJ\r\n8O9XpnDAXxvVT6HgKDSxoWJChxoj5pFsy2QI5J1F5Xep2TGWuAFJd+cv+GFQ\r\noJ2kW1w21u8vk6gPNVelUVHMb0KWCGcfw69X/lwIoUz/hbZlHLV9BF+1SljA\r\nrufDtP50jHXuE65nDTN0XuPJiQuKwRp0isVjMRANxmbkGFEQQxD1XYMS5brM\r\nG79zskk/2OMoWs2IYVu3sNh9b71dd3sCBvp31zyimnE2b9EDvIYeF8xehQEn\r\nYhC1rRyGlfJrlWjzHJOInLj7BifN7ZbHoT1hSKMId3VjkyetgW6+zwPhqkrG\r\njOP46Mn8qTmwZuoKY63gf/aoII47H5jnMS0=\r\n=Du3L\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.77_1660071907132_0.3204647703203527"},"_hasShrinkwrap":false},"0.4.78":{"name":"@flexdash/node-red-flexdash","version":"0.4.78","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.78"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"f12f190e07f9f8e46e826dffb48c9151b1bfba37","_id":"@flexdash/node-red-flexdash@0.4.78","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-3559h9s1xAxFjSOLEYvsntGXTfvFlnVNgG0pkAegZY7Dvb0BYhbOuy4IH2heLOrGAHUxPbbaG4IvVrduuV5fOA==","shasum":"87169294d3895eb901cee2cab178d7778fdb99b6","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.78.tgz","fileCount":88,"unpackedSize":5906257,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAf5jRyy/kf2npw08FmFuarzFXtxshDoxogtdKaa4HN/AiAZ7Xng3pxfXXtv3ZtmJR2uAUA5GVdg6IqXzva5fP/tew=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi89p3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo1Cg//VW/6oDd3LBP1supxP/QUq/pHMZqfvDo7oimZ+wCjNXL+bkgy\r\nG5bWP4wtKi6IsTZfboMoqV9i+FEywksT21C1Sz+n/nUmSMeUHaUg3p+UCK6f\r\npu4GH47jTtR3r7VEUMiasrXXdEE4s6QUfX4g8Tpjone6Xd+Pc/6xRS+5Ezx0\r\nocIc6NQQC0hYADeezQpgFD8w8tBLa8/pEeuGDGRi/vlTtldISfGZZLT1sG6X\r\neFFL518OreU6k3azM08VtomhldME7SB6Afy/6SASvHwBzhZu9MhfLNzFSHhA\r\n4oMo2Qyw2bDs9jL5VZRFbeJateQpCwb9oWhck3u+VJO72IC9iIPkXU0qKrfR\r\ngGOigmb3AYQoQBEI+GjzEWeQhFvJ/fxJ2xSP99T2MJ7rxcXpIC7N/+3kiAVW\r\nvFelkeu5CE68DKxcdbcLz5hkkAyHWhcfoFYabDOZ8rvvuRJGYA9nBk4KFXTu\r\nTdXVWfk/kg9TCSIrPQDhtYXdwWYJfcsMAVEZq2snsmY1kOFkSWinEcKSaGqM\r\nBL2H6L/dAKxMT7GWdTzHOZcLym4HEYQ8ACOpHJ6+YEyLckI3bn2xzXIVkwYi\r\noagvNz+0ESq8SqD5ds73eTy/+gn0iK103eTuDhyzmPKYXuWXvvpxyhGt1g6i\r\nQxSSrgsDfY0aZpBq4A9xIrvtKJVWuUBR8nU=\r\n=reU9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.78_1660148343497_0.09569607511560108"},"_hasShrinkwrap":false},"0.4.79":{"name":"@flexdash/node-red-flexdash","version":"0.4.79","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.79"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"3f2d490fb9a453e4abd86a463d7d53a2fc0f32f7","_id":"@flexdash/node-red-flexdash@0.4.79","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-61dkhfeAwZzQirCZXyNv1QR7LcYcSK1dyrqprEBVsfqjwyDH1YjDuYlgN25HntCXOSLwp2/U1B5azUzbDsOAQA==","shasum":"e9349c858b275cb39748592cbf2ab1e1fbfa2773","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.79.tgz","fileCount":88,"unpackedSize":5906913,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBTXLV+/BJL0iSCDaKx4tpo2M+qh2JnveteeCCD7skC3AiAqlVUDB4fqdGdwowu3eFqT2lf1qA47aXF3f22zLmx8Yg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9IxMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoiAhAAndfEGM6Of3F+j9wAcZgyO/cHNq3UIlcGwhRuM4TTrISR9fln\r\n2zjKCBwvI5Mm6Mso86HeW06Eieze5ccuKGFLzYWsSHiOr/mfPA2NZNlaqA8s\r\n4WVaS8fCjeLkiNgfqs0euRiMeqSIIX2Nt8qZT8IK13D+3B3PszP2SKZNF1ca\r\nKR3t5gOkYzLXe6YqNK6Z2SMg6MD6y5z3SieE034ZME2x/TblRwC+3DmFC7mY\r\nrltsaitVnnmLH2PDdNwnMz6XCleKo4rTpSj0DYAfhvY/uM1X6Xgv0xzsTl+y\r\nJmJsnGUM5h4reWwk8Q9HGFk7j4cpIza3QRcfEn1+t+Grf1BGpWpWKAEMiFw9\r\nDyRKTIvkNullBSuxrzvUZtnax5Xu7QxbAGXEoQM9GNCf1DwMI0rLY1zrk5qq\r\n2OTekSQuuNGOivgA6N2y2VN8MoPVp9vEgMkNiL9CxwZnKjC0mZYTYKqoOGSP\r\nRLR5r7xlSgQsSmVtTi0Asb3L7VwMRMYguiI1S1SaNGKFUZA91m1vqjAfbViS\r\nJre/1zn9MkAk1XNG/DSvm/ccf3bg0HjwqPKRjF6MhnuBirDiWJCMg6fWbROM\r\nMiOzYPaZbDj2tOHsJ5ABSo3ncpmhF1drr4d9IgMzG7gScaLOIM6blnpKZaw8\r\nGqcetl1c1DXygJa9aAL8NPAc2BCEmNDx7P8=\r\n=Jngm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.79_1660193868426_0.9594805728986981"},"_hasShrinkwrap":false},"0.4.80":{"name":"@flexdash/node-red-flexdash","version":"0.4.80","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.80"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"a6fc2ef3041ed73f408462f3d494c9d80b317f29","_id":"@flexdash/node-red-flexdash@0.4.80","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-qjBAbSSCuXAaadBy+LTDVJOIX+FJZonUdyko3G3iw4xdhXxyeki1CmWHzrBTw5EJivNxe3EG0ndm4UGezMxQkA==","shasum":"523e3fa333fd90f035b3c7b25cd2f1c0306e35b3","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.80.tgz","fileCount":88,"unpackedSize":5909482,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEJBwhxvDfN4A5cSBcvFJOJczfhsN9ZerZItbinl2o4TAiEArkscvYCQwo2jDBlTnkQrmR0JtwWbD9sGXx/lXh18Zl8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9c4VACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIvg/8DRNR46uO30Em+TYn1hfRVwNhPJOu8hM7lmcnxw2CKJYqj5jC\r\nbN3Y6HA/3rGIC69FRk3otMszj5cJ/bFYUK0wdChdNbT2iKs/VoubzGOerLYu\r\nHkCKb8Jr7VOniKp7XGH4+eKh9g4azsHlQHDmbRd82KyRsw16Yu7vn/gVBo9h\r\n5KHE6f7FHg7BuCtEIAZOC309Dne6kI0d9Jb0HfiNbiTpHzZgBp8lyzLlzkQ3\r\nwtov4F7wK4nKxLCoupOpT+OgHozpIv1aT9WJ3JkITEvqXECZPu9xTmVu9rrj\r\nXAPcsJ1CnOOYat/6iXQqYgwL4VKHjD7bIO9BlPgORW0ltA+ZyJf/cO7cdCsR\r\nXtGExpqArc8NYEThy0thJyt3AnaOq8v+ckFlt3aMVOxKSEPAU03xkoLPCM6E\r\n7v8vugDstLtid7+WTsh0BybgFkyVjArYBnYFVzIb/ABgknJK93lMJV4+Cjob\r\n8jpy5qPo9hoX7rbBGEUlM+FzQjWzNiSykB9sYNwOooBspt7UKAggl7uCHXtA\r\nI3fSCUXaAeaKbZXQ9e3hFH1uwxX++2lH+AV63Boz5/CCQ/cEUHiHrESGTYEr\r\nK6R/8a7x8tgksZW17p3YEtr1yN/rLH2Uvut8m4uPcqID2R5S0515nXizeRvB\r\nn1f69KMX1GF6ykKETIgXlq63PbszPT9a5rY=\r\n=sJZ+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.80_1660276245380_0.7357997287231826"},"_hasShrinkwrap":false},"0.4.81":{"name":"@flexdash/node-red-flexdash","version":"0.4.81","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.81"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"efa29f113b570c95319c6a56669733c1a1ef9692","_id":"@flexdash/node-red-flexdash@0.4.81","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-IIYrhfJvZAY31j5Qd3xr9IDB6S3jhrYm+IFq2DY4tcdqrP6Zf5t44P/VFeEU26LhjFvGG+YUnPH2Nw9ju6ov+w==","shasum":"370d098e37023e7e91108fd2ba34754ce9bdb793","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.81.tgz","fileCount":88,"unpackedSize":5909482,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBWhsel3PTY1+rK/RDqT9F38LNZcBp2EMw6Idyp25yYaAiAvbfyY17YL9ZDyLmJBwAUVtrN4YXGU8URsrsxYeWQiOg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9ddTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUEg/+Pz+LQPwt0LAjdWZWGpZg1E3/pF79f0S72gUUN/IC4DdmQZwv\r\neU7jooggjcz5S5A1qmG1AmxwODFtlFsfO/fCg5VUcZSgKeCXPceVovVezzyk\r\nNou1RFMobP18EPNo3J2Qq0T5LbX8kpRKWcttFRzlkR32V1bDUdu/lUF13yi6\r\ncwHI46pHC201fGAZgV0iJ6j/dbCRKHP9ASxmBWeFRdj6pDaxbZN4iU1uxCmH\r\nwdKTuuXidkgCj15F30H+IvLgCRx1fVhHwRnRZBK6zq4ceySS8c2Gz18NGH99\r\nJeFowviUb0s1dsCAitfrTct/F6dYqeRrg/gnBI0FA8LDPb7+pSZMA6gstl+r\r\nqcJ+60kgw6XHGqsrA5umxf4YObAH0dh+oYMLOzjrIwKqD23jSIlYbWc/WGyl\r\nGI0JNg90TyLJBYroLazemgLQRPxdyBI1HWOU0iON2llrzaGOfVCQiV0S2+hx\r\nUXYCdyqR12aGx4w0toxEeiVXZGHYOuLzMFIwQLuyzmWdjhT/tvLKMk2C8vs4\r\n2OiKisKEIBZJG6ou0l7D3kc1N2XGwrrr0KZh/cX2orCse+8ngZ+nRH48miIK\r\n7Rs7JZu8glU5MSBquxlSF6nkGZCpav5t2rZOkdc0C3oQL5eLnazhFmdT3S0+\r\nTcWzXcY2LP2Y3feqP0WqlTB6mRHFUW76NZY=\r\n=jcle\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.81_1660278611271_0.1950547693105673"},"_hasShrinkwrap":false},"0.4.82":{"name":"@flexdash/node-red-flexdash","version":"0.4.82","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.82"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"c8be79556b77f5e1cf0878586dc8aa6834298874","_id":"@flexdash/node-red-flexdash@0.4.82","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-upRbMAMUzBKmrq2JkK0aj6j1bLQK9c3cVJcZWPqK3CvC+mLGu5bYEmL9AxluFOwv6r8tls4eHl3c1fJ/YeyPLg==","shasum":"07350e82685c65d53f01122f4c6dea9b4cd41606","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.82.tgz","fileCount":88,"unpackedSize":5909482,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDz7RuBYmHE8tG1ZIhrsRLMmqHEMSKbfU7CLHaBUROhaAIhAL4j+5bW7schEj/QwnzdEtZYhvv2v8LfYUwBjZ1lF8UY"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9eHFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoYLxAAkGxYO5aUpxigHQwvop2isSFwERi7xq0/yYdbiiUlxXh5rfvv\r\ndAVGnMqbEymoO8nMOQvgY9Bg24bsOhGZG283/JQ61rTQDVFK/f5nH0N3TEC1\r\nNdVz1GfMTxr4h3tyCbHnmvuPHNH7xveyoS5/KEUYrbzrciSgl2eSSEJw5f51\r\nPlneS1IrMyeg6Tn2/KkGaNVsATmehWL6ntfgwBxzMQykw3W5uWpzLGTKlArK\r\nFpCOmOEnKzFynbSD4elgLXHRe3gwhnPbFuxk7Whj+unnOIwwKMgP8+9wa/w3\r\nzsOc4ONMfxZ4XAdhKRSJan9yLgqjAMMA6us/QxvGgV6+QzGIRipyJ/fjBl6A\r\ncELLxTWpzS7K83rGFv8jYm50Fu3e8DoBAt2cv0yJruXRKwmfvf2UX8hkgzvr\r\nuX8hXEm1b3jBTg6fGUGNJwcXZDLd6MMVfKznI6I/SBVBa9cmJaw5bJrpZqAa\r\nSR1zf1htQLglXxlHA8tzkZVte7/E3TgNX2Long8tDs8ZsyiLWUFT7Yu0SnS0\r\n0VbmO2REhx4FEshRv8kWh8yEUrSLGzozp+WaKxmc8vGh+OdONf5v0+8mkGRv\r\nIEi5j7ei4bCEUqBEuTd+71pSfiEP2jDtZjOvFHd6tCsBwbRVPEfbBoTcFCcl\r\nPYLt1kVaSmq+UeOq0zHEUOQIf4b4om9JJJI=\r\n=uWX2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.82_1660281285565_0.5609285192352085"},"_hasShrinkwrap":false},"0.4.83":{"name":"@flexdash/node-red-flexdash","version":"0.4.83","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.83"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"267432e36522bfb8cff705342f0f948baac76278","_id":"@flexdash/node-red-flexdash@0.4.83","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-WSQnZYz0rtST44UgaH/ZIrUK2F8HKwI1cDi7oFQ1lovHFb5WKeuuDHdTuzv2cTICBd5q/JvpaVJI6uo5G6PDwQ==","shasum":"1dd7bcd793fd0b15d86482aa405fc4ed0ffaedd7","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.83.tgz","fileCount":88,"unpackedSize":5909495,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDu1B+FJJM/v8XJ1o6DrtDf5efiPQ/R+8OJSyaLP5WgqQIgDm1OgtSA1Sf4Aw6UWzdAVuQtRekTcUMcNo1/5ZheyuQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9eHsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmonWA//a52hr3ulvwZ9AiO53BXMl5pDMDHoNIj/r3HvQkmSdCz2RPL9\r\nndwvlK2h2NEXf7mCmiOdWnxpiIQMTYvkNlc2KGuAmGJ7DDKV3T4lkuMKF9jm\r\nPaax47H2jrcKuP0KBRAh2GipnDiRsO8X0nJPMLvkzZmQ9WXHgRHaccj8+qaj\r\n79MGEBmEKQFven64xAdHkSzk1gjJPpS1B/zBvQZssJh0MwswN4iSqetzJgwo\r\nKO/eDtoRM1uNLLayIAtIQzMDBpddacNMibnNgvdP1Tpk3LyJqq5nTyGSqtlq\r\nHiKMA4aYrB2EHFUtottnn9DhwtheH+Zf4hvoFtZhvqhxbmiqSBLSLhPBh6DB\r\nBM9jX9LrgY7/Chux3rr+r4b773eO9iyKCBWEGUhkO8WC/1JyQQeuev63E8lY\r\nDi6Y/ilqPxqkH9GJ6AsHdKyQix1NOa3e5IBj9J5lzYkJYymwHgBIpQj8nR6w\r\nHHxlX5mCuytdw/FjRezkvv6CYeuisTsXIrzlf25brYegPZuncwXOuqIiKp8f\r\nJu7ls5Pj6gwvwdeSlQEw2ac4L+KeSrHGg27YSnvbla6s4Ac/tdjKt8cqRjEZ\r\n7opmXxNDiajc6eDpgWtanRZYA+RlV1z+q3A3WyIcNsOB2rf4PrqokGX7iTNY\r\nRBf/zAkNagHizPBTtlYx2Tz2U0QrRoylxZg=\r\n=UgkL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.83_1660281323992_0.6330260769466312"},"_hasShrinkwrap":false},"0.4.84":{"name":"@flexdash/node-red-flexdash","version":"0.4.84","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.84"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"44ff7b1ef33a5aa6754012a74ecc5cd388792b5c","_id":"@flexdash/node-red-flexdash@0.4.84","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-jhRtZJ2DUbe+R6LczUTeVdp8CXCaWijP7pfgFpxB9GnGkcv/ErQ4JOhC4AnZBIcxPbLPx/32HPKqnkE6SIiObA==","shasum":"cfa707fb26bebeefbcb866fbf3d3aa9c0a23f268","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.84.tgz","fileCount":88,"unpackedSize":5908494,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFnKYNnk8iLVVr4cG8i1AH7CIirb3IiINkW5e2NtBDmAIgS/7e+iBlg7kRWU98IcGMr6dup5vIRVKV1ypeqTuqFrE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi/cEeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQ3w/+NIowZtVvIYTU9zYSug4lovz65N5Yvr3LHacnzSvzSCcYcNzV\r\n56UhE8db5yy4Mm76r4M/MbiESXy/QK5PdYV8nyPeouiV6VjVXLvoVOskPQL3\r\nMq3/Du+LbpzRlsa7eCPwPpzpiCB0d6bUugIqacDvtl0sPcOnHo3+q0IcPeCn\r\neJMjF4tMLLrglod8Dq/rQdab0F8XzvndEUrQYcK4PDqcwNZxxI5ca7PInsOS\r\n22781iebtCMiRmOGhxR03PJRGn1ZUwLa8EDlP9lVO0RMLv7Y6iMRpP4I7O11\r\nis0gYCwoXlZd/6LjaKYcqUQveJljaHRi3wQeO9OAA2t2onWa2dJUOYxRYfeD\r\nLR7hjI78gcdrf0cUDpCy2RQ3Wzw8uRyUtpojydQrg/Td+ZtHPnP+SQFMevSf\r\nKlo0yjRCWIrHvbVLijiIsfiyVVc8FNuDY5RER2P+emYCKXVIY7C7aTNncgR9\r\ntznKE2i4xQsWpipgScW63w16l2adGb4MyOSsjBczjE6QOE5M2q2aBZDLaK+I\r\nAZ4+7S4jVN+Be1VmsgrHTnm2bOvZfOFhRHeEZUZaA4OuB4FVudez9h5eMD76\r\ns0rRfmMLv2wIbrKzcYTID5APZ4EqA8V5cyht3FdsIHxVXb7mRG1XpRAJ6xPQ\r\nkz9IcgadpuudmxGDz5zbJW9zWcWNc4OF880=\r\n=itqI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.84_1660797214543_0.8866928772876093"},"_hasShrinkwrap":false},"0.4.85":{"name":"@flexdash/node-red-flexdash","version":"0.4.85","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.85"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"cc05cb47fc76757b1a45ce105c54355febb97581","_id":"@flexdash/node-red-flexdash@0.4.85","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-UEsD1pt77aSRy1I+RUWpaNFt57MsThOHaQt4ptkFzf5RiKOPuHOYW5+G2JzBTq9HrGbKptb7/sk2QwoEDVqjUQ==","shasum":"eb5abf886782c9a652054bd6b0423e9ebed52328","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.85.tgz","fileCount":88,"unpackedSize":5908627,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSjkVfZTgz3gPyRhMpwysFOKNXGL7DUkb2vQfUHKSlyAIgB0LT6gsFv8d5g0mMC+9RG3UjLXT3LN/ffh8WihPO+Is="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi/pitACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq92A/+IVJNEwqc5LD5kHyr2xWVlQp81TqsRm2hwfTLjpjUvC0JTFuH\r\nXvSrSZy19A80KhvKXYwNaxc+9G1XTL9JCn8MqKoYo8czV4kfVrdeDb0Njo61\r\n6vJoH93PfJ8QlDplGarbiqODm1XWmMhBxL4xQHn42XS8ArID3f465h9H4h8K\r\n/CH1DUEYpis40/j9xOWTvxAh4zBItT/SUpS3GGrDIXTZycR58yqaK6Jguvpb\r\n3dq+mySWjLFMR3octEktWhEKjXNaiFs8x+GnRGnFYOBOs69xFSdqlh1tadIp\r\nTmheH34xPfm9ExFw6gb0SBHVbnaMzPNqbMnHjJ+yH6m5LI+DaDCPbiO4/Pvk\r\nz/0o5Yo9tcDBISVP4etoz0VnyLI6Mb6iD/Q3hZg3Nc+LMQWEdX/7Fldpyxbq\r\nssntYSfhuPyOad311hAx0wswlv8zi9D2tBMSQoySra/2Va1BHa9HWJHVNqfd\r\nA1JdFFoSKUeYB73e+g+X1DPcAejGPQGthPIm2mFFr2TzT/rfMYmw6M6hUrOe\r\nOEYEzatunYUOXkD3w47Dh7mN1RIUDbFDfWUsFXQtCkDjqNjUFJY4A1r3OYvq\r\nNV7HIVABaE/xAyKNfGJ44xvZap8hCiKM8smc9CgxI1C7HgP84nUaEMXDv9rD\r\n3Ry72/iDfa1fXTxQGLIPmlxi+D3bNikTSNI=\r\n=tc8R\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.85_1660852396833_0.999510816898576"},"_hasShrinkwrap":false},"0.4.86":{"name":"@flexdash/node-red-flexdash","version":"0.4.86","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.86"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"17472cb4605109bb16f57b1e095fc4493cdc419e","_id":"@flexdash/node-red-flexdash@0.4.86","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-F1EkxXaO8f8z33KY1x/9Of/Lr4VPe3shWE7m35uB/cQYWnvwewea4Zb7jktutzY9xbQOWqu/s7O/naNhlydn6Q==","shasum":"4937932f256e3f955b38c0ae40b166a61b3c9262","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.86.tgz","fileCount":88,"unpackedSize":6004270,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFzNThxej2PDTVr2IPrDdH6FnRrTMFDslZ06BfOoV56cAiAghCB+GU1o26MwmWcmYKlZVT1pqVMgKHasN73NsGztwA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi/vt6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo9jw/+L6oeU3Xh953trm9oCgiAAiWYmIR/t0ayGO/6FSInmtb0VIkT\r\nalZCHcarLNCOODIUE3oVIvE5HRyx04uZsPIq3iwN3L6V3f8xFJJgI8qmcEw0\r\njDkyQrarzD7xQjAuFwkdHXcSw6msZASRw3Qns3tEXK0qDm/dL6e1ydG2SDqv\r\nZhpuODvcD6vU+Swaq7PVFfDm+C6Dr2DqRNwF1M4nQ05ow+nvQqm2thrqrqWc\r\n3a+29LbeFxISmwmrp6sVQauuwGPBS+ZgXHrWaGzfrtBDsBRgdbfocDFtJwMb\r\n45EOLr3gMVV/OQUIJW3DL2Pfdm7ogXQCzUiWJ4tOTKCZleJ/7adw2GaitbbQ\r\nQ2IsKhPbxfBxy7Vt+PoOielTmEs2YbU1Y8Lju+uaW1D1GlydQ2UyzNpBwnC4\r\n/MM7FqZMgDx/uz94MFsYdgC7DCVptcRQgt/l6/MYORJZHMGe5oq5wUBNrptc\r\n29tLU2/RL3C2vGqLmV2H+BLFSq2iAPGn2Z5Bux9FLvGk/LPmEA660qPjgWYm\r\n/9ljneDs7xySrmkHRGVC7BEE2Nfas4K3Tcz4YoDEnwcaj9kSQxHMT6n03T+/\r\nfE+aEp9RN9tT5O/zyYb62y8d3SDS0ZYI9bO3XqRi13R4vmSfArVcdBfzXwOm\r\ndKdiywMCcBbfIEQ2ejTENIcuqZPQ2hC3Ha0=\r\n=rqQ+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.86_1660877689829_0.30857153987977193"},"_hasShrinkwrap":false},"0.4.87":{"name":"@flexdash/node-red-flexdash","version":"0.4.87","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.87"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"1a7217aa68b536144a7ff3b5d4eba915dfea7e78","_id":"@flexdash/node-red-flexdash@0.4.87","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-rMQ7rbttLgLMESiK7GS0eNyOQHGdYpAuyj37BQgtOaFyrsJ6tGhTIqD5jvs/TjDCWjJ0LGaXse11AcVQuX1k5A==","shasum":"522c78faefb504bb604ae0a42cf3d5dcb47b4dda","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.87.tgz","fileCount":46,"unpackedSize":5183598,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDaorK5F41VKuybVoPinXVeqWbccuEhKit3xbkShLjJ6gIhALfefdfUot87lB5PAEl6BOILmDxxNMI9rrwUWyWB6jhF"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjAQUPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq/1A//cAx82dL5SEuCKf8JTqn+cI+MWjsPC5O0CbZLuD3oFADEXMRW\r\nMnflT5I+rr62hHaD4a95xltrE63U4qjPMsMjycLhj8YGxJ4wpyTDFQqGD7tt\r\nm5wpcUfFP2VkWJ16wYUVYi3F4UPo0YAI6wRdgEX8dwCgQ+yQpbJf/9tVXXQy\r\nf8e/moS0Y7LIjRYFDH+mL8y9s6y9BJjmpROvru2q637JAzUK8SCY39Iftu2M\r\nmqI4O1qL/OC8RI4woSyy6U8JXDILVv7GXuU9X7QgCvxfeik0R0ueWCsdDJJJ\r\nZ4916uiDDy6036V1PxIy9Gr5AdVnv6cAocslYmCzhsBUsXTq+CSPz63Cvmfc\r\ncykog9pKF3RLOzG0h31Xxa0tiy4VhbD1Fw25Jbe+Gq1vDRrsxf4K7Ktj3nns\r\nGdaRtulkJrjmIDYuXGLNpQ7vuVgJECSnQNuY/J8E0fevLjeGD+zEkuC2XS9w\r\nTT7fQkmEHYXapdmNdpwitUMO8dszOVaMpuIxeThdEzSPG10wGX4nKRR60Cy5\r\npqinkJmO+/mRMRZH6XIppqazmltfePW/diQ+P9q4b9G1OcG5R5jqeCfwBeZw\r\nwSOkSqJoKaWq4xu+ZK/lqE6xiNT5X9UUw4dOseHHYjdXlm3W0Iq/uDhs+XLZ\r\nwcVGMV33jLjWHQvXKvRG8qpndJlcMoMnnas=\r\n=JTit\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.87_1661011214788_0.049961858091370104"},"_hasShrinkwrap":false},"0.4.88":{"name":"@flexdash/node-red-flexdash","version":"0.4.88","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.88"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"384ee02bd8fe168d1f1c02beaaa31412cab953d4","_id":"@flexdash/node-red-flexdash@0.4.88","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-KPXnCgyVCKPbr08jmsPq1yI62+ENBHZkQvuDeM5DrnZQV+EcdXIXzSei5318E46PGbH6kQWA6Sz+cDc44OsaEQ==","shasum":"ffde2243f433dc9ffb14961c91861c0c471ae8cf","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.88.tgz","fileCount":46,"unpackedSize":5183885,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLmkB5rIieDGUZgdT1DnkPP7YHWAM2SXORSKb1mxFCEAIgFCHQOQEmtS5413uAO3xuhxSztIMGyj5q7yIH3Rcepak="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjAQVeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQpg//cR3pwuGc89I0N0LDfK7/0UjG1D4KJSgbaD3W402v7ERX9JxK\r\ncZo9mpjoOnGfq3oMFdXILv1gfqddnWiMISV8zBAaVdTaqpnpZ4BKMcTTh1i1\r\nQflTR2ink6pVJDYpb4r+q6B7FC8z+tG4Q7uh3cdO/NHm0sjL1YDmhw21DWJf\r\nIiQ333DEGu+OC/8jp6Ud5hidE4Xwqf/w3yQHeTH1/SgDgU1XY1wNCb2qDM/i\r\n8E3McGbMVd7Cu1V72QFNgnBaLVApgf0Umxf/k/BMNAw9PQ1e1zKQFn+HipFJ\r\nDR7m2cKgykVgz2QVF2LS8GcmSnNtEgxHIAM+TasCtwvmpshprcFS7aRVdSdX\r\nVygzL6GGv5hAt2HtyEjTYL7eQ2WY+X0Xgn9iA98D8suGtstym4YVpxxEYrvi\r\n1BGF1GnzNsr0f+jzcwDIjv7VgjoxVHlKfJkj4s+w1o9cA5hEa/AOGlMEx+cD\r\nwzl7TtSeNTMeFwsMmh6vWhxzMxzsg+1Kvc2HKrK50QIgvykD4InUIH6VhTSJ\r\nT8RmFsfRayj81k0jGMF4pEa/a/lJazHEETG2E2NFbK3y/pt4AcM1Nq9O2ukn\r\n96d4czwqP1W/ShO8nxdfRvlB3c4tMn0+5BdBr9GEZ2xRC+zgP/RaIVQACik6\r\n/on4KwOhui3TBituSGc2aIO0IMHz2RhdV8A=\r\n=WKn9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.88_1661011294090_0.8298869949386609"},"_hasShrinkwrap":false},"0.4.89":{"name":"@flexdash/node-red-flexdash","version":"0.4.89","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.89"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [ ] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [ ] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [ ] Wrap onInput callback into try/catch\r\n- [ ] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"54cb8ccda79a3faae347811e1d807c377963589d","_id":"@flexdash/node-red-flexdash@0.4.89","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-UZO2rq6dYmSy9OpUbTajyW1hANDPjyPO7/PzoBVrSy0424WFK5w9NTbgmqzFdbBF0Qv3A51C1ol8NhQ+1q/oiA==","shasum":"d107f24e6034a41c2513c9bfac361362b776af13","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.89.tgz","fileCount":46,"unpackedSize":5184564,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1cvEHe7Gg8o97GYOz5p1b9WDTyB5VrmFoLm2mnXJ2wQIhAJPdP5/KHZt4VEUiuC7l+tZlj+1uyr/d4Efv26HhUoec"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjArRwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmohCA//TN8NWVw/SPpW1vVSTdjE8tEA0nK14XX23VZpt3g0iA8vhh0Q\r\n0gX69WBhOK6zkX6OWx1q823yB3MHkgP1hGy1VOU20tLRWCIJ9JfybCX0YijY\r\nZ9ec8zdMrxX7+UOKL68aRljGaQ7lkM9EANr9pjSDkZMhfRWd6X/kvfrcTD5Z\r\nzCxE1rKTt1De7wrneUzJDQ/Bp9C/Jh6z7VabLImGEELhWefJlsLid1rIp+fj\r\nG4cItna7YvUAu0UskXBWFJIM/uNZj0vA2xN5H1z2vRKEAPHc4hRQ6k6qArSI\r\nDogc3EkscVzfEGa9/VwWPkIQQ2TQQEvbFj7buQdjMXYlHRqtibDglWi46Q+M\r\nCX9GTmKUxjEo2uEuENTKlRVAuPNxcRQFWtB5utffprt17W2isWUV5FInFG1q\r\nYfQLJBPvup8XZbCIxRd7vn+mkq6l+DdsGQuOfO77pISOwSR3jQvCYuQsTAbw\r\nu3/djSHYHdtnhNCNwiROFcwKF/bsHSgxTYlHYE+h7RWmmolDZ3tTXi1nc25D\r\nJkMbVe1FUmLOnuqd6tFscZI1rhL8GFtgVwQJEJWxeE//rmfoMDIz/XIGxJVk\r\np++fwKWlUgtBEFiAk246V4/qqiHLl1PdYXbr6Nei9YKVbwcW57zppoNRtcnt\r\nDlNiQNC9kj5nAG7Y3HwvYgCjdRZKSbli4wk=\r\n=wpx/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.89_1661121648310_0.23476455531131513"},"_hasShrinkwrap":false},"0.4.90":{"name":"@flexdash/node-red-flexdash","version":"0.4.90","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.90"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"91c8d29823280fcd47ee9eeae2c320d428409844","_id":"@flexdash/node-red-flexdash@0.4.90","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-YBvmhSxnG4OjdKtRw8iXjzpGMcoF7hs3HDrtjO7mU/+uHR8oDZXXilzMdvzCmSHIaR9kGYvx/IngquuR1Mjzvg==","shasum":"c44079effb3a20cbae77e993d4169867d6a22517","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.90.tgz","fileCount":46,"unpackedSize":5184564,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFHhRD1mij209u+CP2XVS6tIEg9x+VaWEVp1spe34txtAiEAnbsOHYvVXOZFN2Pc+eiaQO3Plj7GQUtJ2v/EbNMdx00="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjAra1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqrFw//UktM29lPEpfLTWoX6GY+AbPTC3AfG4xTdzuTnttIxQ9AgCYH\r\nzV5h6r7ykbaOHnhRxpLxVkWLKnI3amyqS4p71fBcTYOfTiBATzOKk9G/c//K\r\nwx8hMzoWDAfk423q+eMXmb2lKLHJF/wYPv5yB07FzMuBzhm4M3b5U/k8PIId\r\nn9hd4nZGv0mG6sSgQwURAIME6tl2DQwAVCB4AKlzLhB4KPozgzsyTeUm/f33\r\niturfsxD/UiSNkI+AX+l36bmpNcktisgYHYjmMUn61wxuvMOfL9HE5MQNssR\r\nTbf636QehnclN/90odIgfZqtfBrEuaaz0LfwASQGzVzt9h1USuGpWJjSSEtr\r\nJLKvHicJ0NLY1Ea7KVAYBdxZiUCKdB5LfN9YhY2guLskqsI0XXMI5Djuz+ws\r\njIEyx8E8UXZwNgk3qLBm1HP/Nmb5xW6G61Da+GzMpQX4CkjyYpXBCRgtGTaL\r\ntMs1H6VFOJClvGr19SxuhxvvnyOihVw1jHq2/0CnpK9lZHCJid/qnwtAaSl8\r\nn6U8hn702aCnl3VslFoCNTeD70aF+VCoc8BhK2IZLTjL35JFDGxsfg2a7IxY\r\nsn8P6RY6xKMvKLzKBwdJsnxR7tUGj4t6LlCT0nSl08QrL2sXYBxWaHNM5jiZ\r\nUTdbeS1xLJjT5iuaxaFE88pGvwz+hyUXJtc=\r\n=7tWw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.90_1661122229149_0.7698516988947797"},"_hasShrinkwrap":false},"0.4.91":{"name":"@flexdash/node-red-flexdash","version":"0.4.91","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.91"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"c2f024d3079e0048ca547dadfed1a0e422e23a45","_id":"@flexdash/node-red-flexdash@0.4.91","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-gmO4y2U9c6LPVHJxFSjdGkljnkh3Axbf9+r2YaJIVG4EwsZNqcoJs0jADo4q1aYnOLmWXrDNr9eNkhl4g8LNyg==","shasum":"24856e39ddfbc656ff4d67aac79893ec6dff6abf","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.91.tgz","fileCount":46,"unpackedSize":5184681,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBcNqeDolLd3sD+ViRu0EuzvMiuyqQ4BqEyfmiB/lYoqAiEAyA2RA6K/H8iGSYbmgWU8Yu1l3cJ672X8aq1HibUJklc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjAwkvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqu0g/8CNfTmQIuz8NNnF53Uy+eMcjd9lim/dviZQKbCHM1S4RCvYEV\r\ndBkJ0o4aS6MA4aGa4RRwz4BEepfl7TdwRYmiywPRaW/1jR6kI6GlozEd9sdR\r\nGPbTBpoFgExDWsPLalXCKWQdtTkdiq1SyP7UL9sJI85LJKEqlG25lmqfnLeG\r\nK1IS0brByZ4TMWlaFSyhyqWcD1gm2h5CINtlClULy/NPPtpe103SseeZ52on\r\nb9VLWchn7oKgyrCTdx7Ji4MtmMEe0d7gDx+WXz9N/T+uyhV0+34PBEFJFhVu\r\n5sjslDaz/TSTUJCmNZavh9qCLFByw0iHBgiu9KkK/QJ6um+sl1Ot5m4us1Gp\r\nXcAzy7p28XREnWh6YvK5D7xrmo6CfmAUnw9lIbZS9N1mA5EdyVTn0R9Dp/Nr\r\nyKDX0EUhWq4yCK5SA2DQThpnXcpg/qF/sIu++5JiSD2bd+b3kJJKrGTzor68\r\nmHPMjdrULAfw1k1AjGFyM6xNXhwolE7D7p1gBU7lHKY5jHpXnGgL1i/fTXz/\r\nFf14Yqe3hQrhclC+/cFBf5q8/YRnVXuEOmVkFxkFF5tKtpInOJEZKL9DL/dK\r\nuj2jzuY13Dka5Ea8ac6qJhT4mI7m1NvBbIlO8x11dNDQvahsjB+jG8mMcClI\r\nJQo1UGMxV/Ug0J8OtfAFmuDuoAZIcNttLfU=\r\n=vZSv\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.91_1661143343286_0.7620149397435094"},"_hasShrinkwrap":false},"0.4.92":{"name":"@flexdash/node-red-flexdash","version":"0.4.92","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.92"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"7f5cb2b7d55c1c36d6176c878e31740e92578583","_id":"@flexdash/node-red-flexdash@0.4.92","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-4ITB9rjmbna1rsJB7VgnsRLXzTiF77k+g7Q9O+RSOVnE43jp6HY8calWhvkJQ6t9uxS3ZIrph+SzAjit6ELT2A==","shasum":"e864201b9b3d2feb395098a7c382bc8988ff5626","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.92.tgz","fileCount":46,"unpackedSize":5185905,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZ0NHvVFzZIcLcafqCgSHFanc6m3UHPmPlZ99g0ZDIjgIgIiInLOE0xtzUIGH2lAActpL7ugwdYBgDIS/O5QI9LhA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBFjtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqsgA/9FHX0AaHomj+BwSlTp1Aev2D/psCZghmjgCCDqetn5k+vOnS5\r\n9s5XT81R4LiDvL4a8njWER47XB7SbYCxfh0VsR3iQ8THD1n+mQueVv7r8TOq\r\nyZFzNdOyEE/zgiUmLgiiMKyaC38azMc+e6FPMvbtvYIbpJESnkZ09Dg+zd62\r\nlocHICs0tToEzeXNhysKhvM0OU/bi0dnslN3jz7+gYwtsekZpKceBfQv8r1z\r\nBVmCU+PDitBrbz3mXOYt9e/1Nm8MAL1LPcBTfxFidPy9DlKVC7N21azvj3G9\r\nUejeveaVJ5hNxFRxENxiKKdAcByjO4YeAtgmyIPZdq7dqDwAGApavURi4VdT\r\ntG+Yiud20rSAJOUKJUtRKTZkMQReRXs0ehFAGVEHT2tR4VG+4pWzsG8sIKkm\r\nLcc8Qjkp4c7EYOuKJl/WQ8gjz7ju3Rz9Rsp49xp9Bc+7aPQne8AZItoj3AP+\r\nizZUSnta6pPl9hkNl2XLKE577xsAVDLMB1GCLNzhrZDgGYQpYSHy1htsdhhX\r\nsjhBfQ5Z7T+szdgDdLU04IIpBU7NR40vKwMGaHV7fZfYi1hVM9Hy3y15yTtF\r\nR6g+bR3J+Isa1vyayQEPy7xSScwcsxPwZAlWR+6SavT5dyAeGUMZZfo4P7f9\r\nX/YFwJ2htrBpZl2cY3qIGlI40eRd/a39P08=\r\n=xBBy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.92_1661229293023_0.14295351323140282"},"_hasShrinkwrap":false},"0.4.93":{"name":"@flexdash/node-red-flexdash","version":"0.4.93","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.93"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"c1de0fb47a9fa7052b712ea6d1d177fce81cfac7","_id":"@flexdash/node-red-flexdash@0.4.93","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-0/fL5l23KD0BrqhQc4I36tTuRchq1ujMNxCGT1b0pkTn6QZcfjdqR1HMpKDa1+CpxZNtSrowCvnnir48dfwTrA==","shasum":"a99f439c27b52156cc3130421bfbdf5ea9f2b09a","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.93.tgz","fileCount":46,"unpackedSize":5187338,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCR07O7aG3mnHQEJwGFhjk3g1cVRcGq0KommiulGWzb0wIhAKs0lTmBsgpsJWgpJqvOngnhfdeL0Lvtfj56jFokX8LB"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBl0TACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoMkA//QURYJPmR/gqBf3m7T/IrJY1Yn+K00uokUTD7C8hp1OOMFRoQ\r\nZCKjpoA/uoIUVRAe2GEFjBboo/EXWeQzVABvEOOOOCg8fUtPFcJQtWHMr21a\r\nBl+DM9SSPFVpdcrOGz9oaNnDVMOjUWiFfLSj+a4rvSLqhxna6PPS7wzlUQrK\r\nxCED1TssbUxCtO+OZd/bNqUTkj8dAQfSTpXZv9fqtxSHzK0At6DXq/2mn4Q4\r\nhZkk1gx/jSfZv1Z0HNDvUVUyN5jMI6zJ3CA/bE3titvtNfNhLt6wrVoHlMZB\r\nJMhfZWZXddiQfgy/Q3YGFAqEo9LOQBBsVC9aBZ6uCFMvQsmzLL9yIGeoJstU\r\n5EMkKyPEuk5mykOkQrT06D4i1fVcw8oj/xg2AvIq8McjkgREtmFDdaFbT1eu\r\n7R40aRFPeOAmH8aFxsU2JbKHRAjJ+KivLzE8dmlw12jj2C9vz8u0C0fbUWQj\r\n79TPqzY9xMOGM+nEzgpw4KPYTOr31aQ88cv1z0NZWQFG00zD+rNOnv0LHTdH\r\njdaZDaJ+7gB99xZE8vJvIymvQgFik8GasbcMfhAmp5qY/hOYzD7d23CnVPN2\r\n7JZQR7S02UEk46Eya4HttMUTQFo7FHu54wGlkp9cBmp5f02PkFbT12FeplEL\r\nYKmQMju9UCjoiNaFrTOAHSlRrPU0O1SZzVM=\r\n=jtfW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.93_1661361427405_0.8932825836272373"},"_hasShrinkwrap":false},"0.4.94":{"name":"@flexdash/node-red-flexdash","version":"0.4.94","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.94"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"5a1d36f4c1fc59dc8fc4e904cac4e458ab379fae","_id":"@flexdash/node-red-flexdash@0.4.94","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-CTfvzZk2sr+bMw4cAWqquJ/i08tFrAyCrUSUpwrZ2A6kwFd7Un358lY/PsZdNLhBtbWAKVhNmpy8nIwv357fYA==","shasum":"3221e280b6e799ef84b9167c0883a48e034e3157","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.94.tgz","fileCount":46,"unpackedSize":5190170,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeVw1I0aFkGI44XiSrkJEyoeW2JV6QjZijmPH9aa7vMAIhALtIeJt9fTHxGYMKBWIS3ypQgmFCTxT0HMUemGkiDWOV"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjCQEEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpyKA//bHLghQ/ngAHmKd39XAM1r7VPEPsGqja4o6NUIS8PHtH4f5cX\r\n7rBsu40GQGK8CuI46GU3317J2v+kuN20T0/9Rp0DZtFEJpNJ7Vnle2I8GKxo\r\nHrWE/yrFPExSUqHeEBnNRnuJoUHu3BglSK8T/vqMmrNa6YFSOg/XzbIZjzoX\r\nW/8A/m0kvHlTasxNJYoe0mn/PTuxbXN3pxNwQJnfj5erl8CNIt2vI6Hz3azd\r\n/XgcM8SFfF4jovSiCh7Tq+VNgenMhSENBOeU0BuBEYBPspnobFSaSupMYW7l\r\n6YyiVarSsneJf+r465Ch4hJC0MA1bTVgyEci2l4qp1P61uF3n9Zwi+EsYi85\r\nhYAqIdQBFrYGRpjOfmcEhfA23t2iLVPMDE1r7wCkX8USpxLALzxKxLmMwGKu\r\n+flX2aG/aiG+qCQe5qvRyWSmRjAAQA6WPKREpYCOGINfKO+L3jfWfIset7zs\r\nKdc+674vCGKdYYTjmh/xputQr1uAC9eoMNRgwn7JJNDYKn6gQzyBWkdbFoEv\r\nCr26ZBH2PE4vqruHZoQLdtMMQIn53hRGiV94vmktq+8K4o1T35uo+BrzUEch\r\nRM4tosJHIgo96VqIPt0VLW1nocxGbTkSaCsYXOwOMTzm3Y6uMExhane2TgS6\r\nseYET6oUw5k2jg7IDA/6Va//HmrOkasRdNM=\r\n=dKgA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.94_1661534468234_0.8656840201429052"},"_hasShrinkwrap":false},"0.4.95":{"name":"@flexdash/node-red-flexdash","version":"0.4.95","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.95"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"e94b7b23deff9bf3201f25c109bf1435360e4f98","_id":"@flexdash/node-red-flexdash@0.4.95","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-6a7ySW8EMjzpFmQR745rC96BCMS83Wziwp86l0AH3M21paXUZpjPjtK3wyBM6uZW/pmtg7S+yomGdhprOGEE5Q==","shasum":"c6b8f82163850327a68fae259b4b1c7261dd621c","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.95.tgz","fileCount":46,"unpackedSize":5186003,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAyziK2jWBI7iLmgjAz27EtTFZZBGghhFDitaOzeowN5AiBKi4c8ON2PacUNRweItpWqM6VAMBRq3gAaLcRMq7Pzlw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjCjriACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpBdw//VsdxWEjuZ0P8hX/wK90dfUJfonG8rjADnzq3lmkhF8ufuIGs\r\nmHIN/WrQKc/DjRSMci2Hl1vMUt9hWRC+uj1IVMOFgXTazPS87QAo4983FhOL\r\nyIeFmpNLqiwBTGE0ugJ71V4DZBSvpuTlQ6zUd6nZ+Y5cOF5BoBoaizc1LLdI\r\nzt0Hq8gUcPU9DUpm5i2GHIw9TsZ7hjjvXRsllLJDqqg8dE388NePIYM0lZti\r\nnz8zfYznaroKycIxR3QuNoX1g1/Nxre4G4B33SJ15UZDmNzzVrO/SPGC8wNp\r\nk6Q7S1fWEp1UNOxE5MvAjH/GdmspfkrlXS9dTijLbltO/3Z+yW1FU43Y8C3h\r\nrjolODEn3/7R3qW2dzq5JQkwmocgl+vAg4LIhTntVB4WWC47AfiCbD2ay3LH\r\n2NMvfC+BlK2Zx06I84Hb9DUZce95jNn6TUzM7GFSJxYZvcyDdamxMO/WtLvn\r\nKQO+aHUmOWgHNED5fwUF3RxnSxVxHZl13durzzJ6fiEWDXHGH2hTXDVr/yM3\r\nsDF/t55VPDEfXxJ8e2xXRBrWu4r3F6yXsqOQiNPQf9WldtGPfMRZqXLzmHUq\r\n20RAQI56C84/21zAY7Jfz8yXLqiKMK2lP1EtDdN1vLV8jRjHOs6FH6i/nrAQ\r\naP9gexaDxn29Bui7qewjCXe4R3R0rL/SPH8=\r\n=DqHC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.95_1661614817778_0.5546276871814206"},"_hasShrinkwrap":false},"0.4.96":{"name":"@flexdash/node-red-flexdash","version":"0.4.96","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.96"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"d689612e286ab9b05320128634a9a32c4e3ad987","_id":"@flexdash/node-red-flexdash@0.4.96","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-xnF6V6d+IxRPoHRSNQKSrNXUEIH1kpSNnZmKxz1cEkvXJQcDn1nQw0hya/oeHId9kU9JUagGjqCChWkFYgBxUA==","shasum":"577ad440b1d2ca984acd38dac0dcd54bccbae2e2","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.96.tgz","fileCount":46,"unpackedSize":5186044,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICCjC8hrEzDppVzB3gUXUepCD2xfZuepOIq0bVC8fzc+AiEAv0Z3Lb5dj5eiIp1KtPVFGW4Fdm1e0vUj+v1E2IrCawQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjCkg3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpqRA//V4iHFietG1OZc6Kg9Z/LS3skXqd3o/XVNUB4hDfi1xSifee5\r\nHOGIKJZPigszLYccVyEiWSAdQQkGx1B4ufnY+pI4HL604mLZplA1/EIj+ve8\r\nwGlvp4gbJjT2ym6PTF41ES4Un0115HmlwDzf9bSVUtCVedTCntbOy6vx8PDX\r\nY+s6pZ/3XfPLOqyBeMp4xTXExQQ40nqNKTav2CV2IUutKPk6s2dijYsYm+C4\r\nTWphDjXoW6bDvsB03l0+/M3neZ5Kyc+WT7zyO+Gk7f3wtwDvrJNcqLcN417G\r\nMN/LDvRRh7fypx3nRdnWLc5SLchMr56drRoZvRWQ8V33odpEd5h2ZH/C02ue\r\nYb9HPEvl54RGjqfGYM1xaxSxfVXRYjJOv5Ka34X6CSzdLFqoESNEKLnwSurD\r\nWwAGWXVEekS+S/J+/5MJ+wX11hTKz8Nwa7fSVSr5bArP577XRx0T5VhZOgAm\r\nnFpyiIfJUmKO/v8+u+PeSDrUTWdW9y6tGbCwm10nKwlBpeZbmwGGsFTMqnYe\r\n/CvtPhdfYfTmKmzDjIETpMHIbuBJPS2lOJIxSAye5w2GWEbf/ZwZ0MBPmH6k\r\nOXxr4F2M9Kp2GRv9F+2LzKUlFBs7q6TLgyhqn2C3Gyb0EXO8XuYhwkXCuJPc\r\nkq564RwtwkE5P4+ghNzJirVqfbKSU4UfBfg=\r\n=2t1t\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.96_1661618230855_0.9468049051398726"},"_hasShrinkwrap":false},"0.4.97":{"name":"@flexdash/node-red-flexdash","version":"0.4.97","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.97"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"888796604ea19efc2c1bc4fa4190a66137e9185f","_id":"@flexdash/node-red-flexdash@0.4.97","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-8ircC7/nXvok34DwEm/Hu2g6T51tp4HawTzgimiSF0ueSguitJS9KDaTvf+DCnHA80795RZbPr8YNT3c2wqftw==","shasum":"2a75f460330267412754cf68f9f6da71abe52e70","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.97.tgz","fileCount":46,"unpackedSize":5186240,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC62BZskcxSwSrbcIfCAUhvPwGdhCF+8WEotmHSyaIOjwIgR5hIPugIwNwz+l50/sCpuSLgkxkN3be7Fkz/lgPVYJ0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjClEsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpG5g//X8RX83WJYNH7wlIgCGRzE7Az7yIOmKC1vAiNHg61TqguLJT7\r\nd1hjcRI7sN8rzie3b+WSj9STrRaU0UCUoR/4UYJxcMrNCuqayoE8ormme3H9\r\nfi8KhGcdOZg3qPp5uWNFoG2kFjNcuY7/iW8WqROfU16+wXKTicgQJg0wJmwe\r\n4zDnBJReEWUCUNUhaXMcBS0G3JQjSFLFCraE+MHC55fDrBn2GSkzLykkhtDF\r\nJpgxbk/Z6Sxp+hHEDQEQiKSMHW9cE1gzHPUDV3Cmj7w3pRdAkUGBo62+zomQ\r\niBnL6a8Y+LMPM8vtEfQ/JzE365HybwTiYDIIygBj2j5k2o5+4oDFAIR738oK\r\nt/tm3ZDJYR8uZ9ilKBbtCKOU+e7BewNuNvnhl7PiE1nhrEMlnBlybVTOMgtv\r\nv5+jS+GukwwJvXELNjNwx/Vdhkc3R5nBY4/1ko87eLObmEJNW7no0uHt1Km/\r\nfVZi5e0LxXYqg2QYIOlSgiKX8ddrWNVNEl17dvIleRNP4QSw/ecbSZfPpw21\r\nx0yaQzxrLUsOQaWlJnWRzdXcmrQy9zPIJOSuqTBS3gNSDNAz/wxD2j7Yawvx\r\nlwoWFtYvxPTFCN+MktDPhu1PWZH28tp15u13rLQSJjzLah6TeNqVL4m7ehGO\r\neyWzw/Rxa8NOTFeuAH/n+GPjm2GXMh6SpwI=\r\n=Z89D\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.97_1661620524335_0.22733985043531146"},"_hasShrinkwrap":false},"0.4.98":{"name":"@flexdash/node-red-flexdash","version":"0.4.98","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.98"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"d9cff4950690efcf2644184cb61028fee0aed4f4","_id":"@flexdash/node-red-flexdash@0.4.98","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-oUUxbTiMOt8CYE1Lv4th2ooZBJGuLg7TJqAj3mmy/PAwcSECqFil6VIzN430GLADe1sL51W8lcw1z4b4IiBE1g==","shasum":"3ede37b5c6da87729c38f64ad3c2758404b9f7e7","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.98.tgz","fileCount":46,"unpackedSize":5186311,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICyTGrjwcA6v+Vf9pJTQo1SjsvyP5vXm0wSjkDwLsJ9IAiEA8UT3LHpSTLLE9M43puUY+4Ao9xNxG8V1BjMtOhGT8R4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjC5FaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmry3w//UBElrbb6rlHsT/g52ZRqxBnfmnxhZfu5w0IKzVnOTDSLZ1rb\r\nEV6WGaA5SD6874zpnXZofbeYFCFyaNHdjXyNgvwqqfX5ahOZvk19c2jBLPJz\r\no1XBIExVwlFdd/R+ZB6PsGTZtRq98LN831NJBgyJnGh1fB6B9HFLavYBd17D\r\nUhu9meld8P1O4I5pNnn24C9IH8Xr7vnaDPAUEZCozc8TsmGBTDe2UHIC4nlK\r\ntksZY06DfwgvUVh9LCeKf44EDQRcxay8m39D7TcbtQtDg/4k/xWos+Jw9NFL\r\nlBNzwvpyehmdqx+Q5YvmY7Xq/nQEcRfGiL/Fz8sLkHh6YOXvw+Fl+RKDxgha\r\nrgMa9nKSq7BVIXpiiQZ+QpYg2NaXX4qUxLRNdo7p3sO30AC0gpuCzK9byzVt\r\nb0emdFXEnhiD/zy5BiD1HmIAbgQG8YHuFPSIsDA2XU61P1L8+U1H0/EKjeCP\r\nk1ClOSixj2k6cuzwQjO1cTAHqXcCiTjhsT6K3+CggidsnVVUqp03sDecwi/d\r\nd2omN3b342xjKzDJrtDqrTAgpHxnlfYCi9PCPB0VzBmZLqy5E/qhFHlQnxpN\r\n+Oxe4kawsMS73NcXRQpBP5woQBpjuV9Hv8wT8JOLK/5wdQA4srFqggFi++xG\r\nh84I9t+1o31GGwCcUKWHbUaL+f1IiyQjKx4=\r\n=/FvZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.98_1661702490541_0.4989085476350741"},"_hasShrinkwrap":false},"0.4.99":{"name":"@flexdash/node-red-flexdash","version":"0.4.99","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.99"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"80d245bc905c0ba5aac3993f6f28e4c3995923c8","_id":"@flexdash/node-red-flexdash@0.4.99","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-EUXywcDXLrY76W4X2aaBxd99k5awwFS93OUSk69YpG7d6p0B/1Iw9hdeEKoZ8Sjsm7Hgo+qmTjvkIvljpvbZTw==","shasum":"a4aa82974a611757f35f345bdfcde3c5f3726cdd","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.99.tgz","fileCount":48,"unpackedSize":5195951,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9juLIR8mVD0Pu7i7YYwEzpDL8pEsDhWcZ71t37beKYAIhAN3DeKPI9CxEQpTrFcKOvIiIn/+e+xml77LVC7R+viyJ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjE3fUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoxeA//acMfH8hGBxjd0XbCUkYC5JedGyIm3cCJG/2uD/31FD1QgewL\r\nGXLGDP1+WZK5o5RglfEnEWelOeqzQiFFcwgiuKkr7KSdHhyjspVc/3P8ubL1\r\nH64h2OwcHm90TYsTYve5vp2gqXJDWuEMxaE2FbN/wEB8yhROuw2Pw+qhKC0j\r\nkekz/2K7F15Q0NHHVgrgKy5Uq9DeHU+QVs2X8F/4Anym1N6L1i2zbQhb5HQJ\r\ncLpy8M6phzYksrMSOcgUB/26H05LzsaNSxzQ6U3+qYEsZI9nyaDKt4SGKBG3\r\npYQFSph0hY+th+YLuAN/y+pkBZntuC1Zqk2tOIHrgNYihhhjZUrcp4uSjXs2\r\naljR4Y+awICFdMf8QNBoXTrgoWqd08acux4urbK93iGzUcx2shIMfXQeOmFd\r\nSESH2Ajb5tzuL1qyZHODWv231aMBTOrFqUdryhjEh1GXKXZuuNnLCtgjw+/3\r\nYWtABlvgreOijyLTnJK299xLTrCAmYKmasbO8/1+cydR8fkMo2Vrw5A68UO3\r\ng4xhvCbD0F1NBrT0IICpuc4ddjIfCDMm4t/6Y6z4DKKt8cAuip9LPIuE+LFO\r\n5TQgPhV6akNi62WmgdIgpK8Q+DEyTuGm2YLq3BnQOkoT1+SvsR5Pl7ImfWfD\r\nyJHzHTmBPaLstrgLi78pAczN9ogvh4PsIrM=\r\n=4I+1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.99_1662220244240_0.3581749663090046"},"_hasShrinkwrap":false},"0.4.100":{"name":"@flexdash/node-red-flexdash","version":"0.4.100","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.100"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"3945b3c0d4c58e3213402e021aeb8642a5f4abcd","_id":"@flexdash/node-red-flexdash@0.4.100","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-jQ9SGn59IErPnz2rH9QzSZcqOwlug0U5CkZ9mpxIMDUMg9phasMM/bBsuNV8e5kvd2HUEVxcYJBKWFosLQOlwA==","shasum":"333557993ea9eafa3e0c91dd087ef4a8b03f6b10","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.100.tgz","fileCount":48,"unpackedSize":5195953,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHqHIowDoaZtoqKiJRgjCyAndGe1B1u0oglQpNUbIt0CAiBVk5HwbZTWekndO2e+hKBpv1m+BzKycQ2gTeOBT4hOEA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjE8qTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpRbQ/+JNOu92jnk3V+FAeJMKiGxw3o3p5Whz3fAwO0Uf38OtUOSPDi\r\ndRT2bwU1ZuTh3A9kvWPlT69WuiJ+aHjdPae/cIPCNaSsqwp1PNg2ypgwdovu\r\nVbNHSclpFFRMGcny3BIJ5sFFwbeaOISS/vt56ZNMTtrfiDEHZTjzJAQJpW86\r\nLg18mmGczgO7XyjpVpKdVW1LZ+aIy39SFOioRS0fPzdd9W1ykyWwlC2XxcKW\r\nPPwFnbusE1WGqW/i4pJBuA6m5Jmu9ugZea61j7L4XDPeDf2vcfb/zQN+vA7R\r\nbWCCkj2f/I0hARKSPciPSJb1em00zj4fKYyhis3Mr2rX8wiXOmpU3+YHbFfh\r\nY4Qjabge7ZIAZF2jQNSALWZjEXFNJZHQXHRpTDiuchE2gVc3YV6TsBe+3Plm\r\ndWCsYbiukpaAbdM3ZKXsrJQFRq7aCgpD67cPpyDo9IFPau0U5ztrRkIlKZbY\r\nCtEKpwmlWlcKProBYDytIDbQCkwEe49gGOXOcFYuG8/ou4xQjgXFdkAFX8HL\r\nYGSJqT4SyKtrSCJlTHji6ZRVP270+efD01GdvYcSvgxPYpyDTBXNCXu8Ydxl\r\nqQHp4HuQiJBBjcgy/62ABBz3O+BZlcCG3+6M6K2Bl+XDMPYCYXBdvlhk6r0I\r\nhgN64aTdtymDuqMPOgsCpAFg/PzyS7WZ7mk=\r\n=UnP5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.100_1662241426905_0.2364838254481072"},"_hasShrinkwrap":false},"0.4.101":{"name":"@flexdash/node-red-flexdash","version":"0.4.101","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.101"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"81dcd768166ed73b169e1e55a084e8aec692b465","_id":"@flexdash/node-red-flexdash@0.4.101","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-JFqPASArDQvTd6Opg3G9iU9Y7C/4qfdEUwlzUiEO9Bb0pYewQ/PMRfzMoVuouAyRk0JOhvkSEwIGuK4UQiPf6A==","shasum":"5348ca77b2aac01ca548d1db23d3518c63870874","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.101.tgz","fileCount":48,"unpackedSize":5198185,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICoBzmjFPUGwPUzvMaMbja3gNNIrTW685H9ZZW3SqMr6AiEAzQnnCN7vxBgDAqeb/id8J0F7pFLx37xrnrqhqRPFV7Q="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFY5fACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqnbRAAjRDcCtTj+MzxJ0ZI6AuctPtC7SigqSQrU6COh74Rg2PxUmje\r\n7WSK94HfFTwPHtz27V8SYLWkefNCgnExgguNB4JLFKRZ/t9EBXiTjjaF3An+\r\n8zgpGZ8yjkP6WXFw1G+Lo2BVtYBBHFBkXMh0PaJzf8HVkNMTSBPD4GbymoO9\r\nztEdMwKxJ3rA/IuOjL2fWULKIP8aUe1CfoiaFObUPQ/JjRfSU8VtfGMjhDm8\r\niG5+rsVjKOtLKHCiMo0NOHXU4rJCibXdmYrAEBNRqD6GMFt9s3KdPnNSApWw\r\nN7DymJjqvJoq9HejwJD9TufgQ4EZA4/HUryEfapypcJz17GN68gDOXVSJ/kW\r\n8PPf7P+V90K8m+oiQVu3jt0CWTYT3yfrQskal1VTcPHkvdKebV3N6mspATHy\r\n2nC02nHu1UYl1mfAX4sKkVksoi/fTplqZ8CKk/EOmjJGRQJN2toWQSYY0pkR\r\nAsThJLJDsyLZi2CoKeP3ggrSztlbEBsoKvP2Twqs1nxU2FnMrZIwYMWcSW56\r\nvmiSpUPdwbx0kCqM4gub9wbUqKArxk/dhYHEUdgBx7MWi8ffN6mfKizMUq8n\r\nEo8ZkTl+B1mU4wTq8B5Wt76OisAP4MjtVfOx7ei3C0HICITEifg7JXAqVD/b\r\nARTQri+7ZGMvBgCDGcHEQN4cmBTh2PM/UUc=\r\n=1Hns\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.101_1662357087103_0.03075042330547939"},"_hasShrinkwrap":false},"0.4.102":{"name":"@flexdash/node-red-flexdash","version":"0.4.102","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.102"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"b4bc7fa1da5232f7bbbc8f4e16975de1f6c0dd32","_id":"@flexdash/node-red-flexdash@0.4.102","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-/BxKmZ0kPvOzNAFDCQYo85l29XJidCrp2G/xgeClZ/WQ6oiFkxQ/xSATjADH6DS6L0ru91wWK/CI2SL++32X/Q==","shasum":"ffca859cdfe14346ac1aa3bae19a42b1a212d2a2","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.102.tgz","fileCount":48,"unpackedSize":5198154,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDtTsfMaUx4sBwfo2muohO4OfuH6rut2hF7Kg04Wl3jGwIhAM6/D+okRfeGebuObES5h+dpgD19lCccjk+JHY8AYn4a"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFZWuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrKCA//ab8hvothUKv9i7e2NXzIuZilja3CnqGQ7IiiV+qNccKI4vIJ\r\ntqfx7mX+CDD3SAPkbrBHI+qXjkwmog4QUCmgRaccyOVoZmFGMZrIEfB4ZfAr\r\nD6KRD2XR4v5tRrl1koYQ7YVjENmNDz5KPymFQKMA/A1ymhwz92GgLTd2o2U2\r\nFtg81EsND+s68CkTW7WzWLMaB/1VfKkLDk3RisaTKipC8CfEM1BPmNd3e1Jw\r\nzMU1CsdQCrqlvPpl/Bg7QWo3qLrnnz5KxdmQq7A9AmLRh7HNILFzZpKOw2V7\r\nP1l4dasSLxqrv71XZndZs3ACL2gdMjTk205wDUsEBPcA1yzc8BtfWCct6/LW\r\nG0/q6nlV7ZcgSC+oqAfhAH5gbfYT3V8KYljcSpZDgQ3aY2nMhnPV/eHeGGHF\r\nmIbgw1HBJNqikEnZ+4wiM4TIdCkF2nuUeE4ww3O41BL1aeh9TMYnLko8TtXu\r\nUFq4pubQiB61L8e9h/z6LbWhfYDFPKRDEp/19ihRnlpEy5ThvH3p9GCqMOD1\r\nReh324LneT1k4c5eJ+PQjB1a9T7qlzNZeuB8vMB22oRqqGI1gUXXkD+/lx5y\r\nZmrIc0rN0VLZiDvJcwYlGaBaBBkZzyUh0G5c8nDjtf7fwYnnTftsd3i6JPr7\r\nEOpaI2DZSxohBk0qyScgt33ppceTzrU69R0=\r\n=YHrm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.102_1662358957721_0.011344561609809789"},"_hasShrinkwrap":false},"0.4.103":{"name":"@flexdash/node-red-flexdash","version":"0.4.103","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.103"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"716e7b9f6115b7907e6d37fbdb8f6309962fb54e","_id":"@flexdash/node-red-flexdash@0.4.103","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-VSqOrE454HXj3HzqH0H/iuSCtm0zYKnh6H/WS2HQKOqCl9IfvsoBDRNhzztSk6yNhnMepv824sSCSXHjZnIHUg==","shasum":"32413382d00e6455909c18022e8da2fca7e942f8","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.103.tgz","fileCount":48,"unpackedSize":5198146,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH5KaJP64ASgqO+iRZv6mXYy1iC3XVy1K93UcCP+yb9cAiEAsxyv0LRXlIKe4xEZfHxvImxS2SZCRmv3h3IecALvl6Q="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFaAMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7Hw//ZuVbG1aSXHmRXR5vktQdOMPkzPONSQcXGhb+JX/Lf0NMLanh\r\nimUZVY07STblJ+btxnkcEhuzFjaKE3Jt2voA1uqwAa4AxQm+4Mg9p3RhMwHE\r\nPO1R8vT/+RnQ9FAJojDHKJH6IC4EU7OtO8VUCrbA/EkMHtsdoBJw+82rJz47\r\nmXPene+z15ziT6HCurv/iafhD84hiBjk3lyEtxZu/oUUVTJWnJHrjHx6VxHR\r\nzWHQIvxXZKcdsRR1kw4fGWAqwoQEBg0Dqekz8Z0QO2AZgxdSNBsjugBRVpsY\r\nw6EG0KYZIpd3o1JhiCjnxNtZPiBam0c2Ybtg1Z2ILU4edm+5EZ0FRy4wFF72\r\n0lNJ0ZvEknAJ1zFzibLUh0oMOmiGqPYWSPJoqCHCUxLP+rAI1vroqbe4z7lT\r\nFsJI0wZodJBUqH6RxeKaJAqSqe7ESog/Xc80KRu2PGgrdP8OI6YBOTkEhz3D\r\nm1kvsYaRtyNDSIdbmVlWroObb6aCpyyWuXE5Exa2i0IV5DhR86yvsXvTKKTh\r\n5yXIBXxt/Rg7NYhUo6/oaAS2dEXIWJ/78Xsz38/y6oVIZflZKUNZeFW3gNc2\r\nySdPmsZIqTRKxmwbHumspNe/PBGkgjbHrlpffq0nSj92FRfZ2+UZzWyKXgwt\r\nmlEiTe3oEpVuLLB7jBFp6V1B/Ku+sbhdE5A=\r\n=M7LN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.103_1662361612169_0.8325259074259732"},"_hasShrinkwrap":false},"0.4.104":{"name":"@flexdash/node-red-flexdash","version":"0.4.104","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.104"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"36b5a9dc11eacf35dffee1642e072ddf936916f3","_id":"@flexdash/node-red-flexdash@0.4.104","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-HAh/zDEmRrTgyi1S0lvRcuqWsLEyD28whO4lA2Gv5/6q+UZFYyySyog1gFhVF8dc//Mmxxa76oTGJKPvgCFuWw==","shasum":"45072846324236f310208480dca68d92465a85a5","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.104.tgz","fileCount":48,"unpackedSize":5213186,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDykqJCmmQq8COoTIEO41oBtv0o+yqWionjnK55LwNAdwIgZgQqWDLiq2PWzYuisSuZm2KT7UmsQssOKlXEKmFmzKA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjINQ5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr9TA//fz/p+yqowB1mQq/83ZitXK+MsSkK5TafEYzOaOmGJxhsbeDx\r\nWUaLPOgTNBv4CY4gN2IZ/VOzDAEnx9OEbAr0jXf+frTj31kjedy/onLxk6Tc\r\nxOBYQ6IfXTdMJRb5YXdW/FP0ejpOz9F/OQ36deP+LQTcP/UXlSVMZ7vIOMRT\r\n7s6qZmpAsvMGQqQWEeIia3g4oskeEMT+N6rBUMi3qUgjWrkRf6dt/59BZyf5\r\nf5j6UE0tQhu/oCYpMr/CBh4ALqZxYIsYgwEPhuN7LXxfudPJjMbZJmr2D6Ao\r\nME0cq0YL527hS0K21l2iyAQey6yJNgyk3lZHun9gylTUQwatf8CVSlQwOlq4\r\nCScTKlpZlJxvAi+1DKtEa55bHIUV51qrl5U8o/5Nc8q47PjVUb5ZTnG+U8DP\r\n9vpu4RG/4op4S8cUoW7xNonwwhSLIWYXKFC5ZkLfFgKAEAeD87f5ebY8kTpB\r\npHyN80JxqumdwFZKh10u6px/GLeWac/XayqTtXghRs4w8+E7OQVqcohBWRK0\r\nHEDcd27Oe0Si9RChRFw9W9Wvk+pE2RY/J/NnPhf/c0mzuBsqh0istpzHQQxA\r\nE2Dtmjkj9FkLpE1qh9a02bYdayCfZWyJHkmI9fshanNBWcLUgYG0xkWu4J+c\r\nUQ79WiTzXmtEpR+I90K8k5qk899bAI643J4=\r\n=5B/L\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.104_1663095864965_0.5142225873486881"},"_hasShrinkwrap":false},"0.4.105":{"name":"@flexdash/node-red-flexdash","version":"0.4.105","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.105"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm -i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"19b5949beec0864e4d4c6793ba6f13333d611bc2","_id":"@flexdash/node-red-flexdash@0.4.105","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Kykt2pu0wUuYWq1jppGG2flLomI8QGcsj/DxIw2AsVeAgvXNr7LyFEtzy4pjkfF7j26owFO/ipQsceZUxYWs1w==","shasum":"83130bfd300790a81c75ff177f8be528c8087035","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.105.tgz","fileCount":48,"unpackedSize":5213194,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwJHZb65EbYgSfr3V+2OvUw6Ec0i4+X0OXK+Nkh2Du4AIhAP9t8qmNPatv57ElxuI5Tz4zEvIdsUUsGpw9FObOjgjy"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjINSqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpbqQ/7BhPykLEq3T4tMsvKmhFjy/qLUD3Mm2viG1Pl+T1gdCE07qhp\r\nIPb/Xyxqdtbw2QKgwO69lKrMhE30wFqXMQOQcPQoV6Xa3Fv5JgARp4rirbR9\r\nv1812VJBAE/0qko409DYvxgwrK1pq42WALiCKDIbO3yjHoMlNgv5cm8zzEAk\r\ndDsgseClHV/otd3b1Vk6RtH34TaiJEdEzr8/ddSRcTiympA3kU68KFF3Mz9A\r\ne4Q0zo5ug0TEa4Nrbg8GhHQ13BnrOfiCnzfL1YlG2wiii+3ViT2+BGXWdEA8\r\nrSPdyawKnFDdjDRik3NaaT04BjGZXytcNBmg2eW6eUUAAHKphTRUZCswG2Ww\r\njlhE3ZFg+hQEl5+fYz5YKYmxlJxo2UFjemMRt6EUYjjRnqJOR3ZrfMDkG/cl\r\nsV8RcqkBaPEz4y+ASTHfktYBaFpq8TsZWFtGrVxS+6vyhznnnM4HP2SEG/ME\r\n2FJ5HT4EhTMxtOwhgUdya3VUH0qk2z8zYU7fAvlSnVq6NnF+Zm+nThtVThLK\r\nsjLjnRT5idPRatX/0t0fTa++vyBEslClTfXvScN+WZDpf0r2jN40fGSS8X/z\r\nnQq1ZYwz+IAI2Z6qQEh6X88auqxXp1UJoeSCe+GkmZEHJse54JSYqhs4lJJB\r\n6ytvLRJhRiKer424kZz32Gz8W+cL+kq9pdA=\r\n=Lu+S\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.105_1663095978171_0.12833471194340818"},"_hasShrinkwrap":false},"0.4.106":{"name":"@flexdash/node-red-flexdash","version":"0.4.106","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.106"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"a20b608e728e3d7114168c93d8e9ae1eb8fe2a95","_id":"@flexdash/node-red-flexdash@0.4.106","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-teHXu+caoU5kWgi2BxjE1gPp930yI3UkXS5v3KGMoo4UdAxZ+eDC3xxysfmlg2iPB3fKW0WiJHWyd4Vo79wHgg==","shasum":"24b5af0c89a3696346e96372e11effeeb0c75622","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.106.tgz","fileCount":48,"unpackedSize":5213194,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBPqQK6HZqKjWNW0TjLun2E3YtJguK6id58Nz49juYTSAiEA6ewLIW9IlLUbORmUy5+EIxH19dCfn5c9nzW77eU2Hpg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIgTBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmomlw/8C5M1nUYGiyaukA5AFPrsW6jzPkh5y9D3YW+la0TAIyMUnTW7\r\nmQWqIIR7RYCUQNX7GtslI5ev+xPq3Yu2G2xi4HBKU6tjxJrEIe6CuSNBS51K\r\n6QTQZMd3u//ARtPM6qDKpF38J2GOLLqS2oN11t+hC5h2S8mo29ft/TfPaRI6\r\nCw4tcDjDkNNpl31byx5l3g5PYlwJfKXcnLwv9UgfOpCql80f77TbsJNkzRQn\r\nk7qOSN9hTSd+pKWLZnZPguVO85yTkIKS6puEvZyyJJ7SxlMMyHHks46vWG9W\r\n6+OQ0z+ZeMaocGwKbAmT9mFDBdOE0ST6FvXCkmlYhhVvU5bQoGf87wZE+iQ9\r\ndF56WY97aeZ9iwnU4KCf3T+YfLkItp52WDEXFVJK+uSr7jU/kRER5d5Vj0k4\r\nJGMNsjMAHbtM3DGiTFvv1EyAS3+G1ieVJgvNQOOrYXv1BQVlJ4sXL2NIK90c\r\nwdqcBfx8vHxUImodQgw0/HzqaAmM/7F2HRb9R1FT/VwYe0dDUjoR9nVYhCgG\r\nQF5OLZZpQk0bjMI6FaKwONnaqLAFj1MBAiM22IRG+3RXmFWBAs2a1JDb4GIY\r\nQYwAu2BbOm8JuWdZIriW14Jn0eoNQT60lUYtA9YDsB9e2af88vDiM07jTVCP\r\nWdRJ5dB4bIw/8AJRcQ2qC5fbwuQ2JK+TGk8=\r\n=HuEk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.106_1663173824757_0.22284960475789695"},"_hasShrinkwrap":false},"0.4.107":{"name":"@flexdash/node-red-flexdash","version":"0.4.107","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.107"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"70242d88b2e105d9592efa364840796c56bf18d1","_id":"@flexdash/node-red-flexdash@0.4.107","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-e1NsDOpISsKwlBa9YQInMevpOFiLJpcwv//t9A/14kGoyZLBW/Q/iAZ/pfWkJks2npRrn5HzvxDjGFrHaoEeiA==","shasum":"d30fdcc91d6c3baa98bceb26b8184c515f94598a","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.107.tgz","fileCount":48,"unpackedSize":5215197,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBuYDf/dLufN0sSYXtKSllHl7bMG4b+hqQsMLIk3ecuRAiEA5n4ECHXqzRSwVyyS6PbcBtSkFJqjdxxxSMpIy7GOUnk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjI1MWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqeGA/9EDUaDl+FSmsVjdwAO4q0g0ecZUtgpjPRsyCcL/FltPUptE1c\r\nzHnqR2wcduNQ3uTHw2Hpv56S3Av64CqjfTfwFac26EajyY7XIiDZxpWDM7N/\r\nJWnf4583cEqAymakdEr2JCWGA/hlModa7LvCIHxU3YOfPINPfeU853VmkBST\r\nQS1rKKrQUtW7U7lirnaTzZljndHYjQa5KP02ChJl8l5nROxbopPg73GGra7K\r\nn1M1hnEB3/xAXGxJSr5P9TtaQyZuxAhUbxAkdL5InjhfLO/1YU84Ly8TVrFX\r\nER+fg5rDWcGWHnuuwDtxR5QU6eli/4/g+3oCZjbWpZDthrRLryf7skmIHrmW\r\nLuwWiFcnUlpR6WwszQKS04acNIOXnrndTZyA7BlW+tkU+8+Wmz2yx64NYCOG\r\n2tkgkp+vALMXP+lN6K3ywMbmPyQ/SnCWivQYoqSH/JYi6F7JtkpJ/V6/FdDl\r\nFaiF4OlD0A73Zjb4nSa8bOUSC3R01uxLNqcvwPbZDdqfT60+sOBjrN/PMWjf\r\nGNkv1pbzX6uyiyIWvhiCA8XhU3PghvCd/QXMdJdIAmgwJwwI1i7JktTSi95M\r\njTdbOiFQfj8FzmHbYgAnSlWnIumpFUR5BuvVJSnZM/VMcFmlmDlKDcxal6dD\r\nFSt4RFVY8kU3D5kIKIvakDKdrq3T5uubT7s=\r\n=1HNa\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.107_1663259414319_0.8450665472175718"},"_hasShrinkwrap":false},"0.4.108":{"name":"@flexdash/node-red-flexdash","version":"0.4.108","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.108"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"fb7ba0d83f8b149acd9252b39aefd0a0e24111d4","_id":"@flexdash/node-red-flexdash@0.4.108","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-uvXyvh3BehwdB5rne2733mx8uDRVhbEap7knbsCfdrvICjOiMZk8ZkFicgpvdnyye4YXP3RNzZQ1C7JmJICDxw==","shasum":"77fd35ee63e60068333e3cf955786c1933808565","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.108.tgz","fileCount":48,"unpackedSize":5215213,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHviKgMPIgfKK+wOEjxcP0qO/nPSn+Rdb7gLIexYxyPKAiEA3lReLTHH4e9YAbw+/A9jta2joZLSTjMJye2WLGfxXiU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZpWxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2ww//RhR7aYNOlCJtzvHDHb6P9Na6jCpbf7foTQ97H8EchArHiu/c\r\nkl1YkJ57U0aInyGZsImYFB9NUE5LL2fNaLVFV2NtZMv8CM08rRS4OPzRdcIz\r\nbp+owCCv/rJJP6pFSPVHxTQrIwDi5ZCxFDfsgLhGLpD/6/tqefvQQuN9IxDf\r\nUA3ruqNReD13EwnwpHHToRe0bgo+N+EEa9Ei0X434jE/8uAXPY75bbi8SsRB\r\nquRzrEb1LeWtgHddlUzRZMvBAAhSoydjmceLTDgpOMDejMW2kASIZKAClQPW\r\nNvNs4K8mnDN190y6KQYJ5gwCQShNKMuTqkOsSuQXSuuVLLsdF6DK24nvJ6X8\r\ncJ6bKPtfdut1kWSl3NUav0pfEdFafeYoA6FouoH8X5YLn/XGoK588KhlCHPA\r\nhVhIyS7gSzZO0dPnNBn17ScmqYSVcI38vUcDY2ytnYzYEfvGY8sO86eZKfGc\r\nokjVn4UUWFwwrgn/U0JAk/El/LxFRrzwrqCt3qTBPC/CJgTszALOQVWGDLvt\r\nIY21IRaLGOo6+bbUgTbtWddzkyZpwXLw0HfC6dFwXRVNWjTD1rDv9Dl6UlPJ\r\nXBgzxonGUPbyUswJX0v3jz8EB2i92lxAqd6xEP1iFFqqmIEIvm9R9ycH9wCf\r\nJS7rBqiNOggjpMYalwtSfJn2+lbSR6356iE=\r\n=LTJX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.108_1667667376710_0.3739520264809113"},"_hasShrinkwrap":false},"0.4.109":{"name":"@flexdash/node-red-flexdash","version":"0.4.109","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.109"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"65c41bfd1e2cf6137ef83491e7f31cd1757f4198","_id":"@flexdash/node-red-flexdash@0.4.109","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-0IzmauO4ofvQS9YF7BUHLw/yy4wWViK9dNUiCmRWTwEg4QVKImof8BDr/GX9KjF3vhhALYE322uQm0dCYpullA==","shasum":"1c9eeccd1a079b4534b6a45ba60380f77401488d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.109.tgz","fileCount":48,"unpackedSize":5229831,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGq0KWnELgrrUEigvU8rB3qvPLzOldc3wC+yQVwgbr4lAiB+eznbWDj+Bd+JrWmjwafVLu8VXRb+IvARSYrYBDIvMA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZqaAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrRCQ//eg8ekQ0OZunXG6UNjBFaU5BxfZ4dmqErx2T1IHya0YxrVCLP\r\n9i4ILXTrSf9vXl2Yzu8aiADurJlQUpO412ShyIef9N1MuWDvtZVV6o3EOpAj\r\nu6IWz8lAUjEjldtAhdQJE4NN1YecO/S4GEILYg5/3KwNwqUm52wWbw+PZxlQ\r\nZBBJulmuJB0BZH3nIcj3j7fNqPafyKPJUYhyBTdxQ4qxpkYocMpjzb7Y6E+X\r\nKTNkN10I3rQLN5A7+Bu1cVZ298VYTQDuP9ao1ZDFKEHItBcnqIGyiFHoz0iN\r\n7CpaACYgOecZKK/MrB7qmtQsYh/FFnpFtBS8uaNB47/G+SlTTCLD8FGI12ob\r\n7aMTmN1UO4/hv9d2mvUBW9H17/gDHctZPRc1wnIpWPqEj4GHfwdjIt3dwRfl\r\njkCEAKVI0cVH9C/vG/7iO7JOtVxZNMJn/KhZjYHHxY4euSH0xjMYMEJ+3ygI\r\n3fDr7Dp5yU4oj5l4t65vjVeFsDvZezio8prqFk83Oc1WKGMWwjbrUs7tL8b6\r\naCsPvN6YG9ewv7T2Ly0NaW41b0YLQm/fuxAxVcJlyt55/Noh6v/7MxlSDuzl\r\n+rB4tHiTo5jJ0G5Ss2gMOEsLgaUebCh9+Ui6ok1YIomgwJciYAJcKrbQlxIN\r\ntIxgxcJBOVps4GpWnCXpXZX+q2GKkEG78gY=\r\n=cRxe\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.109_1667671680599_0.6402555743707983"},"_hasShrinkwrap":false},"0.4.112":{"name":"@flexdash/node-red-flexdash","version":"0.4.112","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.112"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"e319de50766096833842f0c300a5922bf5b24aa0","_id":"@flexdash/node-red-flexdash@0.4.112","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-CdYT5idOcE29dxxohGPA5FOr/p30T4fZgzGOzcBjbLEaY6f8cFZXbg2joQQ8HoUOMPKFngWMT/i2wJMAoKudlw==","shasum":"f3b9ac513b06bd2acbe0ca72528fb6ea8511d5c3","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.112.tgz","fileCount":91,"unpackedSize":6045621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDBGoXVGNlxfEd1hsAWPbeI+XwAqEISsKBwys56JXyf/AiBphEgF26xeG/ZEGbk9wFYy8JGipPNSu9QVbKXS88XWUg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiDMtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmridg/8C8GIB6z9SJ4uyINLqoZKIQtbhaWTwK7fTZkIwB+tHw7bsN8W\r\nskH8MGS6QICO7l9DUmC37eSQTKlNxroPPU31ZdI1Z1fPrBNZtecGU/MYfBrR\r\nqJvSMut4ynuAW5DIhhrKiHYfNlJD9onddqfmyeUhfyuiBo7814Hq8nOdpZsU\r\nSpdjQIFu/hPN8VzHrVI7kZkppu5rjoJvkTGOIpDWMztH6Ni0z7xp7fKvs1sU\r\nNUYtq3udSoHIa0w90hEzDaaxw+mBbZ3920eeyPS8cJVb7N4odGX4hQG8/Vd2\r\n+lGqjO1jwjPZi2LnttAEF0GRMQCwf0O668xo2J1YhcwG4YasuY75B3goOT5z\r\nv0MPyJfttsYVI883jzeC1OdohpFyXREia1p4sX9KJL4Wm7dP5+bqZCkxLpTf\r\nGW9FXJBpdt/Ja7lmnXe6m18A6Da4rt+Vms2GSpQn7RG54Od0f9+SScgkmZPE\r\nDiTum0shffsj/SigA4lazIvB0p9nDqDe9M/xZSj0NTa6Qs+8V47ZLocLXYDg\r\n5GMaq/jmuF9oDViFmqt4yAVOwcwX3Qz8mtszMTWZbgm0eQGFSFJ+7t7zOKvD\r\nxJWNnDj1YN1MdbK/NV5i7akbg6E7V7lgihz+00wguicrbtKCglN2PaMl/IT0\r\n13am+2I/h+EdFiokGlZNfKd42p5Ev7BOnZY=\r\n=lwj2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.112_1669870381036_0.10817040222694962"},"_hasShrinkwrap":false},"0.4.113":{"name":"@flexdash/node-red-flexdash","version":"0.4.113","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.113"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"447554ce9783fef70c337c9b00bf26458f01ed63","_id":"@flexdash/node-red-flexdash@0.4.113","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-YXw6Cmcj29a5Jlr8u9pZEb+Morc49kMYOLHklAO+snewYwWsOXgFKL5jB5y9bAE6OIU50/yOyE4XmHMD9NOgyw==","shasum":"f14ebfc56d9a243eb2b93f9d1de78a0314105fdf","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.113.tgz","fileCount":91,"unpackedSize":6046183,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGJvItoUhfRGJgL8Lowp4/806Op/YUj+YTwG51kA3Z6UAiBJPHMM+qr8wZoLO9uKQAFD36zAERl79vDxh4wJCG0KpQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiFfMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmphwQ/8CepoNsDZFw3DdY2EHWWAcv8o+rD39y+oMVdgVOXqNmuAAk2c\r\n9qnV5Bao9fvaDFzG7iFffRHbqfgvRKWtjuZztSVxK/po4xYR86B6/GoSDicH\r\noEpYDZim1i+ahg1UNHlH3Jl3K7GlVYU8+VTUeTuhPRfWmFPLFPgd3gDq/vF4\r\nUBb0Tm5Z818pmF4Q5lE84t2te6otdhpucI+M8bwgFAPOwejLi1GlZOsoSmdy\r\n8ZjXkGf2xrRKGTbfm7wBobSyD8pa2NFhGlU5yS4IfVYmdwv4ue5cRrODcgg1\r\nOsivsya6uOXfUYc0A9d8UfzIhrXaIqSzHanuwpgn8uezVDe2X8qRoNul/IXf\r\nDS+K5XAaNeUgmRxkOAQGkGbq+RL4U4jDIP89XXRza33Yu/5auIUucrw12sQw\r\nF5etdeKkadnWs1Bopt7gSSQoQi0khN2mirEcLzds3sEpbMogC+asajlPhZFG\r\nYdG6HPp+mt8M9IqkQtjo0qartzFIIFdreFisQg2gnMrT8Dwf/p8rRNIjmOw5\r\nmbpIOzUd7aO3meQjclcTpKJiYxBihiboMYMEBcgUec2Yg6+9Wk9V5IDJuQf2\r\nWABnJnZ86gE+xK9czOWIsh8WsZBm8g1wCvziPoax+5pSzB+aNM20srry1b9y\r\ntaUzVmUlj3Ps202BFosH5BrswripsNzwcyU=\r\n=uk3B\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.113_1669879756403_0.7344629263996274"},"_hasShrinkwrap":false},"0.4.114":{"name":"@flexdash/node-red-flexdash","version":"0.4.114","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.114"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"16542f2b22e687d08b3f230e5a4b5209a0184940","_id":"@flexdash/node-red-flexdash@0.4.114","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-RLTc2gBfmHjJzzxtZFD+OsUYTWtMOkVbCMouivesiXeHo8XfeSKImAORyurLwvbXwyhTDqD7nw/JRHQeJHwDSw==","shasum":"ee141769686b08152b789b9bf0dcb52e085720d4","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.114.tgz","fileCount":91,"unpackedSize":6046183,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICTo5VXNnE6bj/21lbJuc0gSkmLfrudY48ze53Pm/Y85AiEA4d+MGig8B4VySlG8K7dOLdYGCQ9PeFZiGIoYI45ybxw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiPhWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQRw/8Cn16GbPHDoVu2ST0Grw6YOC/L3HzmeSIJnwLfejT3eWAVGVP\r\nlO4G94/2j12Yr54qs5yW7Uv5+xDyCo10NLpYQJ1PL2tRlDuclcyJ68qKrn+4\r\nGT2snZ4C3sMQHdHxR8G04Dipg+lt7Ck43WzrXaxMgUXjSWbuch6YLCFqmoal\r\n+23MyaL182CZiBCb7TMfebIryhpbVIiq6UVRM9hHbKHXPw++hp2tZhRsu6gC\r\nGrQcCzuwASDLJsC6WobHR0OV8BMJVsUFFKt+/UirvEU+2M/Ltd8CwnEW5wA3\r\n5uLJoI67gc//YMETQsuMQb/epVy4Zh4MilGscz7IwKqDVvbDCdAH15IjW3kO\r\nALkWe+O8RUco+EJpMd6iNSL+gERT42WwYMLEa1T2x6DHYbjf0YdABQYumtmp\r\nMx+8DjDbcUoBoXPIlWDb/4CSw27u3TvyVDTGkFj7ul08aRC4Kf+4sNky2e62\r\nKG2KdHWhidQR90gUCRGRcfrXEYMZYQrjf/iWnptxabZjstymvJjaG6brPD/Q\r\nTHoOCriTNUxlZhK/qHkXRpa3E1Fgstu+1aeixqXmbr6KQQLU9GiNC3Fs50SK\r\nSc1JPgQGfj9wL62PhauvBZv+MZdDG2lpvYxaS8qhoL8LXTrwSne9HGvnVV0l\r\nu7f/YGVzMo81lDryzbXHqGK1KCKt3AMxJqk=\r\n=k5nQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.114_1669920853990_0.8613864643548175"},"_hasShrinkwrap":false},"0.4.115":{"name":"@flexdash/node-red-flexdash","version":"0.4.115","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.115"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"7fb40d82771408f6f0c4479b4632f6a5d48156bd","_id":"@flexdash/node-red-flexdash@0.4.115","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-2BpS6r1fOhG303Y2OMpCtySkV7mcdCq6cmBdk0AhuaTyfRHeKHbG9MBDHBtV75Du4DDyJ0QabAKMGXdI1/VBzg==","shasum":"bd4398ab11c674bcd451ef37f742ae6549efed04","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.115.tgz","fileCount":93,"unpackedSize":6055040,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQChGKV/qEZFsYRhhPEK4Mfo1kJbcWHCIyIfVjMDHNaJswIhAMcHvmcSK0XnzCGOU4PykB/r0GmGygmTpACiO0TC/8j6"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiuPnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoHAQ/6AtLt2tZpnVUbwAGQUodaSFZgtw3k4zJnMGxUwlHft9YgJPkL\r\n25Hbr9Zflt/Vs808cBcxKm4o4WwqhDhaGgJnJ8uU2t1zTe+zy8S6Y3tlZ2fZ\r\n8A1AZZMTYtuLkz50q7mtLx3G/gveeIHD40lcBwjwqCL8iwhCxAbRn8Wuqps9\r\nONqbRUqFMVaSSM4uJn6z1rBfgnD8fWgE8FLnDb0GyYG0RsiAGsQOf7mEkwr3\r\nBCp/g9s4xDqZ3m67yfIPdgznlSbT76vcUC09XGcAJeFuTmK51KmiamoOTRSt\r\nY/mC89cYaEHXVfrgMVyDdFpD60nNRP80+BEDzm2QSnTOMUka7QvZ9JoOIoFD\r\nxI3thj7GWNGfJo6W1f7d48gTIXH6YhfFtKKXotXsr+k4CyNWmXmbpo3JriqR\r\nV2C67/V7x4XqakC1ebT9w+zEy8lxK3Hfv0I6ApRyWK7/fmVyAypBimLcbSp4\r\n7wqtNPi2hr1a6CE86/Siitk8AoO92zRRxPSwYROGmwNjRTVgJSoAYhX8XaK9\r\nYLmtSWLiewwVEFmJ7UCm9WVaps1TvCpMu64PBCbGIME0Yxs6gGmae7UgLXP1\r\nsDeY6ykP8AsfSNSrPsEVJNw0VneQUAESDYK+3yWveNRhZtIrdGo6j/iy6Exq\r\nSEAShXnnTnUVJP1vIpWoi3UBnywpaFkogrU=\r\n=oLjD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.115_1670046695163_0.27339682719980773"},"_hasShrinkwrap":false},"0.4.116":{"name":"@flexdash/node-red-flexdash","version":"0.4.116","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.116"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"4bcc6c948caaaa239928da7315c75b010da9210c","_id":"@flexdash/node-red-flexdash@0.4.116","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Hwrbj6nRAqb+ggsPpkFTM03/WEGmbKPvVbPM2OZNKSt3m+QkyXUYwWyGuFgFF3V/PZz9oHYtMLAZfxtyDigTbA==","shasum":"844db9ab4061e30998fd16d43cbfcc72d0fc31a6","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.116.tgz","fileCount":93,"unpackedSize":6055086,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE6Uv73J7s6AnI9TZIOotfUWDySo1E7ytvTAJuyKMwzyAiAIkHO6MWKobj4ba9ZZCzGXuk6IeGp/zDtvwyipmjqCuQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiuR1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp97Q/9ET25ZzWCH85FWPUL51Jg5be5Z95lRuV3Qd+Z8qJrEh5NVNrg\r\nEBG55XbPZ8pqF00ZQUJXCcnvodbByAy5tHf+9K5FOTM8CxqvKhcRY1s8l31j\r\nS2P4floLbnKIJ4ZOKtRxw4d753Q2hGxLw0Dr+IBODj757WJ06QBi/gKfSuid\r\n4IppfaOjfLuxPr8cclTMzsKVCwmoy0b/6of/hAwRLkBGDlJEe38EFgMXFIXa\r\n4VEeVEuVtWa9gybfIcHkSN1BgZauvtKbRIL0Gjjl5gaFj0lepwgY8xGHn+BB\r\nKKKpMekX1pE9eANeiMEQxwrYPm2btVv825pfwZ/nIYvO7/YKL7ZOZOuekI8t\r\nd2li5q0QGl86Fre1EjSO6lStxuxkEwZ/UFAcEGsaQfl9ZnynXpPg8my59CBB\r\nus96jgQiCMp04dtHmR3f0NZFhoUY8Js09/7pg5ZSddhYQFCXGQw36IduqTRz\r\nWNWkpG4L4sF2wiEvdHotrBCCIziFWb4VyT8oj/Q89QuAxbqEIX3d1YV9QshL\r\nd18a3PTHvtR24QVOnpybHtyIVkwqw6grgw2uwdwXVHdDOjXBN0F6m0dWLIPP\r\n0VJUzw/4LCTHTwKv55U2MeDY31E7j+FNK/7cD4na8VeHr7nTp2cpu3pRxPtM\r\n1ohXyDNNbSyW2CBy5EiCz1bxHdBEH/cZz7s=\r\n=AxQU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.116_1670046837108_0.8615130719236928"},"_hasShrinkwrap":false},"0.4.117":{"name":"@flexdash/node-red-flexdash","version":"0.4.117","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.117"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"b1026f7f151c0d956af59d914ce239cf9d75eaa1","_id":"@flexdash/node-red-flexdash@0.4.117","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-GC9to3F7TYB9ArDV2XqeOk+ZAyGJDzhMuo/6WStB/2q241oqkQGAftHAzZvTZhVfX7xHTdI95exlYqNKBkl5wg==","shasum":"ca41968fb07bdcb89676b6acdb22ebf53759a1f9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.117.tgz","fileCount":90,"unpackedSize":6045793,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXvmW2WU+rhHIH611fIQ/8ad2rb3QyWyjzAxbRsZyWMAIhALWvBc+uapgBvjk8nQuvbaDiE9l12pDzDuQka4GyptUS"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiuXqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpoZA//fqIaayFJUZ9fP6iRWSeWuaE3gRehgk4394pLC68a93HsPjeW\r\nowzM1pWx6Xl9A2oK5JkjTPtP+uTDeqGBS2AEGg/0301g9lHKPOAcCTLjup0q\r\nn6DesD3iMSZq4jQ5hafkVMuSfnbidNRxDHiFQdrzuZ/ZQq6FRQ/ZXIPJ2vi2\r\n18vofx73B1d22piG8Jp1urZWq8so6nEu3UiA1LKMlU3v/0wYdeG5q0qomYwO\r\nCVkxTKxax1NO5Dz40WUSfh6aJLlVOdQ1gmqyYxqBrfpyCK5hClHYou3ZaSb1\r\nW91H5xq8T8eFs2lQTkGZw0eBdVg0eTl8UJfXskyzTlQwbIQcI5HfL6lPAA7I\r\nNuW3S14eYJgnQtoB0H9PlJ4D/3HisfXM9uMMcv1LF9RfmElXyC44qO9n2CqU\r\nItOO3D+KQueR161LjqzDOY1FSwliaBEp4Cw7P5fvbLtvGjIMOuvCqljpWHwI\r\ns8ahKnctRfp3Wsu3vACitNhEoSCQ8eNRMi57uw6bhurTVN2o4PyPUtJDX3bd\r\nXcpfHBWiUTKlNiXsVcFVnsFQtZHjiS/i8E+R5RP4XQDN6r8WMQZ4VYADGcDD\r\nQ77gyNV1pJDUxzcomUhVM4c7CHDEvaCkzNcvGwSthKXoJSw2y10k4HkApWYw\r\nLgO+sXSbvka0dIcgmERxpoNwY2RRphg65vc=\r\n=GMnh\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.117_1670047210335_0.6576448636259271"},"_hasShrinkwrap":false},"0.4.118":{"name":"@flexdash/node-red-flexdash","version":"0.4.118","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.118"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"48421a2ac44009db230757632a070c17dfbb29d7","_id":"@flexdash/node-red-flexdash@0.4.118","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-o7RI12R9ekC4GhcTUscqUKMkl1M1dI9WUNodqkXnKt7kub6in+zU0yL7zqdqgMVzU/14BB2o3TRzeaqrVBKiig==","shasum":"043530579be239ccd8d2aca2fc45737e0cc1a748","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.118.tgz","fileCount":93,"unpackedSize":6064707,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzEJwPGrSLHnFJ7B2lK6XPPJn/KHxAhTTIGMV0AwWeyAIgOTkK7rpWd8uj+crm3LiHokL9q2A9qjm1dDuYBXvmIIo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkkV+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqe9Q//SARnY/k2V0c0DaJnOPY5MrYptIB3w4RUoQphbMoOGQAtSNY3\r\netjYB0JObkb3pxIWiFf8Hf/ruyl5TGxEdg/N202+BFycmpG85VyRUf2QD9JU\r\nyH4yZGH100JKfW3VZFk8dwd0G1W7hfQ6KIdREasa6QHRoyCqcCT6zo0Ft0gn\r\ns5slcdLS716NZLGsuYikOYkWHKgGTb2dfPVYo96olcZn8BwbqYtX5K6+jI6J\r\nWpJWH2E5UXmzeSgB+FbbRSDJJcHxAQKdCH07+tv04ncLJO/H1pdCSicOrODU\r\n9VMPrtGZEuEYPwVweJmVs5cmXNZ91nPAORYUNq/vZAayfQ0WIRLqSa4dnOWn\r\nF3WnDbMQcrq6ueL/RjuAQYLQOgy4o60MeqpPBDrNB7BPq6WnylCOLUxuXIFk\r\nVjvW9jjsxp6bi+RQddFKnyBOcC7Jxeoev13B3G2QpFM2wK8uDhxNWOlCNTuu\r\nRfPUQYdscgpEv1S1O+7ur5nl68VG778iKLebmM4C5JHvCyzAzzEq8mjsJekU\r\nhz3+ObWJm+26FHkGk6nZxb4+y3xMIK+4NEJ5EQ+ex0FBQozQcAUABvNeLxtd\r\nIfGEh7WLd66U4vODodNKY5uwA7XEDJwfdVoH36K0yVo2u2M5bFQ4M2JH5CFv\r\nNjnGx475cOrPtbVaNnmceXfun/zH3tobcJY=\r\n=u+sc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.118_1670530429884_0.8888784428777685"},"_hasShrinkwrap":false},"0.4.119":{"name":"@flexdash/node-red-flexdash","version":"0.4.119","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.119"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"4f1a111f9e15ac9fb7cf10a01d7cf12d4f3ff399","_id":"@flexdash/node-red-flexdash@0.4.119","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-hsiUoiNGIMofALNMscflnl44JA2N+Atyys7KH63iKOqWXP23O1hopu40UOT1IQKwT48k5+iWBIIxi97pSF1T/w==","shasum":"e97fd5e112af75e6da47d44b74d5bfdba932386c","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.119.tgz","fileCount":92,"unpackedSize":6068994,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCfKC1xyJ/++BwqHuJRKlwq7SvJnWymCxRaLfPF+WUS4gIgG3bzETg2CmHUoanLs57/PtyfrbXeIJPcfuikftnI6qo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjktosACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqdrw/8CHeiuQp7jmqXV0KDGrviqEgCcp4e+BwkIbj669Et1YBoKEhm\r\n5CwEx1YsXNiVcZRpB5E1i3Ib7HdERbhrNGuRACmxgsKhfOuINOHcLw0fsKPL\r\nwgHtaLlTfx7gfPrOrFxtz4QOmeiH9W7gwP17tOM6ZTpQaBmIRRWqHPywXHki\r\njFTL2kQR1/KohNsff5j6l7scADs1PEgbkLv9hlE8w970CoLGJohPWpKfXuzU\r\nLnQXyBreQj7puNQ+EHyuMHwX8d24jwAOHL5pauALwVA7BQAv+UZKB2299eJt\r\nNz2ohtRe39U821pou6EPDxyddvuc9BKiuRAd5QNV75X2VaaFgOAyxhz1sjAg\r\nA3B69YwpOUBE/52XO4P96ObDBaXZCJIGzCRBfkvqGkkHmDpR/ApiL5TjsLxk\r\nVilZWHlaJ0E0pcelZ3d7QnU7uHX2egR3NA6BoQic9w07YhTZ6eiek88aWmYh\r\nh3XqJ0saldRUIzs8ojodnACakxbb4o47zQXJYvDIz7PzMF+zOkNAPIWgqkwU\r\nGuJ08ikE3K5rrM3WjBD0X0aJYjbdXBfP5PxlRCFHjU3MRZdMUUmhbQogaCUT\r\n/CRlAgW/qh5rUR8I6L/O89AImhNgRW3td+1AKbUGTVhtYGsfY8S0znHg3tpP\r\nX+0Re9jrXLYtTQV2IWT+KVLi0sfLNIsFGLE=\r\n=C1jk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.119_1670568492311_0.5754184522693451"},"_hasShrinkwrap":false},"0.4.120":{"name":"@flexdash/node-red-flexdash","version":"0.4.120","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.120"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"aa9573567dba0e79040a2df51601a85b71545ff8","_id":"@flexdash/node-red-flexdash@0.4.120","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-ztjN2j71GnEKORvVOfF6iMoxCTR3y9Kx8omTSeaGDSdclCEQr6wRtZ+a6jn4ol+hLiZvSCEItKe4m1s5A1UQfA==","shasum":"5cd83f71818d9803c8e424981940e12d0a61d10e","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.120.tgz","fileCount":92,"unpackedSize":6068994,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCr/AU9Hwf4oNBjEemQ7IOMOMC8/iMPEIi7jYjcvOkCEQIhAIKCKkEoMwP1gXFvR2VOvrj/vlpzW2tKb03QTt3UN1wz"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjk3CwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpGbhAAggIB3gUY5nsNPCABPmREo8dL0d6e27hMvonVzD2ffL/zkmSA\r\njuKimvZ+kncmtrhct2cB0j+7Px3IM0+FcauTtlkeh72zAfgdTZcP7UeDlVK+\r\nVoUM5dWyIKYuE9zZP3s9C49GQJbzA2ZM7criz491bQYcOzt0TTw+pd4BoaSQ\r\n6WZ3vb0JBo/G6HLyhFoyl2+2wCYvjrX4pLTsdTHZ12yXfV5iqEgHiHrxzUen\r\n/tVcB8Al64mBMfNTTxtV/JAtQNGyIfsVRiD71hX3RD6vIeJmj9thOsvqJgvH\r\n+5AO1tAfW9JN3dIrhOJDLYIAwcDlTrzL5MnfiDXxiyFayIdcGSitFxncVUDS\r\nsdH1tsg1lxZB9SZ3E6UHNX5mIX6oPzxPEpqrfDbFjs3u2ww+BlKVFWEDP9w2\r\nYTqV1RfwGpddp13S5mFVRfpOmRMEoFAMHdzmyUXeB9+AnDOfJ0UomaFDeVlv\r\nsuxPNE8PFQYzeqSf3PuB7TyoG6OmzoK2BgmCw6rg+h7FzPvKPrkOLipRUozf\r\n4n8PMZwYgfP4HhiPY3iFhjvzxwsLhg4sgNbwKQTJd/Ps2H8Pt0Wcyewc/a2C\r\nyibL73mzIeBoUt4feHixmRV8kTwLeubt/ar/G2TJ/MKz3P8b0HQ2CqaWmE24\r\nHaHVGLjdO8AiiEapV7mFbdCwfhq/GPdBsD4=\r\n=QU7S\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.120_1670607024239_0.5464173062924675"},"_hasShrinkwrap":false},"0.4.121":{"name":"@flexdash/node-red-flexdash","version":"0.4.121","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.121"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"1746a1dbc006b51f9155293de83f43d4c4fdf99c","_id":"@flexdash/node-red-flexdash@0.4.121","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-7l+67dmC+L/jL84Otqs+uSeATurxDQj6viJUt3HNVyaLgYst+TxHjrPPHJWQd2LT1g3a2A63bw0DxbA0OURvxw==","shasum":"9d5d9809d5dac3d24e45469a02150f1e8e21d517","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.121.tgz","fileCount":92,"unpackedSize":6070370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEQJDy1kEIldMqk/ChQ2TItBQSix0hZMhcCd9OjbYlMJAiBYu+fpXvqqdeIPyJ/Xt6ZriXwHGFx00lXz5aIDWANMLg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjk+33ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrwAxAApM4j/NajBxXZx8Ch+Ve8Wu2t6OmUjP6QrJi6b/hLbbr3jPN3\r\nVZQIwaURjMfb1Iz96A3XpQpQEQ712Dqvi7PwCQ91s/7ytt7w26qAddHYoCzK\r\nHn8b1qbQoV264KJXnEvBWZS1Oa+98ErupYeC1sj9T+WjvdDO5P2q9DZBVr7z\r\njz9mbjttNFZunvoaA1f1pCn/nlQCSO/e65j2QZJXn5+ewjScB5xngFSqYHcg\r\nnGuVLqK4LPDeZjmstTzUn0dMwmnV3p0jomF5oLrwrvIeQv2jVfgAChpX9z1z\r\npWMOkieJzI6u9bN6UTBWKZKJgo4xLViFmSD0Z+/WHixk21vvGzJgQ/GYN0D9\r\nOAqjqxhhyDavQoQlacVLvK1RkAO0751hj+hc0e+jaVY/oB4hFZ1LKd//Pq+Z\r\nnwL+V9ghamVx305YrjSrpqNIkxK+IOHKBeRA8ekJBvDGhqO6vybQfZ46rund\r\nwaTTaydF5IbGtqoDXdkrQsI1Wyk67+93XFXEbo0bdj1c2JIwz3szPJK3T/me\r\nvc0X/LgmCcGhuGddExmRNir1bxO7rUBOatTWIE+ybB6NdjdBrsvdGS+X8pns\r\nv1R3dUPamhmWG6uv3TrlXXcDOvK3vnsdijvnKE1k36Bpo+bczfii8142SDQO\r\npHr52O3dOwg8bATQIsTM2HcFIBm9ulTHzVk=\r\n=Tr5e\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.121_1670639095468_0.44097607836367536"},"_hasShrinkwrap":false},"0.4.122":{"name":"@flexdash/node-red-flexdash","version":"0.4.122","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.122"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"537059c209c89a06355b6935e790863445666df5","_id":"@flexdash/node-red-flexdash@0.4.122","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-2GGmeqPPKoCk92tXdxZBgrG3Uyhu3rEiobHjyPYtUrjKOIat9NhOw75omV6RA+ydip29w/5abWAY1R9qA58HwQ==","shasum":"8dd6e8cbffdab7559ac55704f8867e9915a7567d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.122.tgz","fileCount":92,"unpackedSize":6070840,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSNo0PIvO8m8kCXoCOSwjgYAlqPQ8sxs0TJRA/TjFgaQIhAMSDHEqbKcherymA3ajkQBZp60mVZ+SpaRIcao2BttlE"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjlSeyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoC8g//acD8ztp7pd+SMQDR+T9sfXIgQLwCXrWgToyhIPFD2Nbe/XsE\r\nuEOD+2Bne88wcUp2TMPm7cov1L9qDqBju6EBz+qI+RF0EKwn/VUchJeDVGmJ\r\nOpdEAKvJ/t3kQdq1XEjm6QSDIy0A4pe7WsfgMYgrU6wwML7bpPAvlu36CjIy\r\nwdNdyeIO7qe7AjxWELct0QLDbvQ2UQv9c3uLsId6wvETLUXUZZrpU7DG2XL+\r\npz/Kdq2gZKW04GZ+JWQ50oU+PYwqSf9Y0Hj7kNtiA3M+XzEirLGHFD8IsWuQ\r\nK5pyb8K2+4R9H/6gRBYzy3ezXNwerBIdRUaaeUWFnXNDPDE9JMS0WANJzQDb\r\nvrXwLR85mndRw+LkqfM/1izI7o5w1fe2jvTrjfnEwXnPPDUWXmaaJXHjIjSA\r\nrFdl2f9RiBBpOeF7jmMPMilAczEorlbzKdOTSRqiML8edGB67c/iCXRffJAl\r\nFU1IQSdr9Mw/J3kpIneua6EfMg5LK3ecHX542mqYb5YwEVJigzVpYpjaAQ5u\r\nq2I3+hleDyFAHDCQVGtLibKCE0TO0sp/cwA77pd+Wa1r7vUCjcysmWDwKMKO\r\nwt/s9B4GXJHd1E1/rmnZkF3IFmefHGoeeek85nFmWdoVSi8g7uQeNk703lO6\r\ngG3hg3xydbJMYKoNCWOdempqyjNhUthKRG8=\r\n=qDBA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.122_1670719409665_0.4108647584714771"},"_hasShrinkwrap":false},"0.4.124":{"name":"@flexdash/node-red-flexdash","version":"0.4.124","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":">=4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":">=4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.124"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"0141f20f500f7765dd99133b5892c9386d61e7b8","_id":"@flexdash/node-red-flexdash@0.4.124","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-i48VqniHhYMYApRUQ6uFfFfFqfM1NWxX2Mmx+IusYbfN0axdY+7MWfbEythsaMcogE1pDEX5u8x++gDqZTdPRg==","shasum":"4b731684e3d88fd09f2d0c161c0d17ee2b593e6d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.124.tgz","fileCount":92,"unpackedSize":6070852,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD/k8bZKeClwWrXSMdDRTMTGhmbVfhXQz6Pdw/bSTst9gIgKPFKB1mZcsirzRRPcJGVzXydEFlYEhBzlZ0V4pdXSIg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjlSiUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq03w/9E/qU6Ux9eTrZpkpYfQV0WNjdi7JmcT3y69jSyDq4OM7rgsSI\r\nH7zCtsW3WqqNiSWSrvEzdM2eFuUmo+RM3cQ9NzVlSg9pa3As/EDuCxLk9oW7\r\n0smWfjlERZLb/LcV+aJM63NSo4e0pRJ1hmS7dRkJMoRJ5WQ/8YZjxMhIBeRb\r\nXOTKZCr+YCTv073BNeTVenKjcPheqIEYElujg7mvR42DhcJQIDBY7A5KD2lA\r\nCpq7Oix49Iv3iZewXavT4AMJ2r8KSn+I1FtLAG6cuQ00Sig7U7ZP9bU3TVPL\r\n+vZflSKfLO1VmzOWcA9TZ+fWGABeSaq1wtNUHBXfGWGrm30M7BJQ3NI3FMHI\r\na0QazJETk/e2E1UNi+9S6h4iIdCyt2mcF8pMUvUvN3Iy5JVhQT0seMD5ryRQ\r\nNBRSmWrb0JEpmUkXrenEldNpT0EeXkum6xhDvgWukL0rIp+xbMFcK0HFIFSf\r\n1PO78Kxj0mSrefBUZnEzK9/4qxWlhsxIeNPDoSGmeLDo5DNCx5hRR7+Mvoi7\r\nJ01Jw1SUszlNYl8lNUv0isTYiub7VC319TV6r11T0rsWMgznuNiIj4akWVzC\r\ncHFAEQl7HZcJtXntG8AcxNkQLU33zkUzgjcBaHazfi7ShYCIbGqiG4CIULqd\r\nD9SG74iYSevRKG+tz4/rU5qzMvnLkU/hgbk=\r\n=v8Ht\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.124_1670719635711_0.4814418849496047"},"_hasShrinkwrap":false},"0.4.125":{"name":"@flexdash/node-red-flexdash","version":"0.4.125","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","cookie-session":"^2.0.0","socket.io":"^4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.125"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"7dfec5950e56d24c96ec8cf22b5c9e7c222b7dfe","_id":"@flexdash/node-red-flexdash@0.4.125","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-A6JlxvlnaT/xshKrKeuDSgT2IKiBQhPEtTC2cmnCJtTjsy3dYDUpj7RWW8oPrgZZq6LZ+XijFED2rYjJn0lFNA==","shasum":"7d68a90fce62d24adcb92e663343eb3d87fc66c5","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.125.tgz","fileCount":92,"unpackedSize":6076418,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDisJTO9OELQaBtKYbpTsp1p7bbVVfzB6915I8phqLYDQIhANEhEltHXhfNvP9Hq7O7T9R4mmISWrmNBiPP/KNXHBFK"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl9hGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrlcRAAhhUc3m0TOVpOVSrCKX6nyS0adXBYknEgB2+dQZMekymzxWIb\r\ng6tcSwfsuLGRGsusidaT0zXA4Jgvm1F70ZsHG26RKGILB2ixUNQUHHhoe5KU\r\nQtJOQ8d2x+CtchaJHIdWpcjzHIRz0iTlHZgehGEdnH+NXptu9T78EMaxqgl/\r\nQ1RnMu3FHbBJ0br7Gt2oBAVExBEW2wjcmWQ8sl0tTxW5GvF5eHy1whjitNYC\r\nkYwnE45qgKgjK8t0h04moCeYgbaBRjWtR5T5TBzhNJA0PbKTsskQQJF7z29T\r\nmHreF3YhcrDWLhCTdmWRqhjhVKw6cQLZITYcb6wKFKVSnOD7V94FgV7zoyvP\r\nKvd8k9kiWxtl10mH0KOXQao2H6ilAeem+wWjICyEJRirfXcejI3Qv5ER/WEu\r\n50yjKvjVbwaDEf/bJBdjKLexa0c7ETtaG7WDrtdclg2r2wIBR+guJkjvOK2d\r\nxKr4TjWUza/rkiwT7NacSLMC8kGx2diNXHXVwmlAM6chU15H2G2QLeENdg9z\r\nrs5Bp/hkNN8oWTbQX9WDUBqCvFo9wVts4aPPWTAa2T/qCKQgy7t/43DB8qE3\r\nVz9pfTBIEJW1c8wJJU6wNqFaNlWSH/y+7VzMgBbufhwOsNcjOjL/WOY4FZsL\r\nVCOO5lQMQ4LT9AJBvQMe4FyZGfSVeN4wKJw=\r\n=CJ5h\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.125_1670895686243_0.2564649948046993"},"_hasShrinkwrap":false},"0.4.126":{"name":"@flexdash/node-red-flexdash","version":"0.4.126","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","cookie-session":"^2.0.0","socket.io":"^4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.126"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"b6b2fa6f366d5d69fd4e9927fc404f87ccf06fa2","_id":"@flexdash/node-red-flexdash@0.4.126","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-wHUwcCgCN3bYbvI59RVJdSXQVdiMpnmDnyuwoW00e0h0QJDCBAg+mWY4vsQrUKgpTWi66JB/tDZO/+OKvb2xZQ==","shasum":"a35877e4756239e769d5c23cad00cb872b632115","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.126.tgz","fileCount":92,"unpackedSize":6076418,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3h5MNgtAd+FXg/SZXl6IHtnsg1SRaOQ503+SiNy49UgIhAO+Xa+BQdZvI7TBAg3QGg/Sj2pTaGU7chcCkX6xy8gOE"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmBm0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqFyA/9E3B404Xvp4LHqXVFWvYMzLXjAQmnMU0EsMfZATsRhVLGD6on\r\n2DOzSIA39C0X0B4Ml9i6N7RrtA4UUou2K2/UejwDJFskboxt/dvYfqanF/UI\r\nyX09ormCxvC0BabGjGuq9FXSr2ScpHt0iOsgvaRvsT2K6hBFTmlX26viD25T\r\ns2LzTCZZUvWGmjJvounB1RptSkozLDosqVxzBIuUeMVqRCDRu2I1zqZLp/Nx\r\n0SBDpTJFH/m97z9cfdKDQsQFzKAqhz+9LNWR4/jFqGX9M9Ygt90UO9vIfFA4\r\nh6iMBtqhbXdeDSQRRJ1JANBY2tlDm8yA9zZ14iDhDabWje5s441C6E8b+6cR\r\nxIn1OJpr1HzUSngz0y6oB087APySP3nP/bBO1E666O/xaKJfTwhSM3TO/9nL\r\n9IPOqiWwpk+ZH1OHB6DwnA4wak1db4A44y/+OUKO6/ilQc6RqX1BRHx+5uUF\r\nkjzCvnQJkshqG5Lnyebt9n3FriHHPRYaFf/Vgk8wGWZcFZJHm0rJMdpKPrHl\r\nWd1N9KfRen04xGrbupnV0fsk+rQlsWDCKpXA5CUGMBsCeV64BVP5eJv/pggK\r\ncaVXmgs6dPhLlUMvgy4v6y0VG4S+Rzh6MnhjGZ2h0Wo+rMWRbcGFWf2I5mPT\r\n0isAqPvsZBezAHoQIaBaMRdxBey6i61MydA=\r\n=xCiS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.126_1670912435900_0.2205392422641188"},"_hasShrinkwrap":false},"0.4.127":{"name":"@flexdash/node-red-flexdash","version":"0.4.127","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","cookie-session":"^2.0.0","socket.io":"^4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.127"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"ab8c3a0b7b2ee29b5d02961784fd619b66490c86","_id":"@flexdash/node-red-flexdash@0.4.127","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-ARTDEZv81V8HjSFmv7TTRHEkanullIzNQOrX+0LLG6RaunpyBMYbkCJEkIttvZn+uvjnLEmaloW31YfshH7mSQ==","shasum":"b894e51656cffc051b74824c05f1ee01f4af5a94","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.127.tgz","fileCount":92,"unpackedSize":6093247,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC4bmUQqZFJXebPJpE2Bln6bbTG4LKpBelRTs12LfJimAIgfUXFOiRHHQfdSKUe3/Ulv+1Ce+jWW0bx32YVPM7+cmY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjofwzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmovSRAAjUKMh9Ym/G8/r55G24U8vt326D02oyyqvQQibnVqQOaj+W2C\r\n7rIFK4p0BUk7Zyfy1ARs1oySMHzK3ebcOzoG4l6mFs1ztQq7teAz5Klci2cz\r\nzUD8WTscZXMxB2elT2G5G8+hUAbGuIZJl4Y0oWSk1t7pzuDCXRfQfCH0ivD0\r\nH3TUQ7L5WOGN3D/9BtVtoZhQSiEA97KAMeDeIxIPJrRgopjskC+tniDY4hlK\r\nzDTaC3cdWCqBFwP4yxcx3nCe8XMM9Ehrk+/vtkZsqaXug6icxgWYoOPzvlo2\r\n18MMNceNzI10LhJ5mIiJl0pvO61CrA/8zEf/SwDk/68u5i3/AgHL5RxFAQQk\r\ndtBGg75csxqoR2zhmO6pgSbSrRgSX0RUJj/vRRQ2pZONlsnbqgekMJb776xh\r\ngZw5VcVfxAD/t+KasKUA7uVLthrl2xJT569gKgW/rsY3Zx/5cTITLSmZsrot\r\n0RWLN5HxzhS0/Omv/VcNXEwUAXT8o3oS7rCfkc+ftW8IPGREBSq0XndD4YHN\r\nWPFOEXLO7NWt+oyVjIG/tKxUesKhRzN0g2ouP1YKKBUIjuDUzGSXljHgdOdZ\r\nZPWi5AW4C04eFZ3cJhdIAo7gliJcDH84/fjl4RFvZ/tDdCeudVm/o6RLnZf9\r\nJg6t4NhJwrtBLN70TSPw6Q8MaxIi9+u/zFk=\r\n=TMhb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.127_1671560243151_0.6134941601331279"},"_hasShrinkwrap":false},"0.4.128":{"name":"@flexdash/node-red-flexdash","version":"0.4.128","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","cookie-session":"^2.0.0","socket.io":"^4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.128"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github/com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github/com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## To do\r\n\r\n### Near term enhancements\r\n\r\n- [ ] set-up demos for all widgets\r\n- [X] replace typedInput by something better, support unsetting, support color picker, fix booleans\r\n- [X] color picker for node-red using the material design palette\r\n- [ ] support fd-custom node, i.e., compile vue SFC on-the-fly server-side\r\n\r\n### Near term fixes\r\n\r\n- [X] fix reordering of array widgets\r\n- [ ] new-dashboard should automatically use a different path\r\n\r\n### Other\r\n\r\n- [ ] enhance Widget API to support more complex data structures, specifically, ring buffers (arrays) and\r\n  messages\r\n- [ ] during NR deploy block changes from dashboards\r\n- [X] keep static/dynamic setting across deploy\r\n- [ ] support editing multiline text prop values in node-red\r\n- [ ] implement checks for unsupported combinations: non-global tabs/dashboards, panels in panels,\r\n  grids in subflows, nested subflows, array-widgets in array-panels, array/subflow combinations\r\n- [X] fix order of props in NR edit pane\r\n- [ ] support array-panels\r\n- [ ] fix edit button for panels overlapping edit button of widget\r\n- [X] fix editing of array-widgets in the dashboard: need to propagate changes to all other widgets in the array\r\n- [ ] implement array_max in array-widgets\r\n- [X] Windows 10 support\r\n- [ ] Basic login mechanism\r\n- [X] Wrap onInput callback into try/catch\r\n- [X] Pass flexdash client id to onInput handler\r\n- [ ] Edit mode disable/off/on setting, per-user if there's auth\r\n- [ ] Create an \"any widget\" node\r\n- [ ] Add logging verbosity switch to dashboard config node\r\n- [ ] Don't log every message sent to FD, or at least shorten\r\n- [X] Fix display of tab name as title if title is empty\r\n- [X] Remove \"Widget X has not prop Y\" warning\r\n- [ ] stat widget pill size\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"a93a8e0268f04e13d720d4b217be7a48bf8f960a","_id":"@flexdash/node-red-flexdash@0.4.128","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-mvkRUZVt67wxGjv6yCiUWnA+b3CtQ8KY1HMyF3I6RsGApZPpWrXkAtdLHAswliW7WdDQTQbhLeoqjJoxJsmbPg==","shasum":"1154288c060a13d013bb0cb1bf00a17dbec1cd51","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.128.tgz","fileCount":92,"unpackedSize":6093409,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDY27SDl++3EdC/YPXBPkq5UqCm3NjM2QhLShBiyS/X6wIhAMbik/5b4XWk+xR8W1zwECmZ0FRTcJMsxXDekxw/fTco"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjogr/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrABRAAmWwiOJZ7IOj6GRFain7ZHiis4zCLL3o9s6BeSWsoK4mQujH5\r\n41qQK6PHF4tzKtJZLnQJeFj5U0Ij5YLJROz2NbsA1kOSr0UFqaDQRQDaBy7Z\r\nECvCpqemhXL+H5aC6GT5fgA3miRf0s19ecl1QQCqwXYMELGPtiYNF3Xg3OAn\r\nD98ZVXwNGzlODBva3qlJNIN4RzJ6LDN9VaxcudghkTiJWaWbDDJjAdsgTrOE\r\nAhGBebavwhGMfVIn03XB5bn+b6wf/YrMhcHFMM9npfPHU3BdmZUCxFaAIUOl\r\naq1tWsBLM+yJlovao3o5vwJDu1wmS0d+mL4eBfMJc/K/TEt5CDbLzswTNLOk\r\nF0uHOJvABWDZwvKWrzYeh+mRRgX11cHQLgEmK0WuEGZW4qE3IsyqwQhq9l40\r\nsudbsDYwGlWFKGybXwZXr2xhR3kieBz2pcuD/ge3tvURqugayG2PFTbUF6lH\r\nEOYh/kkBnfTa9Dx1s7jPEYLUJzfB6eewV25UnHYieexl/1g9UBJcoODZmy5b\r\n8+JbexMIZeQZGNgAtXxf+kvWv0aXax+QYuGtecp3AtdtlsF6J+C49dmBrG5T\r\nD46LfFlE6uXVE0JzatNlCSNmuTwPqN0jo8qRCIVTySm11Pd2KZdvAfWI63uR\r\n+MaIXwwEIRm0Xo2Dbzvenoq8xOwMSxosBq0=\r\n=ilFW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.128_1671564031316_0.7396485654978882"},"_hasShrinkwrap":false},"0.4.129":{"name":"@flexdash/node-red-flexdash","version":"0.4.129","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","cookie-session":"^2.0.0","socket.io":"^4.1.0","tar":"^6.0.0","@flexdash/node-red-flexdash-plugin":"=0.4.129"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"780505c00f4033373b44a4259eda1ebd37dbb419","_id":"@flexdash/node-red-flexdash@0.4.129","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-bOMt3Yz+SHlmhTXwn2IdrjKi3rseyPNAAyufSe+0FK1OhXg56LNVod3JNcVTBeQ+zgP0UHlja0fum3HtDL0ygw==","shasum":"b9a32f6c32c7bb00789bebfe481a6bfbc9b34be4","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.129.tgz","fileCount":92,"unpackedSize":6093398,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGM0bCHTwN4kKth5+NiHmM/F62SEtMHwuSzDh8fBaso+AiA0h3VrwzBuEeG55k/jE5bR7zAyYwDGCKaVNf3dPqD3xg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo6a+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmouDw/+P/jbxeQGAz2DUpATtiM1gY9ojBksDB9UjOLCwxnh/2pjb4+O\r\nirlWhZWLTNLSHpJKA1u5JG1pvES00a9Ni7zHlFmzmYwOl8OYsS7WF0BpPDA1\r\nC7sEGpABLzdGlcK/oupnSYo6sV4qWiOg4PhgXwawwAJNsWzqMSH2KrK0mT3H\r\nRJSkClWzp5hhPbnkrUsFf43NOPcWZY4BD0t/NaArytf4wcBIGeDQ0xgCvNdn\r\nJUMawnc0d/83QDYGxacMdZGggMXhuw9IvdBqNbuOKnfs71HCkTERXNM8EUqD\r\npKpL01Euo0mA4Tqcf+2mUvDM5uDdUKzrV+FQa/ofaAfj6itsq+TSOPNq+NJi\r\nKHUBvELWHqMjV8+WO50TCbfjW9qxMrzIhq4rpMNtooc+rlEMoVK/0UTClbgF\r\naM3fWogQyVzbsu/EITgeiq4DXWhKhLF2YsqVeuI6axyd9tugd0CwJMRVsu7H\r\nWIqHk8LRUIymAa4pM3sjLbjFF0/8aoQtTAoZipTMl7WysTuX4X792DmNyuOV\r\n/YN/Ouz+9UUpFCQupMl2yz2WM2qG2J0fY6zM63LfGQ8FySIUe6r8ClBpHkkc\r\n9SCbTSSDB1labijTW3a/bm7/3AKjZGpexRthzYZnonwdB4ec206/03O9KKWa\r\nq0hQ7pdKeTm00HC+CihiotBanGMxjZ9vT+8=\r\n=J2aL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.129_1671669437991_0.609324438794272"},"_hasShrinkwrap":false},"0.4.131":{"name":"@flexdash/node-red-flexdash","version":"0.4.131","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.131","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"1dd1069f82c5847285f262f18c72d9f4526f68fe","_id":"@flexdash/node-red-flexdash@0.4.131","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-Auyhw2Id38gVNwWxAOYpzfhuLrEfbuFKc2Z6qjMqchnRtVBgjWa/h4rwqIG50B633mpcte3uYp6iwzmHp3GInA==","shasum":"47e9f6227437119c54cf6498d7fc0ce8a9981781","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.131.tgz","fileCount":93,"unpackedSize":6146055,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJcaR7BjygUVfVBCquXOUjIJKsoLRJHLNrqIBQFyXkFgIgD8MMOJrbialInbzyCR4XqjDAU8QZTWMqutV92SUxeLA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqKsHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrUXA/9HBG6aCElvLhNRnxiXd5Tgmg+6t1REYKh10h0KJej96WQ7hQm\r\nV+gD6uLht0GbbLNJnLMIhDBPcq2WLMSzP9FuSPSFC+k7ETfK/RAFmj0BGbY3\r\n0MQlyupTApCdyDnJDbPMAiKXJFUTzLKidQ0QI6021O96gEa2ZjcVqXGFT/Rm\r\ntLIbz/l5cpSrtO3G14vXTjtEteYxyuwwd1fnUcu0FTRYM8BbLXy9L83EN+P/\r\ngiUl+Yfx4ioe+80JTHTJ33xSlQbBjzbRy5B3/yJ0y6gZd7VxUcRrVLA1gbC3\r\nBPKCwgbHKeWlwdgCfoj5+U26tPkP5mTe7vcYnAk9Ys5pluMVPcPzmYVH4oZD\r\n+4LsvjyVY20DiA5nMWPFZTOBv4JHjJoba45iy1VXfchVKDUXi6ruMbz8URa0\r\nYdiFwPDWK/HOtAPOncH1W0Q1AXjRPiPFNXyaZUafxKBlHTS8OMvydMFN2Fko\r\nqzprXfui/a7Xp9RgYeQKi6J3Wx5aC2jrN2HrT+AbjzUl7+pybC/wqpk20D5V\r\ny5VMXYzai5fmH4l/tMt0pWoLQPSnFb3PT7OX6BAlGWDaA6icq2gpgCwk/xoX\r\n+bT9r423SRqjp4icMzlDq1x4cuZqppMiAAgTuoyKfpVsmGVCI8xOuwA7YIAu\r\nccKJKBHpvA0WnNoLr+5qsDJ1WBFWF3ByTVI=\r\n=ABrw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.131_1671998214988_0.9367251262444203"},"_hasShrinkwrap":false},"0.4.132":{"name":"@flexdash/node-red-flexdash","version":"0.4.132","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.132","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"edc397b357804c182fe54e82ab9cb2695144a018","_id":"@flexdash/node-red-flexdash@0.4.132","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-48jsUojekiiv3FtwdJBbSNxc35X7kiw5DVD0dBoWIQsyUAU8e8BbZnsm9k2hfU2NoJmUITgOU//6oJiTw6UUPA==","shasum":"cb85afd3504b226e594d03569fd0ead44abd5c32","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.132.tgz","fileCount":93,"unpackedSize":6147605,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDCVo09O9fj8sQEF6TrfDurty9jOrKCQOFaFqdBiQLsRAiBkCdJULU9YULA4qsGmjDcBPdWF7v8/XHjvblyOXTilEw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqef+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpwoQ//eB/AYj+r58odlXJQZRrhan7hNf7HZMPFAHldswAUs45dlvFO\r\n49GnsyIA7Yjy/1vGbPUseNV15XagykKsl0KgGRZgCublRF910DVsluOV5i9l\r\nmiXK65mfUWfVcQ6SjXmUSjhPFiPk0diqCxN/BWMlA3+ovtJlKYFSNbgZ+5o3\r\nrym+rADxosCZ/P9zinJG+85Y9ES00MfrrDG+UBlXYNicfYUk7oVTa6EFH/g8\r\nYYbuIqJv4tmb6L1hE+AaXdwM21/XybDdOXxd+iSjj0Ac3K+7K8dMmUiswexR\r\n+HxgJQ0qvKTAjzSiAccDY23zGFQ6ptxxlsZMJPCUiDI3ZKCWnGR3rbAT2/C5\r\nTNSQ57o+gS6Y0CehJ2SvS8bcTyR6dtyYIPtEno3uwC6h0CAkCx4IXbq8gP23\r\nN51e3CPLs0qoXDA2k3GlK9UQiOgxqI/P+lAcOvmVoXzlrjMVqyGaQBlwWcpH\r\n7LkBPlrTIx+PmldOZ4VrpAtS/SHthfnwkv2nM2OAlui7hmEiqntgNYEbGCS1\r\nC7FovBI0w8oewTfK8upXMlbqg4AhtZS/8/TX2LJOIUF2pDoAX29eyKhw88bd\r\nMntaFRnxCYZmSuVKFLcgbeQceWiDWkSpbpijovRmhPVR/rWhrbJBS+xPI2Bq\r\nRHlW64PWlcgZGlOfQ7aXXHN9lM9c0eT4J4s=\r\n=FWFA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.132_1672079357780_0.6301120512528322"},"_hasShrinkwrap":false},"0.4.133":{"name":"@flexdash/node-red-flexdash","version":"0.4.133","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.133","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"b713095bc8ba28809528617a0b4c557636be6e18","_id":"@flexdash/node-red-flexdash@0.4.133","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-orI6e6saxtaLAr6/jjfVbtz9xQeICwpqTAGITU6TVahQ8RBfYTARY6LDY/8jQUIM8/ZGuyoTvuCR71Q1zGRpJw==","shasum":"188a34038e030bea991a06b0f7f0c8201f6fde32","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.133.tgz","fileCount":96,"unpackedSize":6160283,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICq+dYIAfMeQAZH6+O+TaawEh1jGQsbe4PFgntcN4tabAiEAxSzeL7rvkkSDPk8LRHR0mvkoH4Fjc2hr+0yRTC3nDy0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtJn/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQlhAAkTtgTXTUZ/XEfFwyTG7GdUV48u5xBHwnsXuBgACDu/2HBLf1\r\ntpRj0oVpdb+Rm6EwtaC9uP+Bmw8j5tq/a5kgvUyDBrshoFRu5JnqpwQT3tfk\r\ngY8fbO95BaENTcfKCGK/+L+eX+7FyF4BCTVuKVGmBhAqq9L+cx17pkL8jGtQ\r\nIFdzE0xoP7GURonRWrDah+dHUZIPtfRKgf58kq34UCroVM8dXDWgC3dRKdlc\r\n7VJulwvbOO09KTgcUJ5xJHJhV1NPdmbBbroGzpf+ZPra6HK9lp+dLE/Cbi8w\r\nLnzL+zYe/Flpxn0O9AUMstINnbUlQywD8kkgo24CmdPjNMNB8KDyzXrRcakg\r\nVl8wG/f/Lm1HNEKn4aem6yxPXnDheqzba+iyG7MBzNFTAOTfSmmKGGS0yGdy\r\nRDbO0BO9Bi5yUgmVmNr9ab+fA14yHjT2QIzpUt6DiT/77U+2U/DSEDH6jhN6\r\nLfs8CVKFR9UP1jvvcR5Nvjl+ZmFjWPsoWPn/IEjySZpgrjz+e0QUABpa5kif\r\nKzBnDsuy8XFzGeW/nHpNvHKKTKMgniAHBDSvz27OlGuM55DkSdcqTvMM+xEb\r\napJMxkCN8VRkWn5c+bPOpEzJeCp663n7UOIHd0uR/WoKsDiCN/XJ7IFfy2np\r\n+XlmWm1rehukjhoRsaYWgN5hYbLDt1KEw/Y=\r\n=CiJ9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.133_1672780287631_0.4025461802522867"},"_hasShrinkwrap":false},"0.4.134":{"name":"@flexdash/node-red-flexdash","version":"0.4.134","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.134","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=14.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","gitHead":"7f96ef69406a84728f0f88dc9092da0f181fc2f1","_id":"@flexdash/node-red-flexdash@0.4.134","_nodeVersion":"14.18.3","_npmVersion":"8.4.1","dist":{"integrity":"sha512-XZNWCqhoO5VwSMqGFGpGEyz8irYZMsnEFSGnf7K7vicnxTQBwC2lLld4mCsFpDBhBwzm9pllZQ7Gktor+TpfNg==","shasum":"d310b0e61f53c1b0209cf07d76c1086a8f869016","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.134.tgz","fileCount":96,"unpackedSize":6160283,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDKzX1YqHON6ZhGqNSs5G2Hf7aeqw6BU8ug1mDClIa5AIgbRebwJtCIn3HFgnKumWtB7tx8toaprasu0ONk1z/4Zc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtK3ZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr6xA//Xqf+HdBBRG9fH55+LfqCf3suhLruFXksKgdDkiMZCLZgVw/Q\r\n0+StUV26CDsvvk+f/nDBakCrh1mro2Xg6rrrR4iSzpuJN+MNybXi1zWk0x4h\r\nTdxkCCyFghxGQvu7rGMLjJWlUM+6JU84BmiaEazMHY6rQ1ZJ4nufbImXledz\r\nuO44tzEiN7mQvkVA1YePbHfEXbCB91CV86i6H4HJy0WWRo/JrF5KcZSs9bDN\r\nBJ9fWBpd5Ldjr0prfQXt9yrX/s4PDOmmoJibX6ADYitW3zNLuytZfmaTjaAG\r\nkou3Y3X/oNkuKHEeWioZZmzss/+Xza8qcwDJRVa6VWUopApRt0IuBN0T6GJF\r\nE9Xg4sA8T7gh0NMJUCyWKF+x873k64A+pH7usfTanmjnZuJxsnQobEWoOZrg\r\nMMsAFyTWDEtZSGE9V7L772NAPHax7SikbHdruyyUEStN7JFExLUjyWTQl5Ju\r\nnILcZ90gehzn3U1gh6pvsFHzjfWxvoA6z5ew976O4tmBsTeJsU7/ED3E8amw\r\nRDRtkFqEM5GYYboGQTBXjv628ZMZKWzB8LJrpPrqoemAdY/QFHQcCJ/jzssC\r\nfKZ9FeyLw8Gueak4iDyYvthDgkfsXugik68Baz6kjfc/Eta/HoZeGyDVB1Nc\r\n7Ng9zgfV2JQi60NlrgnmwA0SYAy8tBZPMFY=\r\n=BNeL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.134_1672785368656_0.23297716789459444"},"_hasShrinkwrap":false},"0.4.135":{"name":"@flexdash/node-red-flexdash","version":"0.4.135","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.135","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"dev","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"81dd6b02bdb08958407fb4844309715e22e3ea1f","_id":"@flexdash/node-red-flexdash@0.4.135","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-yaqu/3xaZGLnss6UV/E2h12Y0sUTOnpLlb8bnZ2MHXNrDqW36TrmrE349ML+ZtiGMV/GxjmvK28PFaX+pi3iEw==","shasum":"0542e42edb4b9f1c72c6d0af63a85511fc4d6601","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.135.tgz","fileCount":102,"unpackedSize":6193160,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH4ikqATAbk7CNS5pgVTlOQTPpyyndx9XJstCxDthowGAiEA4aeYxSOrJKKF/MKHbXWhbArho8UYSh1GDW2Ji5X/038="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxDTkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrP0A/9EdlLL2hnieB2/TsyfxRsXXru15LOzL2ztYpcBo3a92cx+6oc\r\nrPYcwBH6Xz4NLmWPqGoSl2syU3dGJflfAk8Zo3LOGTFyfs+OgNiG82SkB2bQ\r\ncnHUF07UaqV3hfmvo+8Tnp6PGfUu6zb9PKV/sDHKZM+uktXVS4NCy+a+4nxb\r\nY+3vskzmxaqIjqojpljdg4WEbMyTIFF1iaMhEvIEXDSAyQwwlkW57g898YqS\r\nvageltoO2U0N3mT3cnDD/NJXeMCos9AZz9SlWUdrmhdLsa6Ttecp9j5LMEG1\r\nKUypVzoWv4vZLVSBOJ9ONOsfNQm8e6X3PTwFSf+h/bAJBWaaflqYh8SxWdUw\r\n0nnixnrvmhhh60pSC6a9/fSg99cpy3AqyOBad1FIANs46A708yGLoPM6+x8R\r\ns+oR/VQHkW9Y8FRiRBWbqSHbWSdj0xBLgUsfsNInZIZRK4J1W2wAXBcdJ9EN\r\nRYo7zBqJ32Cw96cvYbPBI2yj4VH+ljFDWYXwL58p48qoChZ4v+RW5Gfdpr6g\r\nXMwaCgU8TZs2exi0QKXOWnYPuI+nf2yY2AMrFtX2vIyNYLFWQqNknnEaB+/Z\r\n1WOXAm3Q4kJ9ETs3ChyHs3J9cXxsukdL0S55byrxo9Pxzug9s4A1Gexl9X4t\r\npSjdS+VAzQsnLIO5/63YjkM3xYc9VIr817Y=\r\n=stWR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.135_1673802979785_0.6284317041373608"},"_hasShrinkwrap":false},"0.4.136":{"name":"@flexdash/node-red-flexdash","version":"0.4.136","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.136","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"3a8ac6e5d0dd0a1575a71e053e6e23b5ed78a921","_id":"@flexdash/node-red-flexdash@0.4.136","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-wrV2YMI+Y7g92+KrKT6YbSfIWJAE4ymAKMqvkLLDqyH/MFqMyzmqifgiDVnlki6Tsfk/EiaacKahC1gsq8YgcQ==","shasum":"9e6acf654c1ad913985ce196bb23339aa6bba565","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.136.tgz","fileCount":102,"unpackedSize":6193163,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9KirGkhE/CsHCGi1qPc8GFnzsb1caWvwSClzhGixthQIhAPc0GbJlNXulFqO9x3/JZ5R/aqT9HT0QTYLN1c9dE1BY"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxEysACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+gBAAjHjPDpbI+G/7WHSELh/MdK4waeC33AeOXHzhJYM189BId7R8\r\nK6To7FAUM4ce4ib1aQWTadHrqh/oSMHuBgP2zLphhpaukjfOp+R/uiXdryHd\r\n59FGbPwlQB02FTfrFTmIyaXVX7IkItyejFPwF2kbz2hFTGf82ceeGNTYRuOg\r\nDE68lgwDQDMURPIv7vJED3uW/nIA2GkLZcE5h1PS4iCdilaFzX68WNAT34md\r\nuDmtxxkmsaFSaEqIVlOWDWHo4pjtsWFZ32R5vYWCP9l4f9Wl/LnWcpzp6Jqg\r\nyXwIVFqoyvh7Q0NRNP7fdMPp7Ge9TG3u4qF/hAigW9WZKgpAXVudAXEEdEtI\r\nsyVfqd7WlS4AE51LbBH3gNz+Pcpj2rFU8SdJgKHayrH59/fxE/k5cFWelFz/\r\ngLrWLTNzCB2wjC38XCjZAUwOReKqHwERwvtH94s9mQVMkAlcEhqSG5fxKmHb\r\nnaIA4N2VftZ1QP8Z6hDni4raakuyjBwIOykgrFVvEg/QHle8kEhqXLNmFtci\r\nC3XZtBpLxMBW6pvUkpaVK247dwa999l/7tbkSGrpkQFnDaxNYDFo504AQIWi\r\na8GgbGwgDLkkogZYJggx2YS0XJAUKwnsTsfjQx6xzmchOnHC7mMAhGDZJpQt\r\nRH8GvewAsJ8RuZFaIf6heuov2NSLFO4Ayzo=\r\n=mns6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.136_1673809068572_0.07900703289081634"},"_hasShrinkwrap":false},"0.4.137":{"name":"@flexdash/node-red-flexdash","version":"0.4.137","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.137","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"237ffb983e39dc12db46785057705d38d7d8ed0d","_id":"@flexdash/node-red-flexdash@0.4.137","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-8lsZsR6rVcOuOFfQlweW0IQ2TRZ2xR7BikZ/pMpJR0lQigyQBisMNWQrnCu26rf0O2oU0b9+0TGpw+wbZLgsGg==","shasum":"8fa937885e583d1ed715ca91da703905fd046573","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.137.tgz","fileCount":108,"unpackedSize":6225174,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8jzyX6wR4dduVNel6WvBoscQNxV58jGEbpk1MJ4inXAIgIhJn3VVhqcuSQ+fYEBP8BYGeVN1tBAQS9SnWsJTWTu8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzEvxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUhg//b3qvohXB3wi3PRu4HGqkuOb+0skgQJlu6yF3MJHRjWYb7gsR\r\n7i1nJFYfcIok4yMGfJwzFBP2OxMqxohBL2Dj7A8/lpsuihdlsjI9+6nmiAf6\r\nmcFsFD9ozw9MTqFN23pKfZe5TTIz6D3Dh3kh8t+WlMXzbdqX0Ae74tOQxzVC\r\ne6/+SXW6shK/4+/J4ZMu1iwK8Uiy0kSPPuQPlr9ZuQmPDn4wYDkAPFt+9p+P\r\nKF8CX5SognOjgiMaRWw3nlzAj4iuG3kawPlqUj7PhXMOz6wST8sXHEoD75rE\r\nzkoQU/bzZh4MfL5x5BHVTTp0K8FIoIeQHYRXuzIN1O6Abr7uu8X5EyMBkQ8d\r\nTPmW7RMiE/ZIiWYvWJ04yDt4ZUMDpzWcn/y5WHG0ZlTvPTk0pEMFOk4kU5T9\r\n9+ILk5ymN0cqspoAYDhmV28ofM+xvTuYTEBxr52R6wJphreXxtny4VLJQqP1\r\nw1FPJcAmOR+7cqsq0mFckoaRPnIChh4HSQVBEcnDtsCZ/mRz3Ktln9Ww2VVy\r\nPw/8cASBdy9yhc+drWiTrBDEdiQAGnL3/8GtdfNvRS47001HdD4TeX+lYpnT\r\nnY6xDIsKsYJwbHK8Hnn8w9oqgLvkvz1lvT9bseZ2nCOzUfh6qA1sLZbDsJ1p\r\nqVH+2w8r9jO0E4kpyO4uKg03xo/4V9xuXH8=\r\n=lfRZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.137_1674333169208_0.45889030578125767"},"_hasShrinkwrap":false},"0.4.138":{"name":"@flexdash/node-red-flexdash","version":"0.4.138","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.138","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"c16615161d1649191baad845c3ed57dfccaa9893","_id":"@flexdash/node-red-flexdash@0.4.138","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-J4ZRQrGkVUAK86ZoYZIyDamQNlnqbWdcQCmtviSvts2fdL5slIiry9R4LmpgNgNQ8AsAFzMTaypzKS0Ng7JvoQ==","shasum":"dc19120d51e2f9300f4f00032967daa66bd081b9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.138.tgz","fileCount":108,"unpackedSize":6225316,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICi0T6D5HDKRneV0hSj7xkpKt6wmVbi/M523OzD4ui87AiEA138voCi6mbI4rn9tOMIVVz2ttQWZWbW5+gMw4Gkqj+8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzM8EACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqXvw/9EKFHizR3djryk8kdL46TnN7TxnNH/e9NRzI794nPS+621TQp\r\nzg8aRj1mLQ21Sn4Kb/DR07wZhYtfrriyxdzJ5nZIrVcub33fTcGMcv/GymKH\r\ndnqmgBHdmuooAdtDlCFvjFk8mzeB9WpyTXJrNYSpHXFgaLEeKhT70DWaY3Sf\r\n/H07i6LiLeP4YBFGxIqM5gw9SMi5J3P7NJocH5uSr03o2qahBKDy7lbiIwoa\r\nvyeadHV1gfvpTjK+itrsZHweVEpVSNHHVhz511+9S0pi4aX0qEHR1ScJkP9n\r\nRGCZqUq/5bYT+xxbcN8xlKh8+Jc3Q8X93SItvpS2cSnTlEmKHYmmuSVtULvZ\r\nfFcyiZaftBj/NuwvbGRsiAcMkMSwFXTku8RXLdlp1GTpHMZx7QY80zXEVMQB\r\nJklU5+OpbE+uNrFCMzh2Qzx/eHX997sngc263Ka6z+m63ZNfbrgu8p5afc+l\r\ndGPyaHUSm3fqUhm1WBXqp4YzLNptbr+FIyFygWQisk36W8rxaJltHt/8uGYW\r\n0acXlbjVYCvfIZskxWgtqqbloW8S+Mnlb7YekcR3GSCQ4NgspwNdZRqWjcPl\r\n2Wa0fhid6P/FuGialfE2qEElHvPmpSu2qg9mXxVh3nVRCBe/7LF9+dEcFy7Z\r\ntiQ7IPlrOGwLsQ3Dv59WcyhxM3S2G4xtyLE=\r\n=nPhV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.138_1674366724650_0.4472682227221296"},"_hasShrinkwrap":false},"0.4.139":{"name":"@flexdash/node-red-flexdash","version":"0.4.139","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.139","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"260bb6ee8f01411925834b9faa1fa7f743a1c729","_id":"@flexdash/node-red-flexdash@0.4.139","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-VXsGJ2SL+wP/rRBtGOAKL7RDtIHZq9EzQPD4xiUmJ3j0Vrsci0JSFwnTjE5YdV+h61ofN6LsywKk6jiOIFpuGA==","shasum":"c0c58d76881d90d400b9637861c33f9246e056e9","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.139.tgz","fileCount":108,"unpackedSize":6225250,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6dExHAtUejotDhZAonUIV0Vq++NLVvrucfBBCrxWM8QIgPATROYJjAiklidf5sQRTvNx+dTP3nW/9DUaZ96Y9fxg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzM/mACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp9mA//aFcxuxVURotufD8SUXYud83Vdwdj7SpKZv5nOhQO1/nyjdqk\r\nthD7HnYaAfwTmDEiBLh1KvxPdYKgZDn3hskT08Nj1UomJG5+beTFDZbjU1ad\r\nxclbATdPj8PoCAEb58aO+ek/C8HfGxJewZSMhcckB0J4jHKXi4FXpVhU453Z\r\nNMtqaZJn+3zZhJnngrMrR9OifGMFxbbd3wD78EvVFimv0HY7+TqSQvK8pn5B\r\nbZmhrEsYweQ26Skv0kxjtBgYUaLnjd4bljGEWxIEsLpdKHaofif0IvfM1n/f\r\nb6jdy4uMvbBl3hmej/3gMphJOZ72Bl8bqQTiln3kQV+WC1qtOWXFUstwxbFf\r\nDpUjG9SBj0dUO07lDO7DMU+IzJN71qEP91vQeLx6++cKEPmjbAggruLYGM39\r\nkEB1dWQRy1Aj92ON98GxEfUjUN89iP3sE+SHui8pBUr5aKEswEUhhxeaSUH8\r\nuB3XIMA1YyVZqTCn+y7MgQEr6+bs7rfh40agT09O+Bscu1Ju93amr2RG9Guj\r\nw9WEo8P82jcb0pesC814qw0UCmcUdZp6UgvROQImuJ1N+KKG6A9xCaOyQ2X0\r\nlVMJd2qJiYdGD7ZHWzE9XvymNEIA4flEEb70ykCxqJAPHspHRs5kX5F+GGqy\r\nUKN35XBMZIasp1L7iTd68tEB8lqNBLRuFlo=\r\n=sK89\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.139_1674366950158_0.9746229090069132"},"_hasShrinkwrap":false},"0.4.140":{"name":"@flexdash/node-red-flexdash","version":"0.4.140","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.140","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"6c3bb055baef4f88e6f8375ab898b5b9a4ffd604","_id":"@flexdash/node-red-flexdash@0.4.140","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-9DVMMWkDRVhrlr9vr/2wH4jTaNg/dxM3dKUNseAVZDyaG6187MtFvUepIywQmiVYMjVQfw3KR4AVdJaRcXcj9w==","shasum":"65ee56ee1e2b556bf74a25a949bf91d8ac837f69","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.140.tgz","fileCount":108,"unpackedSize":6225282,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICnX/n03uU0cNwUiL5rqsjYeOkDJyYVFcCXCeVjY8LDtAiAGADqaOiHefS7ldALQEhxEHbW7U11YM+phoUEgIhaSmQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzNPtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYRw/9HbHz18eHqsmXOnDSO1tp5Xk16qIdVN4KwPdBNE2ZKj+BxKkx\r\n1ZpRgT4OEIWDIwf+QIKxcVuL4umoBFn7qip75vZaYiiL7HLRWfIoEg0E/TCs\r\nhA7fbKO2W+YevAEx0jMCyQr4E0Am17kd+8GOOdbpW3KQjrD1eGWRE/HNAXMT\r\n2jLxzfeOb0MAHHJc1+ecg0KL8O6oz4LgmgGGLsI9dMpiMnwQHVsXCsTuDyM2\r\np1ImgwOmMwOi6N39B4OZuFO0iBlsIcTdA67JDMQ8HYID3pAb2QF2yVFdFtTX\r\n1bpWR5hwWX86fDCEeglRRIzRHepLP/jxzdLSjfEGejkDGyuiQ9Ah8fDYjQyF\r\nql/nJl+TdHcW7GjgBoTgM8cEWIk5c3uKlPCxCeStsb+gneQqJBixXE0VAEuB\r\nP+F19aTi2LpCzVYYtXMaob0hghKffSanIB31iJUuDTFfLa4PcXxNsqkR4u0V\r\nsZ0rI+mORPij/nk47YCyOF0ipUxqEc5PVdY/yXdUDN+dFNQ1yVyhn1y+AWAE\r\nRlwQVOFAvwzOzVmPX+9cokyZyHverCmcSpJ7NqLQKUJxgyR1UfPYBfkmntwd\r\nPA3V8XUWjLzuUDrdKXMqkbhc8EdDjFKOTClStH5giI90Mq+JAlU0dcU5a6xc\r\nNHnCop8NvBpIAuiLB5p7V/YOt+XP89vMaHo=\r\n=UtCK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.140_1674367980823_0.7482537380716019"},"_hasShrinkwrap":false},"0.4.141":{"name":"@flexdash/node-red-flexdash","version":"0.4.141","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.141","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"gitHead":"87ed51784e63bff06257f026654f1c875bc6e018","_id":"@flexdash/node-red-flexdash@0.4.141","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-8CJq/K3wvVkezkiqaW7iZ2G9PmOKOJ7M746yN2u4bmsds5v+EFYn5iC0+swOlfUXsCOGCSJcPRkjCo3ngemb4g==","shasum":"a4c84456786ac4996fa643e8a82ccd0e4a70a154","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.141.tgz","fileCount":108,"unpackedSize":6225279,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFo+drxZS4AcQGwoON5SR6xJ/AoW/8Ji/kvXbXcL9B0AIgW/cgpntPNK+LZdiyV2obHM8GtGpUuJSKGIhiLF8/vss="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzNvPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+Tw/9Hbl6dtdBtCtXQYo0aNYccBc+RNI2VKXIvBnu4WmljeVXyN6d\r\nUM0Gy0waIB6JzPpRBZ1urLOg2OvX5E5VHKtpy4Ciy4EO5OsJoCrM6RIlSbz+\r\nGadC+smSpM5AGyw2zC8WHbZ4W6ukgBjRLliQEHrCIOTKFqPCJcmKMUdWiq2j\r\nxsYH2iieoj0zDuZWZ84L3K9MX3ILH1dJhaJZQaAH7lZw/TO9IGo0mXhsM1Qi\r\nSjBv7j8EeG6ALydF/amZnWwI0BXBVDiJMJM6kf/RXA7Hb3OQSTBNAcQwMs12\r\noAGUfLAYTGH5AsBE++hZIouvmreHDSKd4u3FUpxCI2I0tMypAwauhm5viDT1\r\n+Y84VlVKkH5D8RE0A+Dw7wABd5kwGAvJ2DaWJQbQdktNvLGgmoNGNqnuZalf\r\n7B75+/sUYV8LabeUbyNzAgh8IfgXvql9/o2FvITWFaVYEw3veFIrZtqk3e98\r\nnc3pRN7+xVdAVlNxGurBNxo9Q86llL1I6dsit+IVNFOzMHtXElr9qlvxsKlR\r\n/YiD2GhuMR9xliYI857KPBSAQ+lzVYLLL4wvD0nP+i8u83sf4up8f0mjq3eJ\r\nbmI9Q0ulShf+5UqgJW/7eY8ymD/JPXJ4rRAUyfR+/qvcM41C+qi/BDgilicE\r\n7Bm+CYJuIK3Aqi06sXmb16VRklbV6cmueFw=\r\n=Ouwr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.141_1674369999028_0.38582722943187786"},"_hasShrinkwrap":false},"0.4.142":{"name":"@flexdash/node-red-flexdash","version":"0.4.142","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.142","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"gitHead":"f41f35cc13446363fe08ab59d7ab067ed3a31a66","_id":"@flexdash/node-red-flexdash@0.4.142","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-n4sfS5IUi8vEtpe+v0dqmM51Re2GftAxPcsvw+PILFi6nW6TrBkIVAZZZzp9k56FJtScSJ2nvKhW9XDK8bq55Q==","shasum":"6eedaebbd1e27b8e38e920a36910411a4cebfdc3","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.142.tgz","fileCount":108,"unpackedSize":6225329,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICbX2zAzis7UIeoQlEQxXEwPLZrwvWToQiHwXRKfD/qUAiEAxbLhAF6Aw8Am3pzPepamOfFnQDRhC5/Nhuhj8Tb1zDc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzOL8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqKxQ/+MuMUpz7XgtTTguwqLO5FK/H5ptRJk2qoGY8wgCYydaSBs02m\r\nZNgYm4Cen+gkb5vDACgm66X0773SeHCSO11AXk1v3bifuKlZ9a3DhIGHNuDQ\r\nN8gieyzRxrKvkoEL/97bg6JOcMIe1ovXJL8y2fyoj8F3k3WSdVej3KUf54vL\r\n3PjAEDW4yxRnrh8h8YIKH1F4zxWt1DCyhVp+VSYtt6G3rAEltvnzAxNLJrkV\r\nKOr/PerMyKKmnUwfJBvK83q2ryeABjIVEGsnohRWlgaSCkX7Nm1CDy9LqZlL\r\nfmbFIoGGm2QcI+uHp5rHlxi/792g3T0ASLUbcSC78Upf8czTqUaoFQa1Pnt5\r\nGmFIGXK9ZQyoIfJ2PxNmddBwLzPBKe7x59Li7cd/54kNbr+jlzMOHMSw8N8v\r\nFgmVRd5Q8uoptjCAlQKQsfo1wzpKbZ8q9vTz+5TG+hwnpaHp0uPumm4tU70O\r\nngOoajVniDYIUUDRiDIbjs1AZrzjL+ZT/+CrgiBkTfP5pkXc6A1BuZGds7Og\r\nytTXnmH4AxvmN/XPMSvFznVJElWNGQU5bPbkppjPLgTJCd4vDlNG3NcOQ+/q\r\nA70ghGh9ooIGd7Au98uk8RAJ1zbxS2prC6r3YsO+SE55p5NstmLwbJ0C68Hf\r\nVQIYPPm3bAGtYk+Iyc3a/znISoaixaC8+/E=\r\n=x+Tk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.142_1674371836072_0.5749674209725864"},"_hasShrinkwrap":false},"0.4.143":{"name":"@flexdash/node-red-flexdash","version":"0.4.143","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.143","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"gitHead":"3209bf5fefbd50f87e18c9371d9430ff741881dc","_id":"@flexdash/node-red-flexdash@0.4.143","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-4Qabr+ah7pi0Gw0/f4uFhYgmLo5DlHiqGISwEjPRng8PQlIoiPzndoAnfvbOQkDeeJ5drErtXYAFEUEtSdyjQg==","shasum":"17e3abfe1f1bbf43064ef8e67ca9d2bb1f3aaf5d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.143.tgz","fileCount":108,"unpackedSize":6226880,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+OzvLoaRk0h2rsgcs1e6BTuDJAEgJTe60H9VBjdGjVAIhALNcm/yGAiKd42hHVi/jM84j+R+XjkhhY+L94Z+yjB17"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzaLrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpUHg//eWL9GI5D44+P2d1u2joUWSt7o6X7Stnmod1VBM+N4U370GlC\r\n4Qa3ARhn3RlwIsPDuyiX0hdzbQGLULQl6zDRMef7a8tfwtQhcrufmeZPj82B\r\nX856R73pPoXbUkCY7/8nUrBIcrSOFtCWbnbX0dvVZQ/QLUckjM0RQDBizMJh\r\nEAIMzPnr27BUxwAqhx+ooTd8Bw77M/EGD4rdOOUIVsjFFC1hmXGwVA1sRKYN\r\nRsz/b5DTWf5UbvU4A+SrxpcZVcVNRYifAALARi+f5v0faiahdUvNSkVAfKMp\r\nxgUJ694LDuIBP/Gqxq+9DkX2O1J09UUL4oRAS618UfKw/Ltb62NXb10kb6b7\r\nrXVtuoyI+SfRTRp1i7nMBXlo+WGxcANidL8ygd9Keoi2mKAPNjQH3RMKcJOp\r\nijDSyavYzUblcBoObFe8Qu+ITEXmcSho3fU4Pi/OvpeqXdi+RCp+7iB7aEHN\r\ncI4vZXBlWEyGAO9TCZ2hsrAYenBhxZgTa6mzYyIeeMo32VR9ZhjcEn8CTgkR\r\nngMEIxMbbJBZO+eWi5tpi53sQAFtNSysqCo9Ep0g4odNao5a7Xn5Qwnm2G/5\r\njR0BM6lDmTFxegM0dm2h7JUhG2kDn/Cl5sSM0JoOhLp+ov1IfcOHAAXXQ/pG\r\nDdSBZ1E51y7xV/7xqvd3BDXPCZyhp8wAqkE=\r\n=ZlbQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.143_1674420971522_0.6660608458366422"},"_hasShrinkwrap":false},"0.4.144":{"name":"@flexdash/node-red-flexdash","version":"0.4.144","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.144","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"71e65ac2c48ffd2ccf0a7b9c84971c3b656105cc","_id":"@flexdash/node-red-flexdash@0.4.144","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-fJwXp6DaFT18+mairnZCRV/tn7WZsyxyVlNLU4Br0Zcpdx5aEftJ6jW1K6BmouoStt42p2aebwHnOIG4ENj/hw==","shasum":"8a12ea1fd7e53e0bfbb70b968e9d610020e01a69","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.144.tgz","fileCount":109,"unpackedSize":6227078,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEeRVaTAUJNSd8SLPlmlWZTm+tnSRO6eToV+7ru9YJ8qAiEAuHx3gWpu00qeZ1111vkHz9SpKekjmwCPjBzApmu3OSc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4UruACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoLUA/+Orl9m3ZUWIj02Qo6Tm4tCTT5+Cyv55V6W6kaNS7g9qxmwKmi\r\nRFo8cYS/tNOBOhmci/7dXEPWsVKQxi1gHhQepDkXT9WyOvGf771rMsMJfk/2\r\nKbWR+waDD4zVwuSR2tQKMa0QjJuJE+sLjP6BFIfh1Gwqk+yrUHmx4WABfnqc\r\nAPPsf3Q8ltG0iP75C8zA/rwWdajN8VZROKjg+bN9iIPW3kffwZrpXff/s+NE\r\nVIgOAAdTZN28zpSD3/+wZH9GsBY9WaaEAlqvC9MYCB7etScM7CRaQoq4PCgM\r\numZbUYivLVPTvcTVwpzIbdVwgQKX2eQxK+iVRzn8/E8XsaD4Pan3SdaEaEPZ\r\n52phSqH+1nSitJ87RUHZJTgoKsaKakBjz16+PkHTxsKiOZ0zRs+LbzI7neaQ\r\nlYrPfVvlf+ATtJ2KduKrfLMRNwMNAFsSluO0iTQMeKZGabMSMbqkXjxLl3SV\r\np4DTb4hk1028uTlatP7FTLSN8ETdi0wgaR63o8pzWRuYHWsV0sYj0SYgamx/\r\n7yi6v0aiu+roqd5+t8nHesbFVP7kV0ElraeRrol4wtVyllVBXxGt7Ng0BFYj\r\nMe2XWLgoOZDVq0qyGnMbpXz9G+CcFXNSMXaRtrwOSttXXuN2wFqNPYWz0vyh\r\nnbsnd1znKT//I92VdwSJa6yBKGyF6x9QbUc=\r\n=SEKt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.144_1675709166371_0.6505114935954439"},"_hasShrinkwrap":false},"0.4.145":{"name":"@flexdash/node-red-flexdash","version":"0.4.145","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.145","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"gitHead":"73881da25c6f2933bcb22bd4e5125a8d03f3a435","_id":"@flexdash/node-red-flexdash@0.4.145","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Cqas4JemW9OYj6OmudaDq3BnrMd8Ud0tjm0T/CfWe/dLA7aYhRr62Q7onGg86Zd/9NL2bvyj/z6wMQrhWVx3LQ==","shasum":"23408b6532385c660242df0b3b44f516207b78a6","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.145.tgz","fileCount":109,"unpackedSize":6227078,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8YLsLVAaxqZIQFnot818RmnzMyObo5i0OpkeMtmUCPAIgb3YZ8oRde3foFmB1EBEKabsdQ6Of/r3S6g8F68FYlPc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4V3NACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqmzw//a7f9x+GHYBXeWfgUWS6I+YEVXm0TmW+glAuel9DwVLRiMEpA\r\nmO9x3v3jLUesLygPlz6KyLh/BnBrsSVufhcxXzlZGhYerLMmIl0I6fAHItc5\r\nJvp/y7oU7840SAGtcaUl8WEm6ZOrJAOa5DosecAbAaoSKE5Ofkd25p4kqvM2\r\n797b1HJSfMqGglpXwfUTwbILyfCX3Gw0iMyzEL4nWN5M+4HGKQWca8FWRyCT\r\nQ4dI3jKGldxaXyj8+JnNwIn8e9+dX+vU2SBHwhhjhRjnbGlQ/+x8NhjyFXuV\r\nMnaL4vBLKRU9k18z3icFQYqzt7XkVz8AbeJE6ocfiPTx0peX0cjygULIdA2Y\r\nIFC4Ng1LSPNILafuRgw1sZUZgCcYHiuBX1SKXMYGWx4PjY86OTc3oKh31CaD\r\ngiGcQkEiANiVpHV1bk56uG3dhI9Q9BzMZozJMj/QGj5CpM1/23GRDRpBAhSV\r\neqZYUgr5IuAj5ZaNjhomM8PWavO617Pd2Dwhp8B1lviUsj7Ou1RwP7/HPLwL\r\nld5jnpWRblQhX/UtHgmJgVI679HFHt3PSu8zaQDdB1UedNYBnXhcMB7mwaYx\r\nB2/KoDgBPbuM06AE2suxIMaOoTLlASmgynKzrMiLkuvfagB38yu0VU/1QvsR\r\nYtCavoUEYl517TAWtnSXA9wkt7dvJrOs9yM=\r\n=4mmt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.145_1675713996886_0.2717408150957614"},"_hasShrinkwrap":false},"0.4.147":{"name":"@flexdash/node-red-flexdash","version":"0.4.147","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.147","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"c5cc3ac670b44d5c919a7925e8be249a35c9b0c5","_id":"@flexdash/node-red-flexdash@0.4.147","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-OW+3zHo+eTvRSntgt7yxBSFK62ICAN4FQx9SH5aID4Q2k5aCziG40hM8wr9YhhP/SgM7h4B2KKWOeg8H1F12Jg==","shasum":"e1af2b66b82f10191f489110c9cc36ebab48c4c6","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.147.tgz","fileCount":109,"unpackedSize":6226104,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAMs65kQchulSouN2BqD4jmOYDq607GLaCF/kXqx3c9kAiEA3oaJ8khOrfJCzzmhWS/BzhaJiVAwiu9ld3mvF/LPCwU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7HfMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrRMxAAoEUwbIzWdu2T7MgaUP+pJz/De8YRBhR0++0Z5YDadFh5pkCm\r\nrFAojEPpX4Mw54JMRkKhwLO19AfrTqp9Iw59OBj8kln11UjqV+ORceIEB1Hl\r\nYkj11hDu7/eLeOZpvFr4aUfSXW+CaExBc678grzQGCWB2wQT4+pprNUEb/fR\r\nJ/L//JL6mpcdRKkJD+dKKNicQe8cWroMMutJcl/soy8yIwB8gpHRwz/xAd5f\r\ngc4gFiEtGOnkV65pgI+wxMLl7gqi6Qs54BTH8qiMRnxHNbdrg9vRJ4V8/+Xm\r\naHZ8T2yV66NOw4gX0RRlQT1JiREcipCG4UzR/W01kksp0sAKenzWcOJljmdk\r\nJO2Lg4yvTnLreoTBDie0LUHCpojHKgHL0UbNNDFOuJyCOYFNGOScp2grxHza\r\nAS3KpoHmvxAau/sp3pekhmK7G2VepFjCO+7xn3tX8AnoG4iXQIGHJ7UmFae0\r\nj+iJlKB91Zv+uAIZgduEHOP4vYvGJL4Hk6GSEG5eHUr0D4G01IKhnmCZzKFF\r\n+Iw8tr74vtt7NFBxeh9PmHRjUevQ7Qw1eNq10csJ6nJAyjcEFBV1ThkZYdG+\r\nZWl2AUvnoM80Ctqqhh/9gcG+37J8XhSwk6XV4CEObTD9okXul3ZxJo8JhzTb\r\n7ROOKL67jY6vR+ro8tp3yd/z6YV6s4wYprA=\r\n=PkQb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.147_1676441547908_0.5852589631156473"},"_hasShrinkwrap":false},"0.4.148":{"name":"@flexdash/node-red-flexdash","version":"0.4.148","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.148","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"gitHead":"2a27de691b52693ec879f6e26aac32ce44e96d21","_id":"@flexdash/node-red-flexdash@0.4.148","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-UJ6VXOPoZzeVCWtvTaj/De5STy7yoasmONlseStHFimssd+BwuQLhOgElRLtS/Rgy1oS79SSqw5Ma5grKw5iKw==","shasum":"5485d7d35451b6a7e27deb59b14166e7a6374f06","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.148.tgz","fileCount":109,"unpackedSize":6226104,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDuYTFdHaYT5fNMjnterkJRPB/dEBcZc9OQ5hAHm88KogIgKlb+/jig96A6u1PWEyzM2xQVTlS9KeEp6t8UWO5a5IM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7TX7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrLKA//QN9v0VnUcm063vlAYfXqHeHeASGF5KkiU/297RLGBOwZBBj+\r\nESJzTtGfOhb0VVkKk4/foufG5ggpgf5g9Cirn0+EIEwr/7G4uq85tkFNvOou\r\ns2EPrewqgXr60XBePICC/fL25KtIfeJw3RmwQMLwK+GPUtUBNBt3c71Cz7MH\r\n6l5eEZo2dIeZKOJnpJMPmbfjKm3OrU2mHXGxBc/VzrSwkygdlDRoWwmtjJrq\r\ngX4qwNwPpWgVK+k7EcONWqvSzNrBFmwdS0iDy5P9LtkNOQHqZK+5qO4ZEjpO\r\njLeU3BIBQHYQiV9DdM9bTd14Iamt4xTO98OsfDe1XzEXKIUNkC6lZ925NZT7\r\nq49+44y0h84xuFRN2ewSufKnhrqR7yamwQIRbLDYj09SigtBuD2MvR4idPed\r\nXj4lIforSHA5nCwgsdifa2IXudiAvVZRrKYYGUR1iZWm5btlK2SOi6CxjprQ\r\nHLF2Gl+g1pWyn9K3wrZP/P0pVxzNTUgMLWINeaPdbYevVwKxwIpvni7F1kbv\r\n3xIoimAP9IZ6NWqlmsOaKgesDIb8XLb5cXtHS9WY4qRUnjlgtsBB+MniDrZp\r\nglWPhqD3VR5E/hxLgKFFGeVplFJY4Npvae+TuVgAfkWY5W7esucHyrMiSiM4\r\nODo8c9Ly3U2G6FoW7ub61ksBbXL0js/tBQI=\r\n=eKhE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.148_1676490235032_0.40162756336736694"},"_hasShrinkwrap":false},"0.4.149":{"name":"@flexdash/node-red-flexdash","version":"0.4.149","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.149","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"2766ccb6e1c37e78b6fc9be78b49cdfbfb5a073d","_id":"@flexdash/node-red-flexdash@0.4.149","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-DxB6CtqkHiFA3iVAZ8O0yzU5+bclIBJHBzDExHGoPJEIVyG6hWwzFCINQrmGOJfRxSyznIDvVCVQwRodXYT+nQ==","shasum":"e04bb924dfef42759d06070b2b281c79581224de","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.149.tgz","fileCount":109,"unpackedSize":6226104,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD4r1Dj/LFM3bhVF1SnbxbRe03IkpRjyKOtPbgZJoZhtQIhAIIs2GFNxFjQaPViFUzMzJheRbjmDOyke8kGJ9v2FaWV"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj78SwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp3xw//ajAgXqUwuEDwiYYUL7ea6VLNdrQSuIH5EzDHuNaz6HOOcAhO\r\niN++896EnIRayj89L5X2ubbfLnybRUJlgnk4eK/3uUUZETQyhW62GPRDsqOV\r\nO2qd9LkgyZEB/I2H3N0jflEOnvJCDqho6ZvjWPWRmdRimN+g6RJSaPKHkJAV\r\nCtMQ8gVWdte/Ne4MlDdJWPzWxl6o7vKjdgw+EyKKbPPIZNCVVGdBVb5nmy5X\r\nVMz2/IKQuJ0YQune7RHuwcaaSK7TWXRTfwQjuFCE5fTMGhtIebbmSm6UJM24\r\nbHQ4kam49hVetlccN33MHpHNzhpIEWd6hTRuXC2e6lN2c7SjrMJMTwq6Cyfk\r\nkWFd2T5j9A04riFF4mr9BSZe96IGNcnfaW9B4gN28cx+0yhC5tnneLN4Nh7Q\r\ndvhPqLC16trD0Ew5aOBpt4i132NUIEDYzawXlDd1byn6ugwjgeuouhCpAuwE\r\nE42JCXl3MHXP/53ehCHYTicpbT1L/cZ1qc7nuVCAJ8ohM8u+aXDih2noXaRi\r\ng+EQv45bUQ/EIBkTzGRlfW8C8Dwz6Sj22k4o7ScC0mDJk8eg7WBQMm4NbRrW\r\npvwqL6RESeD4ezRkQQF8pvaKUo+vEYRmMF6b7DNUDNQBdiN4M8J9N9i3XFiG\r\nTIYIrzoM6H5c1yU6Hnvc1JPwMUeWNeQZ9Bs=\r\n=gx3A\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.149_1676657839889_0.5672292338568141"},"_hasShrinkwrap":false},"0.4.150":{"name":"@flexdash/node-red-flexdash","version":"0.4.150","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.150","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"d32094726d187e9d5543061302fb48d296abc69e","_id":"@flexdash/node-red-flexdash@0.4.150","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ZO9qREellgbX2sm3uAH1Czem3xYfHcVKyZMzXFSPmL2M/oDFMuJ+gAxpUR1wEIXLZvW+te65xpxR04DPFBCTbQ==","shasum":"dde70eccb64a787b67273ab8aea1bd36c3733425","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.150.tgz","fileCount":109,"unpackedSize":6226018,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjAxAPR2ykmasofLLGnY7JAFmt6A1FqcKzmmvQWCcKmwIgF0v/fDCChx58E+sOrbwKgX5+n5OTLcWfKguQEqXL+U8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8UykACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoAsg//UzqwohIaVAAnsl+JX3qmAECmto5YjpPHB9lMFv4kZ0NtoNa6\r\nAn9dUjiXOljedWh0QUTbJsa7G4XJlitviIe/NTpMOGCby/NF5nSjRVtZ4a2W\r\nsPN7/m8M85hTBxMAnUy17Fp4dr4hvtKQugFCug37LEyhSa6Ce/NJ4z0UBj2x\r\nRFFrDogwYyvgV0oNg6RMT1rLXbJk1qiekHobZ0sVwvRWPrLk6tVfk5g/Jlrw\r\n09waIe6ug0xQQTmdA5c5mQE+i61LUuGdknQskAjRXM9+6mvg5+15+soCsy1u\r\n7ap7Pb1qB6YpX3J7uDHO9qkq0oOcco7CMEgEuuHW/qI8hURdRCXJOxG2lTWi\r\nNRmwQZfpjyFUh47qmh1eG66m3+wyF/XhqEZzdLZFbR5tEr0nUeDSsA7+BcS+\r\np7Vzn7cPNmijGK9IaEe7fPaTwyskMCXfMO9J9BSRL+HzOFMg7ZqtM5D2UqLJ\r\nQc/zEilPuE4uon2qmYjLNvFWNQDPDv00Y5pwBWiqCWqfFIQt+pk2AjhL07DF\r\n8tNwQzO8HAfVvlNS8DqoBLmQJmmGt59K3ZHkw40ravuPu49+eVz0UDZVZmO/\r\nPi05QRXGt4vSTCVIawrTAKv39iXu1DBYQwfaKF71sLH2lN7BGxpaGgs1VT2e\r\nG6x/1/yS8nGJ4dLZWLAzsK/a276vSCH68Sk=\r\n=NfnP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.150_1676758179959_0.09039122786734444"},"_hasShrinkwrap":false},"0.4.151":{"name":"@flexdash/node-red-flexdash","version":"0.4.151","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.151","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"gitHead":"7cd7280477d44cfe47d1f7640509da9c51f1db9b","_id":"@flexdash/node-red-flexdash@0.4.151","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-6tpmFQXVQtTmKomFNfrX3xP3Cz9QvsRK4wgrr9buLuHCrUDro2SaAaU2gHUUn3RIqlJodxoNjUFBbfpYAVOOJQ==","shasum":"44a6961d6e8e0dfc1af027bfe0cd9679654b5723","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.151.tgz","fileCount":109,"unpackedSize":6226018,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1EBVCrGtqwZRV6PtHnNIvVoJlgWJbrgkQz1bEGLMKAwIhAPq3Kvi0onrL7IMDFUcD4K6gWVEgXMqHKvvE59+2T/ZQ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8lEaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpysxAAogEP+1NMmcCFAfOhpQNdEE8uOkcRjwVqvJiC13gPcSrZyj16\r\nSyS3frJp1Bfsv9I7m+8lSkrCQ8wfh1GP0ROTTvO+VN+jDgEWujjA2b1Xqj3Q\r\n4AD6A3vb5IH/xmNGiTnrHH+4HqJQkTq5L+coTXwT12g/fxHVq+GASm7gs/YJ\r\nTYlmpjGN8Slji4eGI77FvCqyLRCrb9QHVK6Ml+2ITe3AU305gOrCBs6LfKth\r\nG9ZaebAR6mqq/invgc4FWODwJD8t3tXWQ854IPRV1X0Y8NIrSEVGO+PCKjHr\r\nOjJvlLOkQFycUoT2hIIrUa70RzGcox/AprP0Ls1Dmrq9RJ2S7v4vEoo4Scsz\r\ngMudTrBdScljBS4zcx8JFXKA0Og5lA/t7P3O6ox7/5YzmSdyirdanW1LScIR\r\nRxLKxtwOmpBKc7Le7SEiS+UMkbhx9BziWrdpiXiQD7TC96xCpvAjIRLT4uAo\r\nWVSbtbINd2QBiUzpngWFT2qvPzRnQQr7rP9l5qsx2stjcswOyHlglg4VsrZv\r\no/R2wsds3RByf6Y+P2sIwXTWU0UIWKgWO3eoUwYDGcJuSNovuN6eGIZlgoiM\r\nkmWGqjusdkwSyTTRPpOSpsL4+XQMttfhUWMnugiBOJXLFomQ2/RxIBQCsfU/\r\nFCQhVFI+FXhv1GnLihjYapqKu+4gCFclPRY=\r\n=9f9l\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.151_1676824858203_0.5864736000557425"},"_hasShrinkwrap":false},"0.4.152":{"name":"@flexdash/node-red-flexdash","version":"0.4.152","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.152","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.5","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"a136c8b849894abd899ef2600f8d64ac45be7e64","_id":"@flexdash/node-red-flexdash@0.4.152","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-jF2jx9QADAxPRc72ZfXqfAM5SIc44XUPxkb2n1ayIq4+93M95cIskwcr76sCbdHh2eS25d5SQr1LcdhJ6gTWFA==","shasum":"99eae560da8d1f602f600feea15d74a803a36167","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.152.tgz","fileCount":109,"unpackedSize":6226018,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFP5WFcR5l494aOpOwbBbqzoDa/XLX7jERlMX0O2gNB4AiBB7GDixQji7aJQc3xmyMydsBG/WYo2V8JqSTZUkkYmSQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8ob0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrbzA//QybXi+46DspGMa52Xg73PUiAUh6g5B9+3lEJkUVOxkc7Fvgg\r\ndUKgOqZhfEtRlPkhGuwDXip5sTAq+dokjg2tO2zEjVfm39b/i13wDA6sKQJN\r\nfBE0Srm79tHZmZhZYS8ZYKX5S2zHYTy/sCWsrUok/n3+Qmg6fZKpN6oo2UhJ\r\nOMpMuyKjoTH0/AyO9oZOjE7gJWz3Qi6zWneKU6foBybkFELMt1Fs6V9/R8ez\r\nfI6Y96vqs+2heT/hTe1UZu2ygdZhFFGf5ziuwzM1c0uzTt2DSuVlEJiWkoUY\r\n+I8GqwYvtUO9uxb0kdTApgjzibwL41YvecS5S3+YkMW83V8BGk/tal80rS23\r\nyskOOSx47TydifCOy3u69BtyVr0zfnx2UF07BxQBYv7bWTO9NFHGA1A999uS\r\n9oDo1M/L61ZqYtiNGF/eWJgCGAHMwwjPtOEQPJrrTPlvNVKB2mpqleaS2Mar\r\nm9dRa4A02i8Xjg9LjxTRXFGWAE3hcnpnnhD+yAF8BSv5/dMKD4vkcEio2uk8\r\nG9CReYOj/MITsKvx7a694jiYfxG5OUvDDssVCvfeg+wopj2CKMedg11FexfV\r\nlYh8ogAf5rbMtxaz+4MhR4nepTZcEJeT684zxGRy1aRVT5RN1mFjjaOVkAb5\r\nAb46wTnBPZYCqc+QQU0QLx9b2qHSftMIiCE=\r\n=0+PA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.152_1676838644583_0.09424147313051745"},"_hasShrinkwrap":false},"0.4.153":{"name":"@flexdash/node-red-flexdash","version":"0.4.153","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.153","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.15","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"647bd6b8b8a981b6b40c6dd8fb1941c69f72cde8","_id":"@flexdash/node-red-flexdash@0.4.153","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-wYn4EQL4uJymNyX/w8LlX5f9lWP3stt45JLKyR0moZ4QHqORzTYqCwIqfHQi8ygBndGlJlWwDnVCt96SJggKgA==","shasum":"f1a22af976f8dde938f52cba3646d63ae7f3722d","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.153.tgz","fileCount":109,"unpackedSize":6226019,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaf3CR1RudFyzyo6Fw9MYhl/Om7/1eDz3NlhEm6PVgywIhAOsaxZQbibI9lwOSGqHjsZJ3HtO7qY9xrKhZFXbl/1Gy"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8+b7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoeEQ/9GLn4LJmL1ALmwjLLdo9o1RbvEzQv1pNkksHAVcGSxK5Va+V/\r\nfDYKqnmv6p579V+rZT4fAgkApVeDqf/7KLE6cJ/GZhUClhDcsJkaZr7qMry5\r\nkrP0O123GqQAOjaUvByFaX2ruw5saBnCoLYzpHJgr1BBXhnh0hPl4AfwFZDD\r\nSaX6HcGpXTSqlA8cXBg9S01YD8Ot5fx96eCOHQFFqx7CcIxoEStEGVm9kMhj\r\nzCUKBsJbXkigapTvM8ixKTtS/Mojhec8TEzi5f382QjSi2Z+XelK3/Ntozeh\r\nVe+SyIBv0l/USptHTeKUkrBroKqEMV3/Pyj19y54icZVB4Q6nuxH4knm2veH\r\nP3FDLcl0KQ8BkvLoTDyhlXoGUfv9zqsp0WzAAcRiJ4whzoZWEIhS2VQikW17\r\n1r0XDH56JTUKZQ2I3nAAT7zEl2V2N7ZASiXzJuM+SDO26EkuzqhB1MLTl+/2\r\n8/vxAuwRNYExYzOhL09hx6q8tjpO9cJOdC3GKHSvf1HPxWboQL1EHpKgA5sn\r\nSJy71JqUMbkpz5i3hZWota/IIcZuLb/CvnUg6CqOK7dY0/9NfcMTBOJuh1FV\r\nhegRYAeXJPN3WdU7ZxjK+m71NG/Nr/vR9UlZdtw/+/4elcbv1TlWkAQynGgO\r\not+PPNo07JE8WiY0QLIIcPtdVV9veDNzvAM=\r\n=oYEm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.153_1676928763626_0.46803335264460966"},"_hasShrinkwrap":false},"0.4.154":{"name":"@flexdash/node-red-flexdash","version":"0.4.154","description":"Node-RED nodes for the FlexDash dashboard","dependencies":{"@flexdash/node-red-flexdash-plugin":"=0.4.154","cookie-session":"^2.0.0","express":"^4.0.0","glob":"^7.2.0","http-proxy-middleware":"^2.0.3","node-red-vue":"^0.1.15","socket.io":"^4.1.0","tar":"^6.0.0"},"publishConfig":{"access":"public"},"node-red":{"version":">=2.0.6","nodes":{"flexdash dashboard":"flexdash-dashboard.js","flexdash container":"flexdash-container.js","flexdash tab":"flexdash-tab.js","flexdash iframe":"flexdash-iframe.js","flexdash ctrl":"flexdash-ctrl.js","flexdash dev server":"flexdash-dev-server.js","flexdash custom":"flexdash-custom.js"}},"engines":{"node":">=16.0.0"},"bin":{"gen-widget-nodes":"gen-widget-nodes.js"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"keywords":["flexdash","dashboard","node-red"],"author":{"name":"Thorsten von Eicken"},"license":"MIT","bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"homepage":"https://github.com/flexdash/node-red-flexdash#readme","devDependencies":{"vue":"^3.2.45","vue-tsc":"^1.0.0"},"readme":"node-red-flexdash\r\n==================\r\n\r\n_Node-RED nodes to interface with [FlexDash](https://github.com/flexdash/flexdash)_\r\n\r\nFlexDash is a self-contained web dashboard for Node-RED and IoT devices.\r\nThis package provides [Node-RED](https://nodered.org/) nodes that form the core of a\r\nFlexDash integration.\r\nThese nodes provide the basis for communicating with FlexDash but they do not make\r\nany of the built-in widgets available.\r\nFor Node-RED nodes corresponding to the built-in widgets\r\nuse the [Node-RED FD CoreWidgets](https://github.com/flexdash/node-red-fd-corewidgets) package.\r\n\r\nUnder the hood the nodes here use [Socket.IO](http://socket.io/) and the dashboard(s) can use Node-RED's web server (i.e. the same port) or a different port.\r\n\r\nFor help, please read the [FlexDash Docs](https://flexdash.github.io/docs)\r\nand check the [Node-RED forum](https://discourse.nodered.org).\r\n\r\n## Installation\r\n\r\nTL;DR: **You most likely do not want to explicitly install this package**, you want to\r\ninstall the [core widgets](https://github.com/flexdash/node-red-fd-corewidgets), which will\r\nbring in this package and more and will provide a usable whole.\r\n\r\n`npm i @flexdash/node-red-fd-corewidgets`\r\n\r\nIf you really want to install node-red-flexdash, e.g., to get a specific version:\r\n\r\n`npm i @flexdash/node-red-flexdash`\r\n\r\nYou also do not need to install [FlexDash](https://github.com/flexdash/flexdash), it comes\r\nbundled in the node-red-flexdash package.\r\n\r\nPre-release (dev) versions are published on npm using a \"dev\" tag:\r\n- latest dev version: npm i @flexdash/node-red-flexdash-plugin@dev\r\n- specific dev version: npm i @flexdash/node-red-flexdash-plugin@0.4.47\r\n\r\n## Internals\r\n\r\nThe main interface with FlexDash is `flexdash-dashboard.*`, which handles serving up\r\nFlexDash and handling messages to/from the dashboard. It also exposes a config node to\r\nrepresent the dashboard connection. There can be multiple dashboards as long as they use\r\ndifferent paths or ports.\r\n\r\nThe Node-RED plugin in `flexdash-plugin/*` is manages the hierarchy of FlexDash objects,\r\ne.g. tabs, grids, panel, widget.\r\nIt is a Node-RED plugin so node-red widget nodes can call \"into FlexDash\" without having to\r\nfigure out how to get a handle onto the appropriate flexdash-dashboard config node first.\r\nThe plugin is in a subdirectory and forms a separate NPM package due to a bug in Node-RED.\r\n\r\nThe config nodes in `flexdash-tab.*` and `flexdash-container.*` represent containers for\r\nwidgets in the dashboard. `flexdash-container` can represent a grid or a panel. A Widget\r\neither belongs to a grid or to a panel which itself belongs to a grid. A grid belongs to\r\na tab and there can be multiple tabs per dashboard.\r\n\r\nThe development server in `flexdash-dev-server.*` is a node that can be placed anywhere to\r\nlaunch a development server for FlexDash widgets. It runs [Vite](https://vitejs.dev), which\r\nis a web server that automatically pushes source code to the web browser as soon as you save\r\na file (hot module reload). To access the dev server, once launched, point your browser\r\nat the dashboard URL plus a `-dev` suffix, e.g. `/flexdash-dev` instead of `/flexdash` for\r\nthe default set-up.\r\n(Note: the dev server feature should be moved into a side-bar eventually.)\r\n\r\nThe `flexdash-in.*` and `flexdash-out.*` nodes are not currently supported.\r\nThey send/receive raw messages to/from FlexDash which supports advanced usage.\r\nHowever, the current saving of dashboard configuration changes does not really support\r\nsuch advanced usage, so these nodes are not currently exported.\r\n\r\n### Some relevant Node-RED internals\r\n\r\n- The flow editor operates on node configs that it passes to the runtime.\r\n- The runtime has the node configs, but then operates on node objects, i.e. instantiations of\r\n  the configs.\r\n- The flow config can be traversed in the runtime using RED.nodes.eachNode, eachConfig,\r\n  eachSubflow, etc. Confusingly RED.nodes.node is to query only active instantiated nodes!\r\n- There are nodes in the config that are not instantiated: nodes in disabled flows and nodes in\r\n  subflows are two examples.\r\n- The set of active/instantiated flows cannot be traversed (no eachXxx function).\r\n- There are nodes in the active set that are not in the config: nodes in instances of subflows are\r\n  one example.\r\n- Everything is a node: a flow, a subflow, a subflow instance, a node, a config node, etc.\r\n- Special fields:\r\n  - `.z` refers to the flow in which a node is located, it doesn't exist in global config nodes\r\n  - `._alias` in runtime is found in nodes in subflows and refers to the config (template) that the\r\n    node was instantiated from\r\n  - `.d` is true(?) for nodes in disabled flows\r\n- Subflows:\r\n  - The subflow \"template\" is represented by a type=subflow node.\r\n  - A node type `subflow:<subflow node id>` is created for each subflow.\r\n  - Subflow instance nodes are of that type\r\n  - For each node in a subflow template a new node is instantiated on deploy, its `._alias` has the\r\n    ID of the node template.\r\n  - The template nodes are not instantiated in the runtime, they remain solely as configs, i.e.,\r\n    no constructor gets called.\r\n\r\n### Flows\r\n\r\nThis section describes how Node-RED-FlexDash represents dashboards, tabs,. grids, widgets, etc.\r\nand integrates with the Node-RED concepts of flows, config nodes, nodes, etc.\r\n\r\n#### Dashboard and Tab config nodes\r\n\r\n- Dashboards and tabs are represented by config nodes in Node-RED. \r\n- A dashboard's `fd_children` is a list of tab node IDs.\r\n- A tab has the dashboard's config node ID in `fd`, and `fd_children` contains a list of grids.\r\n- For tabs the FlexDash ID generated is `t` followed by the Node-RED node ID.\r\n- Thanks to a hack (see the code in flexdash-tab.html) Node-RED is not aware of the parent/child\r\n  relationship between dashboards and tabs, which has the effect that exporting a bunch of\r\n  nodes from a flow does not export the dashboard they are children of. This is good because\r\n  on import, having a new dashboard created is almost never what the user wants.\r\n\r\n#### Grid and Panel config nodes\r\n\r\n- Both are represented by nodes of type \"flexdash container\" in Node-RED. See below\r\n  for the rationale.\r\n- A Grid's `tab` contains the ID of the tab config node to which it belongs.\r\n- A Panel's `parent` contains the ID of the grid config node to which it belongs.\r\n- Their `fd_children` contains a list of widget node IDs.\r\n- A grid's `fd_children` may also contain panel config node IDs.\r\n- For grids the FlexDash ID generated is `g` followed by the Node-RED node ID, and for\r\n  panels the prefix is `w` (because panels are really a special form of widget in FlexDash).\r\n\r\n#### Widgets and Array widgets\r\n\r\n- A widget node's `fd_container` contains the ID of the grid or panel to which it belongs.\r\n- The reason that grids and panels are both of type \"flexdash container\" (as opposed to having\r\n  a \"flexdash grid\" and a \"flexdash panel\") is that this is required for the \"container\" drop down\r\n  in a widget to include both grids and panels. I.e., it is not possible to ask Node-RED to\r\n  provide a drop-down with two types of config nodes.\r\n- For non-array widgets the generated FlexDash ID is `w` + Node-RED node ID\r\n- For widgets that are arrays the FlexDash IDs generated are `w` + Node-RED node ID + `|` + the\r\n  array topic.\r\n\r\n#### Widget fields\r\n\r\n- dyn_root: `node-red/<widget-id>` the topic path in FLexDash to which a widget should listen\r\n- output: `nr/<node-id>` the topic in FlexDash that a widget should use for its output messages\r\n- group: `<array-node-id>` a grouping of array widgets to allow moving them as a group\r\n\r\n### Subflows\r\n\r\nNode-RED FlexDash supports one level of subflows, that is, widget nodes can be placed in a subflow\r\nand that subflow can be instantiated many times in flows, but it cannot be instantiated/nested in\r\nanother subflow.\r\nIn addition, all the widgets in a subflow must be placed into a SubflowPanel, i.e., associated\r\nwith a SubflowPanel config nodes and they will then appear in a panel in FlexDash.\r\n\r\nSubflows are quite complicated because in the flow editor (and the \"config\" saved and passed\r\ninto the run-time) there are only the subflow \"template\" nodes and then a subflow instance node\r\nfor each instance of a subflow. The run-time then expands each subflow instance into a full\r\ncopy of the subflow template, so new nodes are created (with new IDs at each deploy!) and those\r\nare the ones that exist in the run-time as \"nodes\" while the template nodes only exist as \"config\".\r\n\r\nAt a high level, the relationships in the flow editor are as follows:\r\n- in the flow editor the user creates a subflow and places widgets into the subflow\r\n- the user creates a subflow panel and associates it with the subflow (there must be a 1-1\r\n  correspondence), and associates all the widgets in the subflow with that panel.\r\n- the user then creates one or more subflow instances in various flows and associates each\r\n  instance with a grid\r\n\r\nIn the end, the FlexDash hierarchy is as follows:\r\n- each widget belongs to a subflow panel\r\n- the subflow panel belongs to a subflow\r\n- the subflow is instantiated one or multiple times\r\n- each instance belong to a grid\r\n- the grid belongs to a tab, which belongs to a dashboard\r\n\r\nIn the runtime all this stuff further gets instantiated:\r\neach instance of the subflow results in a new set of widgets nodes and a new subflow panel node.\r\nThe subflow instance node remains as-is and the subflow itself is only present in the config.\r\n\r\nThe IDs of FlexDash widgets (incl. subflow panels) is `w` + the Node-RED ID, which means that\r\non every Node-RED deploy the FlexDash widgets are rebuilt from scratch. This is not ideal, but\r\nthe alternative would add quite a bit of complexity.\r\n\r\n#### Subflow\r\n\r\n- A subflow is represented by a `subflow` config in the flow editor, this config is not instantiated\r\n  as a node in the run-time.\r\n\r\n#### Subflow instance\r\n\r\n- A subflow instance config refers to the subflow it instantiates by the type, specifically, \r\n  the type is `subflow:<config id>` where the ID is that of the subflow config.\r\n- The subflow instance config's `z` refers to the flow in which it is placed.\r\n- The subflow instance is instantiated in the run-time.\r\n- A subflow instance is associated with a grid via a `flexdash_grid` env variable.\r\n\r\n#### Subflow panel\r\n\r\n- A subflow panel is a Node-RED config node of type \"flexdash container\".\r\n- It must be associated with a subflow in the flow editor, which is represented in `z`.\r\n- The panel's `fd_children` contains the IDs of the widget nodes it contains, however, these\r\n  are the IDs of the template nodes, which are then instantiated with fresh IDs for each\r\n  subflow instance...\r\n\r\n#### Subflow panel instance\r\n\r\n- When a subflow is instantiated an associated subflow panel is also instantiated as a node in\r\n  the run-time.\r\n- The subflow panel instance refers to the subflow instance using `z` and to its template\r\n  node config using `_alias`.\r\n\r\n#### Subflow widget\r\n\r\n- A config in a subflow refers to a subflow panel using `fd_container` (like regular widgets).\r\n- It gets instantiated as widget node for every subflow instance and then refers to the subflow\r\n  instance using `z`, and to its template node config using `_alias`.\r\n\r\n#### fd_container / fd_children\r\n\r\nA widget config's `fd_container` refers to the subflow panel config, not to the subflow panel\r\ninstance node.\r\nSimilarly, a subflow panel's `fd_children` contains a list of subflow widget configs.\r\n\r\nA subflow panel or a subflow panel instance do not have an `fd_container`. Instead, the containing\r\ngrid is found in the subflow instance `flexdash_grid` env variable.\r\nThe grid's `fd_children` contains the subflow instance ID.\r\n\r\n## Disabled flows\r\n\r\nWhen flows are disabled the nodes simply don't show up in the runtime. This means that\r\n`fd_children` has IDs that are missing and look like they were deleted.\r\n\r\nThe config coming out of the flow editor needs to ensure that all nodes referenced in the \"children\"\r\nlist exist (in the flow editor). Then in the run-time, missing nodes found in the children list are\r\nassumed to be disabled and are marked as such, but not removed.\r\n\r\nWhen altering the position of widgets in the dashboard, the missing widgets need to be kept.\r\nWhen the config is pushed back into the flow editor, the missing widgets should be reconnected\r\nwith the disabled nodes.\r\n\r\n- the pruning of deleted nodes in children lists must only happen in the flow editor\r\n\r\nWidgets in disabled flows end up with an ID starting with an 'x' to signal to FlexDash that\r\nthese are to be skipped.\r\n\r\n## Dirty laundry\r\n\r\nNode-red-flexdash uses a bunch of hacks to work around problems in Node-RED.\r\nI'm listing them here in case I get asked which specific ones :-) :\r\n\r\n- the annoying node-red-flexdash-plugin separation is necessary due to\r\n  https://github.com/node-red/node-red/issues/3523\r\n- panels and grids use the same config node type because in a drop-down one can only have\r\n  config nodes of one type\r\n- tabs do some hacky hiding of the dependency to the dashboard so the latter is not part of\r\n  an export of a couple fo nodes\r\n- the whole dependency tracking of which widgets belong to a panel/grid, which grids belong to a\r\n  tab, etc. is a total nightmare due to there not being any signal that everything has been loaded,\r\n  which makes it virtually impossible to prune dead nodes.\r\n  https://discourse.nodered.org/t/new-editor-event-when-all-nodes-have-been-loaded/60314\r\n- the edit panel for a subflow instance node with a FlexDash SubFlowPanel is monkey patched so\r\n  one can select the grid/panel to display the node in (fd_container config node), this is\r\n  necessary because one cannot create an env variable to select a config node\r\n- the \"general\" tab in the node edit panel is hacked into the (hidden) DOM before a node is\r\n  created but something like this would be much cleaner if done in oneditprepare, but that's\r\n  too late to get the current values filled-in.\r\n- the fact that nodes can only depend on config nodes and that config nodes can't send/receive\r\n  messages (i.e., they can't appear in flows) means a \"flexdash ctrl\" node is necessary\r\n- the whole notion of dependency tracking between nodes (incl. config nodes) is a mess, more\r\n  in the flow editor than the run-time, but even there it's pretty murky when a node ID\r\n  definitely refers to something that no longer exists. Also, the flow editor tracks\r\n  \"users\" of a config node, that info is lost in the run-time (and has to be reconstructed by FD).\r\n\r\n  \r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","gitHead":"aaa00a395fab00f5a5e0059a1b9a8c27ff95435e","_id":"@flexdash/node-red-flexdash@0.4.154","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-OMa3SV4BXKHa/S0YL07d6h5Ywa/x8h7Z9uWvwZitoCD4mzu6AaHtadUFwux+l40AaHGVqOHvC2zX2dazuI94Ig==","shasum":"c227e650d5b840858d07f8bb12fb70cfe5931a20","tarball":"https://registry.npmjs.org/@flexdash/node-red-flexdash/-/node-red-flexdash-0.4.154.tgz","fileCount":109,"unpackedSize":6226019,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxMPgdMOdejzpSc6tfsSBM3dnBryfihmTwY1ls7GId7gIhAPQDGh4VCKLzb3NLIGv6jcSvhh13t4NOfcBmf8D19thg"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8+fMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMlA/+PiYBaGI3yzprnYwUIeVkJ79tnbSE+zMBun8TTfEbGZ2aFsi7\r\nUKv482nT3Mlib6UveoPt4xs+/Ymzg3qASZVrcGCwTjud/eCFTKAD9Zlk3fT6\r\npmkFKXRajQI3+KREjmDTwlRr208C4XkWME6jYiYYQoYul3hAR0mTQ0562yvO\r\nJLLTlovNO6m5m3qiYYlZGZvgSPYu/j2wLsITByivNJa1GLwEHFuEg19d1AKB\r\nTCfU4ls6ShM5kY6AFT7R+5paQHJbVW0hCbW55cfcj2m38OBj++DSRkth1B9Y\r\nwQAxHyPZRqs81lWC8nJ88MBzbgKXrVF89NhB1xXd/TGR5oA6qoehQMo86Xe+\r\nPJtCF7CPoMHyjIF058KDZemieanKaMe1DSOxqg83DXB8Ymp4vSGHyIJxPmBS\r\nh/Poa668JOCy0PtZcshls9LLZ7v6Hq1nQcBJUQWdLouLn+8+gYvYHyitNW8S\r\nwpkoZC/75hntWVGBLlk5bpZtPXsJ4iDzDjy8D+PEUE2Um8w6bglMRLGQ2vlR\r\nJlJk07evQbDMpfjBzODDgwxkvc6mrGeAPCx1znluSMc1QYvwkB0FlOqhjR1F\r\nBzZvybWfVM9nCZK4sEhWLDYSMyQn+2iQpdruVX2A16mWR//Xq229tERN8soK\r\njc5AWpz+w4zrCC8xbqk37khq82Jd9UDm7XM=\r\n=2RFl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tve","email":"tve-npm@voneicken.com"},"directories":{},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-flexdash_0.4.154_1676928972204_0.16792450218505883"},"_hasShrinkwrap":false}},"time":{"created":"2022-03-05T02:42:32.109Z","0.2.0":"2022-03-05T02:42:32.290Z","modified":"2023-02-20T21:36:15.948Z","0.2.1":"2022-03-05T03:20:00.589Z","0.2.2":"2022-03-05T17:09:57.239Z","0.2.3":"2022-03-05T17:38:26.765Z","0.2.4":"2022-03-05T19:08:20.345Z","0.2.5":"2022-03-07T20:28:59.776Z","0.2.6":"2022-03-07T20:34:12.723Z","0.2.7":"2022-03-07T21:14:13.199Z","0.2.8":"2022-03-11T02:17:19.843Z","0.2.9":"2022-03-11T17:22:29.674Z","0.3.0":"2022-03-11T18:31:52.343Z","0.3.1":"2022-03-11T18:51:48.731Z","0.3.3":"2022-03-12T01:45:30.189Z","0.3.4":"2022-03-12T17:00:20.441Z","0.3.5":"2022-03-12T18:57:58.264Z","0.3.6":"2022-03-14T18:58:00.968Z","0.3.7":"2022-03-14T19:53:17.071Z","0.3.8":"2022-03-27T20:46:17.639Z","0.3.9":"2022-03-28T20:24:22.923Z","0.3.10":"2022-03-30T03:57:20.722Z","0.4.0":"2022-04-03T05:13:02.763Z","0.4.1":"2022-04-03T05:48:22.606Z","0.4.2":"2022-04-04T00:37:09.211Z","0.4.4":"2022-04-07T19:09:48.762Z","0.4.5":"2022-04-08T04:20:52.662Z","0.4.6":"2022-04-09T05:06:00.070Z","0.4.7":"2022-04-09T05:08:00.888Z","0.4.8":"2022-04-10T22:59:32.859Z","0.4.9":"2022-04-11T04:26:31.272Z","0.4.10":"2022-04-11T04:32:13.278Z","0.4.11":"2022-04-11T04:55:31.340Z","0.4.12":"2022-04-11T18:15:17.293Z","0.4.13":"2022-04-16T03:26:30.156Z","0.4.14":"2022-04-16T05:40:14.221Z","0.4.15":"2022-04-16T05:41:45.080Z","0.4.16":"2022-04-16T06:23:52.580Z","0.4.17":"2022-04-19T05:11:01.412Z","0.4.18":"2022-04-19T05:12:23.612Z","0.4.19":"2022-04-19T18:45:17.390Z","0.4.20":"2022-05-17T01:15:33.793Z","0.4.21":"2022-07-17T03:54:48.949Z","0.4.22":"2022-07-17T18:24:21.973Z","0.4.24":"2022-07-17T18:40:28.029Z","0.4.25":"2022-07-18T22:55:52.916Z","0.4.26":"2022-07-19T20:11:20.747Z","0.4.27":"2022-07-19T20:21:35.614Z","0.4.31":"2022-07-20T20:57:47.851Z","0.4.32":"2022-07-20T23:16:05.360Z","0.4.33":"2022-07-20T23:43:55.928Z","0.4.34":"2022-07-20T23:46:00.311Z","0.4.35":"2022-07-20T23:53:52.787Z","0.4.36":"2022-07-21T03:03:38.377Z","0.4.37":"2022-07-21T03:37:32.173Z","0.4.38":"2022-07-21T03:57:26.795Z","0.4.40":"2022-07-23T00:30:09.775Z","0.4.42":"2022-07-23T00:34:41.294Z","0.4.43":"2022-07-23T00:36:55.769Z","0.4.44":"2022-07-23T00:40:36.511Z","0.4.45":"2022-07-23T00:44:32.151Z","0.4.46":"2022-07-30T05:17:59.745Z","0.4.47":"2022-07-30T19:01:12.040Z","0.4.50":"2022-07-30T19:32:40.934Z","0.4.51":"2022-07-30T19:50:16.829Z","0.4.52":"2022-07-30T19:54:47.922Z","0.4.53":"2022-07-30T20:19:42.796Z","0.4.56":"2022-07-31T19:44:53.311Z","0.4.57":"2022-07-31T19:46:25.038Z","0.4.58":"2022-07-31T19:50:16.232Z","0.4.59":"2022-07-31T20:08:05.294Z","0.4.60":"2022-07-31T20:15:15.614Z","0.4.61":"2022-07-31T20:39:02.697Z","0.4.62":"2022-07-31T20:43:45.045Z","0.4.63":"2022-07-31T20:52:12.904Z","0.4.64":"2022-08-01T04:06:20.800Z","0.4.65":"2022-08-01T05:18:36.029Z","0.4.66":"2022-08-01T05:34:02.589Z","0.4.67":"2022-08-01T18:54:54.706Z","0.4.68":"2022-08-02T04:33:42.664Z","0.4.69":"2022-08-03T05:14:27.807Z","0.4.71":"2022-08-05T16:07:53.828Z","0.4.72":"2022-08-08T00:58:50.507Z","0.4.73":"2022-08-08T01:16:46.598Z","0.4.74":"2022-08-08T06:26:53.335Z","0.4.75":"2022-08-09T05:34:46.148Z","0.4.76":"2022-08-09T18:49:45.901Z","0.4.77":"2022-08-09T19:05:07.464Z","0.4.78":"2022-08-10T16:19:03.869Z","0.4.79":"2022-08-11T04:57:48.701Z","0.4.80":"2022-08-12T03:50:45.631Z","0.4.81":"2022-08-12T04:30:11.606Z","0.4.82":"2022-08-12T05:14:45.877Z","0.4.83":"2022-08-12T05:15:24.279Z","0.4.84":"2022-08-18T04:33:34.856Z","0.4.85":"2022-08-18T19:53:17.159Z","0.4.86":"2022-08-19T02:54:50.104Z","0.4.87":"2022-08-20T16:00:15.054Z","0.4.88":"2022-08-20T16:01:34.323Z","0.4.89":"2022-08-21T22:40:48.609Z","0.4.90":"2022-08-21T22:50:29.458Z","0.4.91":"2022-08-22T04:42:23.565Z","0.4.92":"2022-08-23T04:34:53.253Z","0.4.93":"2022-08-24T17:17:07.672Z","0.4.94":"2022-08-26T17:21:08.427Z","0.4.95":"2022-08-27T15:40:18.029Z","0.4.96":"2022-08-27T16:37:11.171Z","0.4.97":"2022-08-27T17:15:24.655Z","0.4.98":"2022-08-28T16:01:30.942Z","0.4.99":"2022-09-03T15:50:44.507Z","0.4.100":"2022-09-03T21:43:47.180Z","0.4.101":"2022-09-05T05:51:27.362Z","0.4.102":"2022-09-05T06:22:37.976Z","0.4.103":"2022-09-05T07:06:52.490Z","0.4.104":"2022-09-13T19:04:25.296Z","0.4.105":"2022-09-13T19:06:18.519Z","0.4.106":"2022-09-14T16:43:44.982Z","0.4.107":"2022-09-15T16:30:14.923Z","0.4.108":"2022-11-05T16:56:16.978Z","0.4.109":"2022-11-05T18:08:00.847Z","0.4.112":"2022-12-01T04:53:01.300Z","0.4.113":"2022-12-01T07:29:16.650Z","0.4.114":"2022-12-01T18:54:14.318Z","0.4.115":"2022-12-03T05:51:35.421Z","0.4.116":"2022-12-03T05:53:57.387Z","0.4.117":"2022-12-03T06:00:10.597Z","0.4.118":"2022-12-08T20:13:50.164Z","0.4.119":"2022-12-09T06:48:12.686Z","0.4.120":"2022-12-09T17:30:24.465Z","0.4.121":"2022-12-10T02:24:55.697Z","0.4.122":"2022-12-11T00:43:30.223Z","0.4.124":"2022-12-11T00:47:15.976Z","0.4.125":"2022-12-13T01:41:26.499Z","0.4.126":"2022-12-13T06:20:36.197Z","0.4.127":"2022-12-20T18:17:23.387Z","0.4.128":"2022-12-20T19:20:31.620Z","0.4.129":"2022-12-22T00:37:18.235Z","0.4.131":"2022-12-25T19:56:55.257Z","0.4.132":"2022-12-26T18:29:18.049Z","0.4.133":"2023-01-03T21:11:27.869Z","0.4.134":"2023-01-03T22:36:08.975Z","0.4.135":"2023-01-15T17:16:20.014Z","0.4.136":"2023-01-15T18:57:48.813Z","0.4.137":"2023-01-21T20:32:49.513Z","0.4.138":"2023-01-22T05:52:04.903Z","0.4.139":"2023-01-22T05:55:50.388Z","0.4.140":"2023-01-22T06:13:01.085Z","0.4.141":"2023-01-22T06:46:39.318Z","0.4.142":"2023-01-22T07:17:16.350Z","0.4.143":"2023-01-22T20:56:11.750Z","0.4.144":"2023-02-06T18:46:06.708Z","0.4.145":"2023-02-06T20:06:37.214Z","0.4.147":"2023-02-15T06:12:28.225Z","0.4.148":"2023-02-15T19:43:55.299Z","0.4.149":"2023-02-17T18:17:20.118Z","0.4.150":"2023-02-18T22:09:40.281Z","0.4.151":"2023-02-19T16:40:58.544Z","0.4.152":"2023-02-19T20:30:44.823Z","0.4.153":"2023-02-20T21:32:43.885Z","0.4.154":"2023-02-20T21:36:12.463Z"},"maintainers":[{"name":"tve","email":"tve-npm@voneicken.com"}],"description":"Node-RED nodes for the FlexDash dashboard","homepage":"https://github.com/flexdash/node-red-flexdash#readme","keywords":["flexdash","dashboard","node-red"],"repository":{"type":"git","url":"git+https://github.com/flexdash/node-red-flexdash.git"},"author":{"name":"Thorsten von Eicken"},"bugs":{"url":"https://github.com/flexdash/node-red-flexdash/issues"},"license":"MIT","readme":"","readmeFilename":""}