@keload/node-red-dxp 1.3.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,51 +1,45 @@
1
- 'use strict';var W=require('fs'),cosmiconfig=require('cosmiconfig'),glob=require('glob'),radash=require('radash'),M=require('path'),H=require('esbuild'),htmlMinifierTerser=require('html-minifier-terser'),C=require('fs/promises'),$e=require('@fullhuman/postcss-purgecss'),Se=require('autoprefixer'),Pe=require('cssnano'),V=require('postcss'),U=require('sass'),we=require('tailwindcss');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var W__default=/*#__PURE__*/_interopDefault(W);var M__default=/*#__PURE__*/_interopDefault(M);var H__default=/*#__PURE__*/_interopDefault(H);var C__default=/*#__PURE__*/_interopDefault(C);var $e__default=/*#__PURE__*/_interopDefault($e);var Se__default=/*#__PURE__*/_interopDefault(Se);var Pe__default=/*#__PURE__*/_interopDefault(Pe);var V__default=/*#__PURE__*/_interopDefault(V);var U__namespace=/*#__PURE__*/_interopNamespace(U);var we__default=/*#__PURE__*/_interopDefault(we);var Z=Object.defineProperty;var j=Object.getOwnPropertySymbols;var ee=Object.prototype.hasOwnProperty,te=Object.prototype.propertyIsEnumerable;var I=(e,t,r)=>t in e?Z(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))ee.call(t,r)&&I(e,r,t[r]);if(j)for(var r of j(t))te.call(t,r)&&I(e,r,t[r]);return e};var re=(e=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(e,{get:(t,r)=>(typeof require!="undefined"?require:t)[r]}):e)(function(e){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var i=(e,t,r)=>new Promise((o,s)=>{var n=l=>{try{c(r.next(l));}catch(a){s(a);}},m=l=>{try{c(r.throw(l));}catch(a){s(a);}},c=l=>l.done?o(l.value):Promise.resolve(l.value).then(n,m);c((r=r.apply(e,t)).next());});function N(e){return Object.prototype.toString.call(e).slice(8,-1)}function x(e){if(N(e)!=="Object")return !1;let t=Object.getPrototypeOf(e);return !!t&&t.constructor===Object&&t===Object.prototype}function b(e){return N(e)==="Symbol"}function O(e,t,r,o){let s={}.propertyIsEnumerable.call(o,t)?"enumerable":"nonenumerable";s==="enumerable"&&(e[t]=r),s==="nonenumerable"&&Object.defineProperty(e,t,{value:r,enumerable:!1,writable:!0,configurable:!0});}function v(e,t,r){if(!x(t))return t;let o={};if(x(e)){let c=Object.getOwnPropertyNames(e),l=Object.getOwnPropertySymbols(e);o=[...c,...l].reduce((a,p)=>{let S=e[p];return (!b(p)&&!Object.getOwnPropertyNames(t).includes(p)||b(p)&&!Object.getOwnPropertySymbols(t).includes(p))&&O(a,p,S,e),a},{});}let s=Object.getOwnPropertyNames(t),n=Object.getOwnPropertySymbols(t);return [...s,...n].reduce((c,l)=>{let a=t[l],p=x(e)?e[l]:void 0;p!==void 0&&x(a)&&(a=v(p,a));let S=a;return O(c,l,S,t),c},o)}function E(e,...t){return t.reduce((r,o)=>v(r,o),e)}var A={libCacheDir:".node-red-dx",srcDir:"src",nodesDirName:"nodes",nodes:{controllerName:"index",editor:{dirName:"editor",htmlName:"index",tsName:"index"}},builder:{outputDir:"dist"},watcher:{nodeRed:{enabled:!0,path:"~/.node-red",url:"http://localhost:1880"}}};var le="node-red-dx",ae=e=>e.replace("@","").replace("/","-");function ce(){let e=cosmiconfig.cosmiconfigSync(le);try{let t=e.search();return E(A,t?t.config:{})}catch(t){throw console.error("Error while loading configuration",t),t}}var f=ce(),g=process.cwd(),L=JSON.parse(W.readFileSync(`${g}/package.json`,"utf-8")),w=`${g}/${f.srcDir}`,me=`${g}/resources`,$=`${w}/${f.nodesDirName}`,F=`${g}/${f.libCacheDir}`;function pe(){return glob.globSync(`${$}/*`,{withFileTypes:!0}).map(t=>{let r=t.fullpath(),o=`${r}/${f.nodes.editor.dirName}`,s=r.replace(g,"").slice(1),n=`${s}/${f.nodes.editor.dirName}`,m=glob.globSync(`${o}/**/*.scss`),c=glob.globSync(`${r}/doc.mdx`),l=glob.globSync(`${r}/doc.md`),a=radash.dash(t.name);return {fullEditorPath:o,fullPath:r,name:t.name,pascalName:radash.pascal(t.name),dashName:a,relativeEditorPath:n,relativePath:s,nodeIdentifier:`${d.packageNameSlug}-${a}`,fullControllerPath:`${r}/${f.nodes.controllerName}.ts`,editor:{tsPath:`${o}/${f.nodes.editor.tsName}.ts`,htmlPath:`${o}/${f.nodes.editor.htmlName}.html`,scssFiles:m},doc:{mdxFiles:c,mdFiles:l}}})}function D(){return {currentDir:g,pathSrcDir:w,pathSrcNodesDir:$,additionalResourcesDir:me,pathDist:`${g}/${f.builder.outputDir}`,cacheDirFiles:{controllerIndex:`${F}/controller-index.ts`,editorIndex:`${F}/editor-index.ts`},pathLibCacheDir:F,packageName:L.name,packageNameSlug:ae(L.name),config:f,getResolvedSrcPathsScss:()=>glob.globSync(`${w}/**/*.scss`,{ignore:`${$}/**/*.scss`}),getResolvedNodesPaths:()=>glob.globSync(`${$}/*`),getListNodesFull:()=>pe()}}var d=D();function R(e=!1){return i(this,null,function*(){return H__default.default.build({entryPoints:[d.cacheDirFiles.controllerIndex],outfile:`${d.pathDist}/index.js`,bundle:!0,minify:e,minifyWhitespace:e,minifyIdentifiers:e,minifySyntax:e,platform:"node",format:"cjs",target:"es2018",loader:{".ts":"ts"},packages:"external"})})}function T(e=!1){return i(this,null,function*(){let t=yield H__default.default.build({entryPoints:[d.cacheDirFiles.editorIndex],bundle:!0,platform:"browser",format:"iife",target:"es6",sourcemap:!1,minify:e,minifyWhitespace:e,minifySyntax:e,minifyIdentifiers:e,legalComments:"none",inject:[M__default.default.resolve(__dirname,"..","./editor/global-solid.ts")],write:!1,loader:{".ts":"ts"}});return t.outputFiles&&t.outputFiles.length>0?t.outputFiles[0].text:""})}function k(){let e=d.getListNodesFull(),t=[];for(let r of e)if(r.doc.mdFiles[0]){let s=W__default.default.readFileSync(r.doc.mdFiles[0],"utf-8"),n=`
2
- <script type="text/markdown" data-help-name="${r.name}">
3
- ${s}
4
- </script>
5
- `;t.push(n);}return t.length?t.join(`
6
- `):""}function _(e){return e.trim().replace(/\n\s+/g,"")}function G(e){return i(this,null,function*(){for(let t of e)try{let r=M__default.default.resolve(t),o=yield C__default.default.stat(r).catch(()=>null);o!=null&&o.isDirectory()?(yield C__default.default.rm(r,{recursive:!0,force:!0}),console.log(`Successfully cleaned: ${r}`)):console.log(`Path does not exist or is not a directory: ${r}`);}catch(r){console.error(`Error cleaning path (${t}): ${r}`);}})}function B(e){let t=M__default.default.resolve(e);W__default.default.existsSync(t)||W__default.default.mkdirSync(t,{recursive:!0});}function h(e,t){return i(this,null,function*(){try{yield C__default.default.writeFile(e,t);}catch(r){console.error("Error writing controller index:",r);}})}function xe(e){return i(this,null,function*(){return htmlMinifierTerser.minify(e,{collapseWhitespace:!0,removeComments:!0,removeRedundantAttributes:!1,useShortDoctype:!0,removeEmptyAttributes:!1,minifyCSS:!1,minifyJS:!1})})}function ye(e,t){return `
7
- <script type="text/html" data-template-name="${e}">
8
- ${t}
9
- </script>
10
- `}function he(e,t,r=!1){return i(this,null,function*(){let o=W.readFileSync(e.editor.htmlPath,"utf8"),s=`
11
- <div class="${t}">
12
- <div class="${e.nodeIdentifier}">${o}</div>
13
- </div>
14
- `,n=r?yield xe(s):s,m=ye(e.name,n);return {nodeName:e.name,nodeIdentifier:e.nodeIdentifier,html:n,wrappedHtml:m}})}function J(e){return i(this,null,function*(){let{nodes:t,minify:r=!1}=e,o=yield Promise.all(t.map(n=>he(n,e.packageNameSlug,r)));return {html:o.map(n=>n.html).join("").trim(),allWrappedHtml:o.map(n=>r?_(n.wrappedHtml):n.wrappedHtml).join("").trim()}})}function De(e,t){return i(this,null,function*(){return (yield V__default.default([$e__default.default({content:[{raw:t,extension:"html"}]}),Se__default.default,Pe__default.default({preset:"default"})]).process(e,{from:void 0})).css})}function Ce(e){return U__namespace.compile(e,{style:"expanded"}).css}function q(e){let t={};for(let r=0;r<e.length;r++){let o=e[r];t[o]=Ce(o);}return t}function je(e){return e.some(r=>r.editor.scssFiles.length)?e.filter(r=>r.editor.scssFiles.length).map(r=>{let o=q(r.editor.scssFiles),s=Object.values(o).join("");return {name:r.name,mergedCompiledStyles:s,scssFinal:`
15
- #${r.nodeIdentifier}{
16
- ${s}
17
- }`}}):[]}function Ie(r){return i(this,arguments,function*(e,t={}){let s=P(P({},{content:[{raw:e}],theme:{}}),t),n=glob.globSync(`${M__default.default.resolve(__dirname,"..")}/${d.config.nodes.editor.dirName}/assets/tailwind.scss`)[0],m=n.length?W__default.default.readFileSync(n,"utf8"):"";return (yield V__default.default([we__default.default(s),re("autoprefixer")]).process(m,{from:void 0})).css})}function Oe(){let e=d.getResolvedSrcPathsScss(),t=q([...e]);return Object.values(t).join("")}function z(e){return i(this,null,function*(){let{rawHtml:t,minify:r=!1,nodes:o}=e||{},s=Oe(),n=je(o),m=yield Ie(t),c=p=>`.${d.packageNameSlug}{${p}}`,l=n.map(p=>p.scssFinal).join(`
18
- `),a=c(`${m}${s}${l}`);return r?De(a,t):a})}function K(e){return i(this,null,function*(){let{minify:t=!1}=e||{},r=yield J({minify:t,nodes:e.nodes,packageNameSlug:d.packageNameSlug}),o=yield T(t),s=yield z({rawHtml:r.html,minify:t,nodes:e.nodes}),n=k(),m=`<script type="application/javascript">${o.trim()}</script>`,c=`<style>${s}</style>`;return `
19
- ${r.allWrappedHtml}
20
- ${c}
21
- ${m}
22
- ${n}`.trim()})}var Q=`
23
- // generated by @keload/node-red-dev-xp
24
- // do not modify this file
25
- // do not commit this file
26
- `;function X(e){return i(this,null,function*(){return `
27
- ${Q}
1
+ 'use strict';var k=require('fs'),B=require('path'),cosmiconfig=require('cosmiconfig'),glob=require('glob'),radash=require('radash'),E=require('fs/promises'),dt=require('esbuild'),htmlMinifierTerser=require('html-minifier-terser'),Nt=require('@fullhuman/postcss-purgecss'),$t=require('autoprefixer'),St=require('cssnano'),V=require('postcss'),U=require('sass'),Ct=require('tailwindcss');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var k__default=/*#__PURE__*/_interopDefault(k);var B__default=/*#__PURE__*/_interopDefault(B);var E__default=/*#__PURE__*/_interopDefault(E);var dt__default=/*#__PURE__*/_interopDefault(dt);var Nt__default=/*#__PURE__*/_interopDefault(Nt);var $t__default=/*#__PURE__*/_interopDefault($t);var St__default=/*#__PURE__*/_interopDefault(St);var V__default=/*#__PURE__*/_interopDefault(V);var U__namespace=/*#__PURE__*/_interopNamespace(U);var Ct__default=/*#__PURE__*/_interopDefault(Ct);var Q=Object.defineProperty;var v=Object.getOwnPropertySymbols;var X=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable;var D=(e,t,r)=>t in e?Q(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,u=(e,t)=>{for(var r in t||(t={}))X.call(t,r)&&D(e,r,t[r]);if(v)for(var r of v(t))Y.call(t,r)&&D(e,r,t[r]);return e};var Z=(e=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(e,{get:(t,r)=>(typeof require!="undefined"?require:t)[r]}):e)(function(e){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var g=(e,t,r)=>D(e,typeof t!="symbol"?t+"":t,r);var a=(e,t,r)=>new Promise((o,i)=>{var n=l=>{try{c(r.next(l));}catch(m){i(m);}},d=l=>{try{c(r.throw(l));}catch(m){i(m);}},c=l=>l.done?o(l.value):Promise.resolve(l.value).then(n,d);c((r=r.apply(e,t)).next());});function N(e){return Object.prototype.toString.call(e).slice(8,-1)}function x(e){if(N(e)!=="Object")return !1;let t=Object.getPrototypeOf(e);return !!t&&t.constructor===Object&&t===Object.prototype}function $(e){return N(e)==="Symbol"}function I(e,t,r,o){let i={}.propertyIsEnumerable.call(o,t)?"enumerable":"nonenumerable";i==="enumerable"&&(e[t]=r),i==="nonenumerable"&&Object.defineProperty(e,t,{value:r,enumerable:!1,writable:!0,configurable:!0});}function A(e,t,r){if(!x(t))return t;let o={};if(x(e)){let c=Object.getOwnPropertyNames(e),l=Object.getOwnPropertySymbols(e);o=[...c,...l].reduce((m,p)=>{let w=e[p];return (!$(p)&&!Object.getOwnPropertyNames(t).includes(p)||$(p)&&!Object.getOwnPropertySymbols(t).includes(p))&&I(m,p,w,e),m},{});}let i=Object.getOwnPropertyNames(t),n=Object.getOwnPropertySymbols(t);return [...i,...n].reduce((c,l)=>{let m=t[l],p=x(e)?e[l]:void 0;p!==void 0&&x(m)&&(m=A(p,m));let w=m;return I(c,l,w,t),c},o)}function H(e,...t){return t.reduce((r,o)=>A(r,o),e)}var T={libCacheDir:".node-red-dx",srcDir:"src",nodesDirName:"nodes",nodes:{controllerName:"index",editor:{dirName:"editor",htmlName:"index",tsName:"index"}},builder:{outputDir:"dist"},watcher:{nodeRed:{enabled:!0,path:"~/.node-red",url:"http://localhost:1880"}}};var it="node-red-dx",nt=e=>e.replace("@","").replace("/","-");function at(){let e=cosmiconfig.cosmiconfigSync(it);try{let t=e.search();return H(T,t?t.config:{})}catch(t){throw console.error("Error while loading configuration",t),t}}var f=at(),y=process.cwd(),L=JSON.parse(k.readFileSync(`${y}/package.json`,"utf-8")),O=`${y}/${f.srcDir}`,lt=`${y}/resources`,S=`${O}/${f.nodesDirName}`,j=`${y}/${f.libCacheDir}`,mt=`${B__default.default.resolve(__dirname,"..")}`,R=nt(L.name);function ct(){return glob.globSync(`${S}/*`,{withFileTypes:!0}).map(t=>{let r=t.fullpath(),o=`${r}/${f.nodes.editor.dirName}`,i=r.replace(y,"").slice(1),n=`${i}/${f.nodes.editor.dirName}`,d=glob.globSync(`${o}/**/*.scss`),c=glob.globSync(`${r}/doc.mdx`),l=glob.globSync(`${r}/doc.md`),m=radash.dash(t.name);return {fullEditorPath:o,fullPath:r,name:t.name,pascalName:radash.pascal(t.name),dashName:m,relativeEditorPath:n,relativePath:i,nodeIdentifier:`${R}-${m}`,fullControllerPath:`${r}/${f.nodes.controllerName}.ts`,editor:{tsPath:`${o}/${f.nodes.editor.tsName}.ts`,htmlPath:`${o}/${f.nodes.editor.htmlName}.html`,scssFiles:d},doc:{mdxFiles:c,mdFiles:l}}})}function pt(){return {currentDir:y,pathSrcDir:O,pathSrcNodesDir:S,additionalResourcesDir:lt,pathDist:`${y}/${f.builder.outputDir}`,currentPackagedDistPath:mt,cacheDirFiles:{controllerIndex:`${j}/controller-index.ts`,editorIndex:`${j}/editor-index.ts`},pathLibCacheDir:j,packageName:L.name,packageNameSlug:R,config:f,resolvedSrcPathsScss:glob.globSync(`${O}/**/*.scss`,{ignore:`${S}/**/*.scss`}),resolvedNodesPaths:glob.globSync(`${S}/*`),listNodesFull:ct()}}var s=pt();var W=`${B__default.default.resolve(__dirname,"..")}`;function M(e){k__default.default.existsSync(e)||k__default.default.mkdirSync(e,{recursive:!0});}function h(e,t){return a(this,null,function*(){try{yield E__default.default.writeFile(e,t);}catch(r){console.error("Error writing controller index:",r);}})}function _(e){return a(this,null,function*(){for(let t of e)try{let r=B__default.default.resolve(t),o=yield E__default.default.stat(r).catch(()=>null);o!=null&&o.isDirectory()&&(yield E__default.default.rm(r,{recursive:!0,force:!0}));}catch(r){console.error(`Error cleaning path (${t}): ${r}`);}})}var P=class{constructor(t){g(this,"params");this.params=u({minify:!1},t);}getControllerIndexContent(){return a(this,null,function*(){return `
28
2
  import type { NodeAPI } from 'node-red';
29
- ${e.map(t=>`import ${t.pascalName} from '${t.fullControllerPath}';`).join(`
3
+ ${s.listNodesFull.map(t=>`import ${t.pascalName} from '${t.fullControllerPath}';`).join(`
30
4
  `)}
31
5
 
32
6
 
33
7
  export default async (RED: NodeAPI): Promise<void> => {
34
8
  global.RED = RED;
35
9
 
36
- ${e.map(t=>`// @ts-ignore
10
+ ${s.listNodesFull.map(t=>`// @ts-ignore
37
11
  global.RED.nodes.registerType('${t.name}', ${t.pascalName});`).join(`
38
12
  `)}
39
13
  };
40
- `.trim()})}function Y(e){return i(this,null,function*(){return `
41
- ${Q}
14
+ `.trim()})}buildScript(){return dt__default.default.build({entryPoints:[s.cacheDirFiles.controllerIndex],outfile:`${s.pathDist}/index.js`,bundle:!0,minify:this.params.minify,minifyWhitespace:this.params.minify,minifyIdentifiers:this.params.minify,minifySyntax:this.params.minify,platform:"node",format:"cjs",target:"es2018",loader:{".ts":"ts"},packages:"external"})}getControllerTask(){return a(this,null,function*(){return this.getControllerIndexContent().then(t=>{h(`${s.cacheDirFiles.controllerIndex}`,t).then(()=>{this.buildScript();});})})}};var C=class{getAllDocContent(){let t=[];for(let r of s.listNodesFull)if(r.doc.mdFiles[0]){let i=k__default.default.readFileSync(r.doc.mdFiles[0],"utf-8"),n=`
15
+ <script type="text/markdown" data-help-name="${r.name}">
16
+ ${i}
17
+ </script>
18
+ `;t.push(n);}return t.length?t.join(`
19
+ `):""}};function G(e){return e.trim().replace(/\n\s+/g,"")}function yt(e){return a(this,null,function*(){return htmlMinifierTerser.minify(e,{collapseWhitespace:!0,removeComments:!0,removeRedundantAttributes:!1,useShortDoctype:!0,removeEmptyAttributes:!1,minifyCSS:!1,minifyJS:!1})})}function ht(e,t){return `
20
+ <script type="text/html" data-template-name="${e}">
21
+ ${t}
22
+ </script>
23
+ `}function xt(e,t,r=!1){return a(this,null,function*(){let o=k.readFileSync(e.editor.htmlPath,"utf8"),i=`
24
+ <div class="${t}">
25
+ <div class="${e.nodeIdentifier}">${o}</div>
26
+ </div>
27
+ `,n=r?yield yt(i):i,d=ht(e.name,n);return {nodeName:e.name,nodeIdentifier:e.nodeIdentifier,html:n,wrappedHtml:d}})}function J(e){return a(this,null,function*(){let{nodes:t,minify:r=!1}=e,o=yield Promise.all(t.map(n=>xt(n,e.packageNameSlug,r)));return {html:o.map(n=>n.html).join("").trim(),allWrappedHtml:o.map(n=>r?G(n.wrappedHtml):n.wrappedHtml).join("").trim()}})}function Ft(e,t){return a(this,null,function*(){return (yield V__default.default([Nt__default.default({content:[{raw:t,extension:"html"}]}),$t__default.default,St__default.default({preset:"default"})]).process(e,{from:void 0})).css})}function wt(e){return U__namespace.compile(e,{style:"expanded"}).css}function q(e){let t={};for(let r=0;r<e.length;r++){let o=e[r];t[o]=wt(o);}return t}function Dt(e){return e.some(r=>r.editor.scssFiles.length)?e.filter(r=>r.editor.scssFiles.length).map(r=>{let o=q(r.editor.scssFiles),i=Object.values(o).join("");return {name:r.name,mergedCompiledStyles:i,scssFinal:`
28
+ #${r.nodeIdentifier}{
29
+ ${i}
30
+ }`}}):[]}function jt(r){return a(this,arguments,function*(e,t={}){let i=u(u({},{content:[{raw:e}],theme:{}}),t),n=glob.globSync(`${W}/${s.config.nodes.editor.dirName}/assets/tailwind.scss`)[0],d=n.length?k__default.default.readFileSync(n,"utf8"):"";return (yield V__default.default([Ct__default.default(i),Z("autoprefixer")]).process(d,{from:void 0})).css})}function Ot(){let e=s.resolvedSrcPathsScss,t=q([...e]);return Object.values(t).join("")}function z(e){return a(this,null,function*(){let{rawHtml:t,minify:r=!1,nodes:o}=e||{},i=Ot(),n=Dt(o),d=yield jt(t),c=p=>`.${s.packageNameSlug}{${p}}`,l=n.map(p=>p.scssFinal).join(`
31
+ `),m=c(`${d}${i}${l}`);return r?Ft(m,t):m})}var F=class{constructor(t){g(this,"params");this.params=u({minify:!1},t);}getEditorIndexContent(){return a(this,null,function*(){return `
42
32
  import type { NodeAPI } from 'node-red';
43
- ${e.map(t=>`import ${t.pascalName} from '${t.editor.tsPath}';`).join(`
33
+ ${s.listNodesFull.map(t=>`import ${t.pascalName} from '${t.editor.tsPath}';`).join(`
44
34
  `)}
45
35
 
46
36
  declare const RED: NodeAPI;
47
37
 
48
- ${e.map(t=>`// @ts-ignore
38
+ ${s.listNodesFull.map(t=>`// @ts-ignore
49
39
  window.RED.nodes.registerType('${t.name}', ${t.pascalName});`).join(`
50
40
  `)}
51
- `.trim()})}var u=D();function Wt(e){return i(this,null,function*(){let{minify:t=!1}=e||{},r=u.getListNodesFull();B(u.pathLibCacheDir),yield G([u.pathDist]);let o=X(r).then(n=>{h(`${u.cacheDirFiles.controllerIndex}`,n).then(()=>{R(t);});}),s=Y(r).then(n=>{h(`${u.cacheDirFiles.editorIndex}`,n).then(()=>{K({minify:t,nodes:r}).then(m=>i(this,null,function*(){yield h(`${u.pathDist}/index.html`,m);}));});});yield Promise.all([o,s,h(`${u.pathLibCacheDir}/config.json`,JSON.stringify(u.config,null,2))]);})}exports.buildAllPackage=Wt;exports.buildFinalDistIndexContent=K;exports.currentInstance=u;exports.generateCSSFromHTMLWithTailwind=Ie;exports.getAllCompiledStyles=z;exports.getControllerIndexContent=X;exports.getEditorIndexContent=Y;exports.getNodesHtml=J;exports.getNodesStyles=je;exports.getSrcStyles=Oe;exports.handleAllDoc=k;exports.minifyHtml=xe;
41
+ `.trim()})}getBuiltScript(){return a(this,null,function*(){let t=yield dt__default.default.build({entryPoints:[s.cacheDirFiles.editorIndex],bundle:!0,platform:"browser",format:"iife",target:"es6",sourcemap:!1,minify:this.params.minify,minifyWhitespace:this.params.minify,minifySyntax:this.params.minify,minifyIdentifiers:this.params.minify,legalComments:"none",inject:[`${s.currentPackagedDistPath}/editor/global-solid.ts`],write:!1,loader:{".ts":"ts"}});return t.outputFiles&&t.outputFiles.length>0?t.outputFiles[0].text:""})}prepareEditorIndex(){return a(this,null,function*(){let t=yield this.getBuiltScript(),r=yield J({minify:this.params.minify,nodes:s.listNodesFull,packageNameSlug:s.packageNameSlug}),o=yield z({rawHtml:r.html,minify:this.params.minify,nodes:s.listNodesFull}),n=new C().getAllDocContent(),d=`<script type="application/javascript">${t.trim()}</script>`,c=`<style>${o}</style>`;return `
42
+ ${r.allWrappedHtml}
43
+ ${c}
44
+ ${d}
45
+ ${n}`.trim()})}getEditorTask(){return a(this,null,function*(){return this.getEditorIndexContent().then(t=>{h(`${s.cacheDirFiles.editorIndex}`,t).then(()=>{this.prepareEditorIndex().then(r=>a(this,null,function*(){yield h(`${s.pathDist}/${s.config.nodes.editor.htmlName}.html`,r);}));});})})}};var K=class{constructor(t){g(this,"params");g(this,"builderController");g(this,"builderEditor");this.params=u({minify:!1},t),this.builderController=new P({minify:this.params.minify}),this.builderEditor=new F({minify:this.params.minify});}prepare(){M(s.pathLibCacheDir);let t=[_([s.pathDist]),h(`${s.pathLibCacheDir}/config.json`,JSON.stringify(s.config,null,2))];return Promise.all(t)}buildAll(){return a(this,null,function*(){return yield this.prepare(),Promise.all([this.builderController.getControllerTask(),this.builderEditor.getEditorTask()])})}};exports.Builder=K;
@@ -1,143 +1,13 @@
1
- type Config = {
2
- libCacheDir: string;
3
- srcDir: string;
4
- nodesDirName: string;
5
- nodes: {
6
- controllerName: string;
7
- editor: {
8
- dirName: string;
9
- htmlName: string;
10
- tsName: string;
11
- };
12
- };
13
- builder: {
14
- outputDir: string;
15
- };
16
- watcher: {
17
- nodeRed: {
18
- enabled: boolean;
19
- path: string | undefined;
20
- url: string;
21
- };
22
- };
23
- };
24
-
25
- declare const currentInstance$1: {
26
- currentDir: string;
27
- pathSrcDir: string;
28
- pathSrcNodesDir: string;
29
- additionalResourcesDir: string;
30
- pathDist: string;
31
- cacheDirFiles: {
32
- controllerIndex: string;
33
- editorIndex: string;
34
- };
35
- pathLibCacheDir: string;
36
- packageName: any;
37
- packageNameSlug: string;
38
- config: Config;
39
- getResolvedSrcPathsScss: () => string[];
40
- getResolvedNodesPaths: () => string[];
41
- getListNodesFull: () => {
42
- fullEditorPath: string;
43
- fullPath: string;
44
- name: string;
45
- pascalName: string;
46
- dashName: string;
47
- relativeEditorPath: string;
48
- relativePath: string;
49
- nodeIdentifier: string;
50
- fullControllerPath: string;
51
- editor: {
52
- tsPath: string;
53
- htmlPath: string;
54
- scssFiles: string[];
55
- };
56
- doc: {
57
- mdxFiles: string[];
58
- mdFiles: string[];
59
- };
60
- }[];
61
- };
62
- type ListNodesFull = ReturnType<typeof currentInstance$1.getListNodesFull>;
63
-
64
- declare function getControllerIndexContent(nodes: ListNodesFull): Promise<string>;
65
- declare function getEditorIndexContent(nodes: ListNodesFull): Promise<string>;
66
-
67
- declare function getNodesStyles(nodes: ListNodesFull): {
68
- name: string;
69
- mergedCompiledStyles: string;
70
- scssFinal: string;
71
- }[];
72
- declare function generateCSSFromHTMLWithTailwind(htmlString: string, tailwindConfig?: any): Promise<string>;
73
- declare function getSrcStyles(): string;
74
- type GetAllCompiledStylesParams = {
75
- rawHtml: string;
76
- minify?: boolean;
77
- nodes: ListNodesFull;
78
- };
79
- declare function getAllCompiledStyles(params: GetAllCompiledStylesParams): Promise<string>;
80
-
81
- declare function minifyHtml(content: string): Promise<string>;
82
- type GetNodesHtmlParams = {
83
- nodes: ListNodesFull;
84
- minify?: boolean;
85
- packageNameSlug: string;
86
- };
87
- declare function getNodesHtml(params: GetNodesHtmlParams): Promise<{
88
- html: string;
89
- allWrappedHtml: string;
90
- }>;
91
-
92
- declare function buildFinalDistIndexContent(params?: WriteFinalDistIndexContentParams): Promise<string>;
93
- type WriteFinalDistIndexContentParams = {
94
- minify?: boolean;
95
- nodes: ListNodesFull;
96
- };
97
-
98
- declare function handleAllDoc(): string;
99
-
100
- declare const currentInstance: {
101
- currentDir: string;
102
- pathSrcDir: string;
103
- pathSrcNodesDir: string;
104
- additionalResourcesDir: string;
105
- pathDist: string;
106
- cacheDirFiles: {
107
- controllerIndex: string;
108
- editorIndex: string;
109
- };
110
- pathLibCacheDir: string;
111
- packageName: any;
112
- packageNameSlug: string;
113
- config: Config;
114
- getResolvedSrcPathsScss: () => string[];
115
- getResolvedNodesPaths: () => string[];
116
- getListNodesFull: () => {
117
- fullEditorPath: string;
118
- fullPath: string;
119
- name: string;
120
- pascalName: string;
121
- dashName: string;
122
- relativeEditorPath: string;
123
- relativePath: string;
124
- nodeIdentifier: string;
125
- fullControllerPath: string;
126
- editor: {
127
- tsPath: string;
128
- htmlPath: string;
129
- scssFiles: string[];
130
- };
131
- doc: {
132
- mdxFiles: string[];
133
- mdFiles: string[];
134
- };
135
- }[];
136
- };
137
-
138
- type BuildAllPackageParams = {
1
+ type BuilderClassParams = {
139
2
  minify?: boolean;
140
3
  };
141
- declare function buildAllPackage(params?: BuildAllPackageParams): Promise<void>;
4
+ declare class Builder {
5
+ private params;
6
+ private builderController;
7
+ private builderEditor;
8
+ constructor(params?: BuilderClassParams);
9
+ prepare(): Promise<void[]>;
10
+ buildAll(): Promise<[void, void]>;
11
+ }
142
12
 
143
- export { buildAllPackage, buildFinalDistIndexContent, currentInstance, generateCSSFromHTMLWithTailwind, getAllCompiledStyles, getControllerIndexContent, getEditorIndexContent, getNodesHtml, getNodesStyles, getSrcStyles, handleAllDoc, minifyHtml };
13
+ export { Builder };
@@ -1,143 +1,13 @@
1
- type Config = {
2
- libCacheDir: string;
3
- srcDir: string;
4
- nodesDirName: string;
5
- nodes: {
6
- controllerName: string;
7
- editor: {
8
- dirName: string;
9
- htmlName: string;
10
- tsName: string;
11
- };
12
- };
13
- builder: {
14
- outputDir: string;
15
- };
16
- watcher: {
17
- nodeRed: {
18
- enabled: boolean;
19
- path: string | undefined;
20
- url: string;
21
- };
22
- };
23
- };
24
-
25
- declare const currentInstance$1: {
26
- currentDir: string;
27
- pathSrcDir: string;
28
- pathSrcNodesDir: string;
29
- additionalResourcesDir: string;
30
- pathDist: string;
31
- cacheDirFiles: {
32
- controllerIndex: string;
33
- editorIndex: string;
34
- };
35
- pathLibCacheDir: string;
36
- packageName: any;
37
- packageNameSlug: string;
38
- config: Config;
39
- getResolvedSrcPathsScss: () => string[];
40
- getResolvedNodesPaths: () => string[];
41
- getListNodesFull: () => {
42
- fullEditorPath: string;
43
- fullPath: string;
44
- name: string;
45
- pascalName: string;
46
- dashName: string;
47
- relativeEditorPath: string;
48
- relativePath: string;
49
- nodeIdentifier: string;
50
- fullControllerPath: string;
51
- editor: {
52
- tsPath: string;
53
- htmlPath: string;
54
- scssFiles: string[];
55
- };
56
- doc: {
57
- mdxFiles: string[];
58
- mdFiles: string[];
59
- };
60
- }[];
61
- };
62
- type ListNodesFull = ReturnType<typeof currentInstance$1.getListNodesFull>;
63
-
64
- declare function getControllerIndexContent(nodes: ListNodesFull): Promise<string>;
65
- declare function getEditorIndexContent(nodes: ListNodesFull): Promise<string>;
66
-
67
- declare function getNodesStyles(nodes: ListNodesFull): {
68
- name: string;
69
- mergedCompiledStyles: string;
70
- scssFinal: string;
71
- }[];
72
- declare function generateCSSFromHTMLWithTailwind(htmlString: string, tailwindConfig?: any): Promise<string>;
73
- declare function getSrcStyles(): string;
74
- type GetAllCompiledStylesParams = {
75
- rawHtml: string;
76
- minify?: boolean;
77
- nodes: ListNodesFull;
78
- };
79
- declare function getAllCompiledStyles(params: GetAllCompiledStylesParams): Promise<string>;
80
-
81
- declare function minifyHtml(content: string): Promise<string>;
82
- type GetNodesHtmlParams = {
83
- nodes: ListNodesFull;
84
- minify?: boolean;
85
- packageNameSlug: string;
86
- };
87
- declare function getNodesHtml(params: GetNodesHtmlParams): Promise<{
88
- html: string;
89
- allWrappedHtml: string;
90
- }>;
91
-
92
- declare function buildFinalDistIndexContent(params?: WriteFinalDistIndexContentParams): Promise<string>;
93
- type WriteFinalDistIndexContentParams = {
94
- minify?: boolean;
95
- nodes: ListNodesFull;
96
- };
97
-
98
- declare function handleAllDoc(): string;
99
-
100
- declare const currentInstance: {
101
- currentDir: string;
102
- pathSrcDir: string;
103
- pathSrcNodesDir: string;
104
- additionalResourcesDir: string;
105
- pathDist: string;
106
- cacheDirFiles: {
107
- controllerIndex: string;
108
- editorIndex: string;
109
- };
110
- pathLibCacheDir: string;
111
- packageName: any;
112
- packageNameSlug: string;
113
- config: Config;
114
- getResolvedSrcPathsScss: () => string[];
115
- getResolvedNodesPaths: () => string[];
116
- getListNodesFull: () => {
117
- fullEditorPath: string;
118
- fullPath: string;
119
- name: string;
120
- pascalName: string;
121
- dashName: string;
122
- relativeEditorPath: string;
123
- relativePath: string;
124
- nodeIdentifier: string;
125
- fullControllerPath: string;
126
- editor: {
127
- tsPath: string;
128
- htmlPath: string;
129
- scssFiles: string[];
130
- };
131
- doc: {
132
- mdxFiles: string[];
133
- mdFiles: string[];
134
- };
135
- }[];
136
- };
137
-
138
- type BuildAllPackageParams = {
1
+ type BuilderClassParams = {
139
2
  minify?: boolean;
140
3
  };
141
- declare function buildAllPackage(params?: BuildAllPackageParams): Promise<void>;
4
+ declare class Builder {
5
+ private params;
6
+ private builderController;
7
+ private builderEditor;
8
+ constructor(params?: BuilderClassParams);
9
+ prepare(): Promise<void[]>;
10
+ buildAll(): Promise<[void, void]>;
11
+ }
142
12
 
143
- export { buildAllPackage, buildFinalDistIndexContent, currentInstance, generateCSSFromHTMLWithTailwind, getAllCompiledStyles, getControllerIndexContent, getEditorIndexContent, getNodesHtml, getNodesStyles, getSrcStyles, handleAllDoc, minifyHtml };
13
+ export { Builder };
@@ -1,51 +1,45 @@
1
- import W,{readFileSync}from'node:fs';import {cosmiconfigSync}from'cosmiconfig';import {globSync}from'glob';import {dash,pascal}from'radash';import M from'node:path';import H from'esbuild';import {minify}from'html-minifier-terser';import C from'node:fs/promises';import $e from'@fullhuman/postcss-purgecss';import Se from'autoprefixer';import Pe from'cssnano';import V from'postcss';import*as U from'sass';import we from'tailwindcss';var Z=Object.defineProperty;var j=Object.getOwnPropertySymbols;var ee=Object.prototype.hasOwnProperty,te=Object.prototype.propertyIsEnumerable;var I=(e,t,r)=>t in e?Z(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))ee.call(t,r)&&I(e,r,t[r]);if(j)for(var r of j(t))te.call(t,r)&&I(e,r,t[r]);return e};var re=(e=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(e,{get:(t,r)=>(typeof require!="undefined"?require:t)[r]}):e)(function(e){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var i=(e,t,r)=>new Promise((o,s)=>{var n=l=>{try{c(r.next(l));}catch(a){s(a);}},m=l=>{try{c(r.throw(l));}catch(a){s(a);}},c=l=>l.done?o(l.value):Promise.resolve(l.value).then(n,m);c((r=r.apply(e,t)).next());});function N(e){return Object.prototype.toString.call(e).slice(8,-1)}function x(e){if(N(e)!=="Object")return !1;let t=Object.getPrototypeOf(e);return !!t&&t.constructor===Object&&t===Object.prototype}function b(e){return N(e)==="Symbol"}function O(e,t,r,o){let s={}.propertyIsEnumerable.call(o,t)?"enumerable":"nonenumerable";s==="enumerable"&&(e[t]=r),s==="nonenumerable"&&Object.defineProperty(e,t,{value:r,enumerable:!1,writable:!0,configurable:!0});}function v(e,t,r){if(!x(t))return t;let o={};if(x(e)){let c=Object.getOwnPropertyNames(e),l=Object.getOwnPropertySymbols(e);o=[...c,...l].reduce((a,p)=>{let S=e[p];return (!b(p)&&!Object.getOwnPropertyNames(t).includes(p)||b(p)&&!Object.getOwnPropertySymbols(t).includes(p))&&O(a,p,S,e),a},{});}let s=Object.getOwnPropertyNames(t),n=Object.getOwnPropertySymbols(t);return [...s,...n].reduce((c,l)=>{let a=t[l],p=x(e)?e[l]:void 0;p!==void 0&&x(a)&&(a=v(p,a));let S=a;return O(c,l,S,t),c},o)}function E(e,...t){return t.reduce((r,o)=>v(r,o),e)}var A={libCacheDir:".node-red-dx",srcDir:"src",nodesDirName:"nodes",nodes:{controllerName:"index",editor:{dirName:"editor",htmlName:"index",tsName:"index"}},builder:{outputDir:"dist"},watcher:{nodeRed:{enabled:!0,path:"~/.node-red",url:"http://localhost:1880"}}};var le="node-red-dx",ae=e=>e.replace("@","").replace("/","-");function ce(){let e=cosmiconfigSync(le);try{let t=e.search();return E(A,t?t.config:{})}catch(t){throw console.error("Error while loading configuration",t),t}}var f=ce(),g=process.cwd(),L=JSON.parse(readFileSync(`${g}/package.json`,"utf-8")),w=`${g}/${f.srcDir}`,me=`${g}/resources`,$=`${w}/${f.nodesDirName}`,F=`${g}/${f.libCacheDir}`;function pe(){return globSync(`${$}/*`,{withFileTypes:!0}).map(t=>{let r=t.fullpath(),o=`${r}/${f.nodes.editor.dirName}`,s=r.replace(g,"").slice(1),n=`${s}/${f.nodes.editor.dirName}`,m=globSync(`${o}/**/*.scss`),c=globSync(`${r}/doc.mdx`),l=globSync(`${r}/doc.md`),a=dash(t.name);return {fullEditorPath:o,fullPath:r,name:t.name,pascalName:pascal(t.name),dashName:a,relativeEditorPath:n,relativePath:s,nodeIdentifier:`${d.packageNameSlug}-${a}`,fullControllerPath:`${r}/${f.nodes.controllerName}.ts`,editor:{tsPath:`${o}/${f.nodes.editor.tsName}.ts`,htmlPath:`${o}/${f.nodes.editor.htmlName}.html`,scssFiles:m},doc:{mdxFiles:c,mdFiles:l}}})}function D(){return {currentDir:g,pathSrcDir:w,pathSrcNodesDir:$,additionalResourcesDir:me,pathDist:`${g}/${f.builder.outputDir}`,cacheDirFiles:{controllerIndex:`${F}/controller-index.ts`,editorIndex:`${F}/editor-index.ts`},pathLibCacheDir:F,packageName:L.name,packageNameSlug:ae(L.name),config:f,getResolvedSrcPathsScss:()=>globSync(`${w}/**/*.scss`,{ignore:`${$}/**/*.scss`}),getResolvedNodesPaths:()=>globSync(`${$}/*`),getListNodesFull:()=>pe()}}var d=D();function R(e=!1){return i(this,null,function*(){return H.build({entryPoints:[d.cacheDirFiles.controllerIndex],outfile:`${d.pathDist}/index.js`,bundle:!0,minify:e,minifyWhitespace:e,minifyIdentifiers:e,minifySyntax:e,platform:"node",format:"cjs",target:"es2018",loader:{".ts":"ts"},packages:"external"})})}function T(e=!1){return i(this,null,function*(){let t=yield H.build({entryPoints:[d.cacheDirFiles.editorIndex],bundle:!0,platform:"browser",format:"iife",target:"es6",sourcemap:!1,minify:e,minifyWhitespace:e,minifySyntax:e,minifyIdentifiers:e,legalComments:"none",inject:[M.resolve(__dirname,"..","./editor/global-solid.ts")],write:!1,loader:{".ts":"ts"}});return t.outputFiles&&t.outputFiles.length>0?t.outputFiles[0].text:""})}function k(){let e=d.getListNodesFull(),t=[];for(let r of e)if(r.doc.mdFiles[0]){let s=W.readFileSync(r.doc.mdFiles[0],"utf-8"),n=`
2
- <script type="text/markdown" data-help-name="${r.name}">
3
- ${s}
4
- </script>
5
- `;t.push(n);}return t.length?t.join(`
6
- `):""}function _(e){return e.trim().replace(/\n\s+/g,"")}function G(e){return i(this,null,function*(){for(let t of e)try{let r=M.resolve(t),o=yield C.stat(r).catch(()=>null);o!=null&&o.isDirectory()?(yield C.rm(r,{recursive:!0,force:!0}),console.log(`Successfully cleaned: ${r}`)):console.log(`Path does not exist or is not a directory: ${r}`);}catch(r){console.error(`Error cleaning path (${t}): ${r}`);}})}function B(e){let t=M.resolve(e);W.existsSync(t)||W.mkdirSync(t,{recursive:!0});}function h(e,t){return i(this,null,function*(){try{yield C.writeFile(e,t);}catch(r){console.error("Error writing controller index:",r);}})}function xe(e){return i(this,null,function*(){return minify(e,{collapseWhitespace:!0,removeComments:!0,removeRedundantAttributes:!1,useShortDoctype:!0,removeEmptyAttributes:!1,minifyCSS:!1,minifyJS:!1})})}function ye(e,t){return `
7
- <script type="text/html" data-template-name="${e}">
8
- ${t}
9
- </script>
10
- `}function he(e,t,r=!1){return i(this,null,function*(){let o=readFileSync(e.editor.htmlPath,"utf8"),s=`
11
- <div class="${t}">
12
- <div class="${e.nodeIdentifier}">${o}</div>
13
- </div>
14
- `,n=r?yield xe(s):s,m=ye(e.name,n);return {nodeName:e.name,nodeIdentifier:e.nodeIdentifier,html:n,wrappedHtml:m}})}function J(e){return i(this,null,function*(){let{nodes:t,minify:r=!1}=e,o=yield Promise.all(t.map(n=>he(n,e.packageNameSlug,r)));return {html:o.map(n=>n.html).join("").trim(),allWrappedHtml:o.map(n=>r?_(n.wrappedHtml):n.wrappedHtml).join("").trim()}})}function De(e,t){return i(this,null,function*(){return (yield V([$e({content:[{raw:t,extension:"html"}]}),Se,Pe({preset:"default"})]).process(e,{from:void 0})).css})}function Ce(e){return U.compile(e,{style:"expanded"}).css}function q(e){let t={};for(let r=0;r<e.length;r++){let o=e[r];t[o]=Ce(o);}return t}function je(e){return e.some(r=>r.editor.scssFiles.length)?e.filter(r=>r.editor.scssFiles.length).map(r=>{let o=q(r.editor.scssFiles),s=Object.values(o).join("");return {name:r.name,mergedCompiledStyles:s,scssFinal:`
15
- #${r.nodeIdentifier}{
16
- ${s}
17
- }`}}):[]}function Ie(r){return i(this,arguments,function*(e,t={}){let s=P(P({},{content:[{raw:e}],theme:{}}),t),n=globSync(`${M.resolve(__dirname,"..")}/${d.config.nodes.editor.dirName}/assets/tailwind.scss`)[0],m=n.length?W.readFileSync(n,"utf8"):"";return (yield V([we(s),re("autoprefixer")]).process(m,{from:void 0})).css})}function Oe(){let e=d.getResolvedSrcPathsScss(),t=q([...e]);return Object.values(t).join("")}function z(e){return i(this,null,function*(){let{rawHtml:t,minify:r=!1,nodes:o}=e||{},s=Oe(),n=je(o),m=yield Ie(t),c=p=>`.${d.packageNameSlug}{${p}}`,l=n.map(p=>p.scssFinal).join(`
18
- `),a=c(`${m}${s}${l}`);return r?De(a,t):a})}function K(e){return i(this,null,function*(){let{minify:t=!1}=e||{},r=yield J({minify:t,nodes:e.nodes,packageNameSlug:d.packageNameSlug}),o=yield T(t),s=yield z({rawHtml:r.html,minify:t,nodes:e.nodes}),n=k(),m=`<script type="application/javascript">${o.trim()}</script>`,c=`<style>${s}</style>`;return `
19
- ${r.allWrappedHtml}
20
- ${c}
21
- ${m}
22
- ${n}`.trim()})}var Q=`
23
- // generated by @keload/node-red-dev-xp
24
- // do not modify this file
25
- // do not commit this file
26
- `;function X(e){return i(this,null,function*(){return `
27
- ${Q}
1
+ import k,{readFileSync}from'node:fs';import B from'node:path';import {cosmiconfigSync}from'cosmiconfig';import {globSync}from'glob';import {dash,pascal}from'radash';import E from'node:fs/promises';import dt from'esbuild';import {minify}from'html-minifier-terser';import Nt from'@fullhuman/postcss-purgecss';import $t from'autoprefixer';import St from'cssnano';import V from'postcss';import*as U from'sass';import Ct from'tailwindcss';var Q=Object.defineProperty;var v=Object.getOwnPropertySymbols;var X=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable;var D=(e,t,r)=>t in e?Q(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,u=(e,t)=>{for(var r in t||(t={}))X.call(t,r)&&D(e,r,t[r]);if(v)for(var r of v(t))Y.call(t,r)&&D(e,r,t[r]);return e};var Z=(e=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(e,{get:(t,r)=>(typeof require!="undefined"?require:t)[r]}):e)(function(e){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var g=(e,t,r)=>D(e,typeof t!="symbol"?t+"":t,r);var a=(e,t,r)=>new Promise((o,i)=>{var n=l=>{try{c(r.next(l));}catch(m){i(m);}},d=l=>{try{c(r.throw(l));}catch(m){i(m);}},c=l=>l.done?o(l.value):Promise.resolve(l.value).then(n,d);c((r=r.apply(e,t)).next());});function N(e){return Object.prototype.toString.call(e).slice(8,-1)}function x(e){if(N(e)!=="Object")return !1;let t=Object.getPrototypeOf(e);return !!t&&t.constructor===Object&&t===Object.prototype}function $(e){return N(e)==="Symbol"}function I(e,t,r,o){let i={}.propertyIsEnumerable.call(o,t)?"enumerable":"nonenumerable";i==="enumerable"&&(e[t]=r),i==="nonenumerable"&&Object.defineProperty(e,t,{value:r,enumerable:!1,writable:!0,configurable:!0});}function A(e,t,r){if(!x(t))return t;let o={};if(x(e)){let c=Object.getOwnPropertyNames(e),l=Object.getOwnPropertySymbols(e);o=[...c,...l].reduce((m,p)=>{let w=e[p];return (!$(p)&&!Object.getOwnPropertyNames(t).includes(p)||$(p)&&!Object.getOwnPropertySymbols(t).includes(p))&&I(m,p,w,e),m},{});}let i=Object.getOwnPropertyNames(t),n=Object.getOwnPropertySymbols(t);return [...i,...n].reduce((c,l)=>{let m=t[l],p=x(e)?e[l]:void 0;p!==void 0&&x(m)&&(m=A(p,m));let w=m;return I(c,l,w,t),c},o)}function H(e,...t){return t.reduce((r,o)=>A(r,o),e)}var T={libCacheDir:".node-red-dx",srcDir:"src",nodesDirName:"nodes",nodes:{controllerName:"index",editor:{dirName:"editor",htmlName:"index",tsName:"index"}},builder:{outputDir:"dist"},watcher:{nodeRed:{enabled:!0,path:"~/.node-red",url:"http://localhost:1880"}}};var it="node-red-dx",nt=e=>e.replace("@","").replace("/","-");function at(){let e=cosmiconfigSync(it);try{let t=e.search();return H(T,t?t.config:{})}catch(t){throw console.error("Error while loading configuration",t),t}}var f=at(),y=process.cwd(),L=JSON.parse(readFileSync(`${y}/package.json`,"utf-8")),O=`${y}/${f.srcDir}`,lt=`${y}/resources`,S=`${O}/${f.nodesDirName}`,j=`${y}/${f.libCacheDir}`,mt=`${B.resolve(__dirname,"..")}`,R=nt(L.name);function ct(){return globSync(`${S}/*`,{withFileTypes:!0}).map(t=>{let r=t.fullpath(),o=`${r}/${f.nodes.editor.dirName}`,i=r.replace(y,"").slice(1),n=`${i}/${f.nodes.editor.dirName}`,d=globSync(`${o}/**/*.scss`),c=globSync(`${r}/doc.mdx`),l=globSync(`${r}/doc.md`),m=dash(t.name);return {fullEditorPath:o,fullPath:r,name:t.name,pascalName:pascal(t.name),dashName:m,relativeEditorPath:n,relativePath:i,nodeIdentifier:`${R}-${m}`,fullControllerPath:`${r}/${f.nodes.controllerName}.ts`,editor:{tsPath:`${o}/${f.nodes.editor.tsName}.ts`,htmlPath:`${o}/${f.nodes.editor.htmlName}.html`,scssFiles:d},doc:{mdxFiles:c,mdFiles:l}}})}function pt(){return {currentDir:y,pathSrcDir:O,pathSrcNodesDir:S,additionalResourcesDir:lt,pathDist:`${y}/${f.builder.outputDir}`,currentPackagedDistPath:mt,cacheDirFiles:{controllerIndex:`${j}/controller-index.ts`,editorIndex:`${j}/editor-index.ts`},pathLibCacheDir:j,packageName:L.name,packageNameSlug:R,config:f,resolvedSrcPathsScss:globSync(`${O}/**/*.scss`,{ignore:`${S}/**/*.scss`}),resolvedNodesPaths:globSync(`${S}/*`),listNodesFull:ct()}}var s=pt();var W=`${B.resolve(__dirname,"..")}`;function M(e){k.existsSync(e)||k.mkdirSync(e,{recursive:!0});}function h(e,t){return a(this,null,function*(){try{yield E.writeFile(e,t);}catch(r){console.error("Error writing controller index:",r);}})}function _(e){return a(this,null,function*(){for(let t of e)try{let r=B.resolve(t),o=yield E.stat(r).catch(()=>null);o!=null&&o.isDirectory()&&(yield E.rm(r,{recursive:!0,force:!0}));}catch(r){console.error(`Error cleaning path (${t}): ${r}`);}})}var P=class{constructor(t){g(this,"params");this.params=u({minify:!1},t);}getControllerIndexContent(){return a(this,null,function*(){return `
28
2
  import type { NodeAPI } from 'node-red';
29
- ${e.map(t=>`import ${t.pascalName} from '${t.fullControllerPath}';`).join(`
3
+ ${s.listNodesFull.map(t=>`import ${t.pascalName} from '${t.fullControllerPath}';`).join(`
30
4
  `)}
31
5
 
32
6
 
33
7
  export default async (RED: NodeAPI): Promise<void> => {
34
8
  global.RED = RED;
35
9
 
36
- ${e.map(t=>`// @ts-ignore
10
+ ${s.listNodesFull.map(t=>`// @ts-ignore
37
11
  global.RED.nodes.registerType('${t.name}', ${t.pascalName});`).join(`
38
12
  `)}
39
13
  };
40
- `.trim()})}function Y(e){return i(this,null,function*(){return `
41
- ${Q}
14
+ `.trim()})}buildScript(){return dt.build({entryPoints:[s.cacheDirFiles.controllerIndex],outfile:`${s.pathDist}/index.js`,bundle:!0,minify:this.params.minify,minifyWhitespace:this.params.minify,minifyIdentifiers:this.params.minify,minifySyntax:this.params.minify,platform:"node",format:"cjs",target:"es2018",loader:{".ts":"ts"},packages:"external"})}getControllerTask(){return a(this,null,function*(){return this.getControllerIndexContent().then(t=>{h(`${s.cacheDirFiles.controllerIndex}`,t).then(()=>{this.buildScript();});})})}};var C=class{getAllDocContent(){let t=[];for(let r of s.listNodesFull)if(r.doc.mdFiles[0]){let i=k.readFileSync(r.doc.mdFiles[0],"utf-8"),n=`
15
+ <script type="text/markdown" data-help-name="${r.name}">
16
+ ${i}
17
+ </script>
18
+ `;t.push(n);}return t.length?t.join(`
19
+ `):""}};function G(e){return e.trim().replace(/\n\s+/g,"")}function yt(e){return a(this,null,function*(){return minify(e,{collapseWhitespace:!0,removeComments:!0,removeRedundantAttributes:!1,useShortDoctype:!0,removeEmptyAttributes:!1,minifyCSS:!1,minifyJS:!1})})}function ht(e,t){return `
20
+ <script type="text/html" data-template-name="${e}">
21
+ ${t}
22
+ </script>
23
+ `}function xt(e,t,r=!1){return a(this,null,function*(){let o=readFileSync(e.editor.htmlPath,"utf8"),i=`
24
+ <div class="${t}">
25
+ <div class="${e.nodeIdentifier}">${o}</div>
26
+ </div>
27
+ `,n=r?yield yt(i):i,d=ht(e.name,n);return {nodeName:e.name,nodeIdentifier:e.nodeIdentifier,html:n,wrappedHtml:d}})}function J(e){return a(this,null,function*(){let{nodes:t,minify:r=!1}=e,o=yield Promise.all(t.map(n=>xt(n,e.packageNameSlug,r)));return {html:o.map(n=>n.html).join("").trim(),allWrappedHtml:o.map(n=>r?G(n.wrappedHtml):n.wrappedHtml).join("").trim()}})}function Ft(e,t){return a(this,null,function*(){return (yield V([Nt({content:[{raw:t,extension:"html"}]}),$t,St({preset:"default"})]).process(e,{from:void 0})).css})}function wt(e){return U.compile(e,{style:"expanded"}).css}function q(e){let t={};for(let r=0;r<e.length;r++){let o=e[r];t[o]=wt(o);}return t}function Dt(e){return e.some(r=>r.editor.scssFiles.length)?e.filter(r=>r.editor.scssFiles.length).map(r=>{let o=q(r.editor.scssFiles),i=Object.values(o).join("");return {name:r.name,mergedCompiledStyles:i,scssFinal:`
28
+ #${r.nodeIdentifier}{
29
+ ${i}
30
+ }`}}):[]}function jt(r){return a(this,arguments,function*(e,t={}){let i=u(u({},{content:[{raw:e}],theme:{}}),t),n=globSync(`${W}/${s.config.nodes.editor.dirName}/assets/tailwind.scss`)[0],d=n.length?k.readFileSync(n,"utf8"):"";return (yield V([Ct(i),Z("autoprefixer")]).process(d,{from:void 0})).css})}function Ot(){let e=s.resolvedSrcPathsScss,t=q([...e]);return Object.values(t).join("")}function z(e){return a(this,null,function*(){let{rawHtml:t,minify:r=!1,nodes:o}=e||{},i=Ot(),n=Dt(o),d=yield jt(t),c=p=>`.${s.packageNameSlug}{${p}}`,l=n.map(p=>p.scssFinal).join(`
31
+ `),m=c(`${d}${i}${l}`);return r?Ft(m,t):m})}var F=class{constructor(t){g(this,"params");this.params=u({minify:!1},t);}getEditorIndexContent(){return a(this,null,function*(){return `
42
32
  import type { NodeAPI } from 'node-red';
43
- ${e.map(t=>`import ${t.pascalName} from '${t.editor.tsPath}';`).join(`
33
+ ${s.listNodesFull.map(t=>`import ${t.pascalName} from '${t.editor.tsPath}';`).join(`
44
34
  `)}
45
35
 
46
36
  declare const RED: NodeAPI;
47
37
 
48
- ${e.map(t=>`// @ts-ignore
38
+ ${s.listNodesFull.map(t=>`// @ts-ignore
49
39
  window.RED.nodes.registerType('${t.name}', ${t.pascalName});`).join(`
50
40
  `)}
51
- `.trim()})}var u=D();function Wt(e){return i(this,null,function*(){let{minify:t=!1}=e||{},r=u.getListNodesFull();B(u.pathLibCacheDir),yield G([u.pathDist]);let o=X(r).then(n=>{h(`${u.cacheDirFiles.controllerIndex}`,n).then(()=>{R(t);});}),s=Y(r).then(n=>{h(`${u.cacheDirFiles.editorIndex}`,n).then(()=>{K({minify:t,nodes:r}).then(m=>i(this,null,function*(){yield h(`${u.pathDist}/index.html`,m);}));});});yield Promise.all([o,s,h(`${u.pathLibCacheDir}/config.json`,JSON.stringify(u.config,null,2))]);})}export{Wt as buildAllPackage,K as buildFinalDistIndexContent,u as currentInstance,Ie as generateCSSFromHTMLWithTailwind,z as getAllCompiledStyles,X as getControllerIndexContent,Y as getEditorIndexContent,J as getNodesHtml,je as getNodesStyles,Oe as getSrcStyles,k as handleAllDoc,xe as minifyHtml};
41
+ `.trim()})}getBuiltScript(){return a(this,null,function*(){let t=yield dt.build({entryPoints:[s.cacheDirFiles.editorIndex],bundle:!0,platform:"browser",format:"iife",target:"es6",sourcemap:!1,minify:this.params.minify,minifyWhitespace:this.params.minify,minifySyntax:this.params.minify,minifyIdentifiers:this.params.minify,legalComments:"none",inject:[`${s.currentPackagedDistPath}/editor/global-solid.ts`],write:!1,loader:{".ts":"ts"}});return t.outputFiles&&t.outputFiles.length>0?t.outputFiles[0].text:""})}prepareEditorIndex(){return a(this,null,function*(){let t=yield this.getBuiltScript(),r=yield J({minify:this.params.minify,nodes:s.listNodesFull,packageNameSlug:s.packageNameSlug}),o=yield z({rawHtml:r.html,minify:this.params.minify,nodes:s.listNodesFull}),n=new C().getAllDocContent(),d=`<script type="application/javascript">${t.trim()}</script>`,c=`<style>${o}</style>`;return `
42
+ ${r.allWrappedHtml}
43
+ ${c}
44
+ ${d}
45
+ ${n}`.trim()})}getEditorTask(){return a(this,null,function*(){return this.getEditorIndexContent().then(t=>{h(`${s.cacheDirFiles.editorIndex}`,t).then(()=>{this.prepareEditorIndex().then(r=>a(this,null,function*(){yield h(`${s.pathDist}/${s.config.nodes.editor.htmlName}.html`,r);}));});})})}};var K=class{constructor(t){g(this,"params");g(this,"builderController");g(this,"builderEditor");this.params=u({minify:!1},t),this.builderController=new P({minify:this.params.minify}),this.builderEditor=new F({minify:this.params.minify});}prepare(){M(s.pathLibCacheDir);let t=[_([s.pathDist]),h(`${s.pathLibCacheDir}/config.json`,JSON.stringify(s.config,null,2))];return Promise.all(t)}buildAll(){return a(this,null,function*(){return yield this.prepare(),Promise.all([this.builderController.getControllerTask(),this.builderEditor.getEditorTask()])})}};export{K as Builder};
@@ -1,52 +1,46 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var le=require('process'),commander=require('commander'),consola=require('consola'),M=require('fs'),cosmiconfig=require('cosmiconfig'),glob=require('glob'),radash=require('radash'),q=require('path'),H=require('esbuild'),htmlMinifierTerser=require('html-minifier-terser'),F=require('fs/promises'),ve=require('@fullhuman/postcss-purgecss'),Oe=require('autoprefixer'),ke=require('cssnano'),U=require('postcss'),K=require('sass'),Ee=require('tailwindcss'),Ge=require('prettyjson'),Ve=require('browser-sync'),Ue=require('chokidar'),ne=require('nodemon');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var le__namespace=/*#__PURE__*/_interopNamespace(le);var M__default=/*#__PURE__*/_interopDefault(M);var q__default=/*#__PURE__*/_interopDefault(q);var H__default=/*#__PURE__*/_interopDefault(H);var F__default=/*#__PURE__*/_interopDefault(F);var ve__default=/*#__PURE__*/_interopDefault(ve);var Oe__default=/*#__PURE__*/_interopDefault(Oe);var ke__default=/*#__PURE__*/_interopDefault(ke);var U__default=/*#__PURE__*/_interopDefault(U);var K__namespace=/*#__PURE__*/_interopNamespace(K);var Ee__default=/*#__PURE__*/_interopDefault(Ee);var Ge__default=/*#__PURE__*/_interopDefault(Ge);var Ve__default=/*#__PURE__*/_interopDefault(Ve);var Ue__default=/*#__PURE__*/_interopDefault(Ue);var ne__default=/*#__PURE__*/_interopDefault(ne);var me=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var O={name:"@keload/node-red-dxp",version:"1.3.1",description:"",type:"module",scripts:{build:"tsup",watch:"tsup --watch",format:"pnpm biome format",lint:"pnpm biome lint","lint:check":"pnpm biome check",release:"pnpm release-it","release:test":"pnpm release-it --dry-run","docs:dev":"vitepress dev docs","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs"},publishConfig:{access:"public"},bin:{"node-red-dxp":"./dist/cli/index.cjs"},exports:{".":{import:"./dist/index.js",require:"./dist/index.cjs"},"./builder":{import:"./dist/builder/index.js",require:"./dist/builder/index.cjs"},"./editor":{import:"./dist/editor/index.js",require:"./dist/editor/index.cjs"},"./package.json":"./package.json"},keywords:[],author:"Cl\xE9ment BERARD <contact@berard.dev>",license:"MIT",repository:{type:"git",url:"https://github.com/clement-berard/node-red-dxp.git"},bugs:{url:"https://github.com/clement-berard/node-red-dxp/issues"},homepage:"https://github.com/clement-berard/node-red-dxp",devDependencies:{"@biomejs/biome":"1.9.4","@release-it/conventional-changelog":"9.0.3","release-it":"17.10.0",tsup:"8.3.5",tsx:"4.19.2",typescript:"5.6.3",vitepress:"1.5.0"},dependencies:{"@fullhuman/postcss-purgecss":"^6.0.0","@types/html-minifier-terser":"7.0.2","@types/jquery":"3.5.32","@types/jqueryui":"1.12.23","@types/node-red":"1.3.5","@types/prettyjson":"0.0.33",autoprefixer:"^10.4.20","browser-sync":"3.0.3",chokidar:"4.0.1",commander:"12.1.0",consola:"3.2.3",cosmiconfig:"9.0.0",cssnano:"^7.0.6",esbuild:"0.24.0",glob:"11.0.0",handlebars:"4.7.8","html-minifier-terser":"7.2.0","merge-anything":"6.0.2",nodemon:"3.1.7",postcss:"^8.4.49",prettyjson:"1.2.5",radash:"12.1.0",sass:"1.81.0","solid-js":"1.9.3",tailwindcss:"^3.4.15"},files:["dist"]};function w(e){return Object.prototype.toString.call(e).slice(8,-1)}function h(e){if(w(e)!=="Object")return !1;let t=Object.getPrototypeOf(e);return !!t&&t.constructor===Object&&t===Object.prototype}function S(e){return w(e)==="Symbol"}function k(e,t,r,o){let n={}.propertyIsEnumerable.call(o,t)?"enumerable":"nonenumerable";n==="enumerable"&&(e[t]=r),n==="nonenumerable"&&Object.defineProperty(e,t,{value:r,enumerable:!1,writable:!0,configurable:!0});}function A(e,t,r){if(!h(t))return t;let o={};if(h(e)){let d=Object.getOwnPropertyNames(e),p=Object.getOwnPropertySymbols(e);o=[...d,...p].reduce((c,l)=>{let C=e[l];return (!S(l)&&!Object.getOwnPropertyNames(t).includes(l)||S(l)&&!Object.getOwnPropertySymbols(t).includes(l))&&k(c,l,C,e),c},{});}let n=Object.getOwnPropertyNames(t),s=Object.getOwnPropertySymbols(t);return [...n,...s].reduce((d,p)=>{let c=t[p],l=h(e)?e[p]:void 0;l!==void 0&&h(c)&&(c=A(l,c));let C=c;return k(d,p,C,t),d},o)}function E(e,...t){return t.reduce((r,o)=>A(r,o),e)}var R={libCacheDir:".node-red-dx",srcDir:"src",nodesDirName:"nodes",nodes:{controllerName:"index",editor:{dirName:"editor",htmlName:"index",tsName:"index"}},builder:{outputDir:"dist"},watcher:{nodeRed:{enabled:!0,path:"~/.node-red",url:"http://localhost:1880"}}};var he="node-red-dx",ye=e=>e.replace("@","").replace("/","-");function xe(){let e=cosmiconfig.cosmiconfigSync(he);try{let t=e.search();return E(R,t?t.config:{})}catch(t){throw console.error("Error while loading configuration",t),t}}var f=xe(),u=process.cwd(),L=JSON.parse(M.readFileSync(`${u}/package.json`,"utf-8")),j=`${u}/${f.srcDir}`,be=`${u}/resources`,$=`${j}/${f.nodesDirName}`,P=`${u}/${f.libCacheDir}`;function Ne(){return glob.globSync(`${$}/*`,{withFileTypes:!0}).map(t=>{let r=t.fullpath(),o=`${r}/${f.nodes.editor.dirName}`,n=r.replace(u,"").slice(1),s=`${n}/${f.nodes.editor.dirName}`,m=glob.globSync(`${o}/**/*.scss`),d=glob.globSync(`${r}/doc.mdx`),p=glob.globSync(`${r}/doc.md`),c=radash.dash(t.name);return {fullEditorPath:o,fullPath:r,name:t.name,pascalName:radash.pascal(t.name),dashName:c,relativeEditorPath:s,relativePath:n,nodeIdentifier:`${i.packageNameSlug}-${c}`,fullControllerPath:`${r}/${f.nodes.controllerName}.ts`,editor:{tsPath:`${o}/${f.nodes.editor.tsName}.ts`,htmlPath:`${o}/${f.nodes.editor.htmlName}.html`,scssFiles:m},doc:{mdxFiles:d,mdFiles:p}}})}function I(){return {currentDir:u,pathSrcDir:j,pathSrcNodesDir:$,additionalResourcesDir:be,pathDist:`${u}/${f.builder.outputDir}`,cacheDirFiles:{controllerIndex:`${P}/controller-index.ts`,editorIndex:`${P}/editor-index.ts`},pathLibCacheDir:P,packageName:L.name,packageNameSlug:ye(L.name),config:f,getResolvedSrcPathsScss:()=>glob.globSync(`${j}/**/*.scss`,{ignore:`${$}/**/*.scss`}),getResolvedNodesPaths:()=>glob.globSync(`${$}/*`),getListNodesFull:()=>Ne()}}var i=I();async function W(e=!1){return H__default.default.build({entryPoints:[i.cacheDirFiles.controllerIndex],outfile:`${i.pathDist}/index.js`,bundle:!0,minify:e,minifyWhitespace:e,minifyIdentifiers:e,minifySyntax:e,platform:"node",format:"cjs",target:"es2018",loader:{".ts":"ts"},packages:"external"})}async function T(e=!1){let t=await H__default.default.build({entryPoints:[i.cacheDirFiles.editorIndex],bundle:!0,platform:"browser",format:"iife",target:"es6",sourcemap:!1,minify:e,minifyWhitespace:e,minifySyntax:e,minifyIdentifiers:e,legalComments:"none",inject:[q__default.default.resolve(__dirname,"..","./editor/global-solid.ts")],write:!1,loader:{".ts":"ts"}});return t.outputFiles&&t.outputFiles.length>0?t.outputFiles[0].text:""}function B(){let e=i.getListNodesFull(),t=[];for(let r of e)if(r.doc.mdFiles[0]){let n=M__default.default.readFileSync(r.doc.mdFiles[0],"utf-8"),s=`
3
- <script type="text/markdown" data-help-name="${r.name}">
4
- ${n}
5
- </script>
6
- `;t.push(s);}return t.length?t.join(`
7
- `):""}function G(e){return e.trim().replace(/\n\s+/g,"")}async function J(e){for(let t of e)try{let r=q__default.default.resolve(t),o=await F__default.default.stat(r).catch(()=>null);o!=null&&o.isDirectory()?(await F__default.default.rm(r,{recursive:!0,force:!0}),console.log(`Successfully cleaned: ${r}`)):console.log(`Path does not exist or is not a directory: ${r}`);}catch(r){console.error(`Error cleaning path (${t}): ${r}`);}}function _(e){let t=q__default.default.resolve(e);M__default.default.existsSync(t)||M__default.default.mkdirSync(t,{recursive:!0});}async function b(e,t){try{await F__default.default.writeFile(e,t);}catch(r){console.error("Error writing controller index:",r);}}async function Pe(e){return htmlMinifierTerser.minify(e,{collapseWhitespace:!0,removeComments:!0,removeRedundantAttributes:!1,useShortDoctype:!0,removeEmptyAttributes:!1,minifyCSS:!1,minifyJS:!1})}function je(e,t){return `
8
- <script type="text/html" data-template-name="${e}">
9
- ${t}
10
- </script>
11
- `}async function Ie(e,t,r=!1){let o=M.readFileSync(e.editor.htmlPath,"utf8"),n=`
12
- <div class="${t}">
13
- <div class="${e.nodeIdentifier}">${o}</div>
14
- </div>
15
- `,s=r?await Pe(n):n,m=je(e.name,s);return {nodeName:e.name,nodeIdentifier:e.nodeIdentifier,html:s,wrappedHtml:m}}async function V(e){let{nodes:t,minify:r=!1}=e,o=await Promise.all(t.map(s=>Ie(s,e.packageNameSlug,r)));return {html:o.map(s=>s.html).join("").trim(),allWrappedHtml:o.map(s=>r?G(s.wrappedHtml):s.wrappedHtml).join("").trim()}}async function Re(e,t){return (await U__default.default([ve__default.default({content:[{raw:t,extension:"html"}]}),Oe__default.default,ke__default.default({preset:"default"})]).process(e,{from:void 0})).css}function Le(e){return K__namespace.compile(e,{style:"expanded"}).css}function z(e){let t={};for(let r=0;r<e.length;r++){let o=e[r];t[o]=Le(o);}return t}function He(e){return e.some(r=>r.editor.scssFiles.length)?e.filter(r=>r.editor.scssFiles.length).map(r=>{let o=z(r.editor.scssFiles),n=Object.values(o).join("");return {name:r.name,mergedCompiledStyles:n,scssFinal:`
16
- #${r.nodeIdentifier}{
17
- ${n}
18
- }`}}):[]}async function We(e,t={}){let o={...{content:[{raw:e}],theme:{}},...t},n=glob.globSync(`${q__default.default.resolve(__dirname,"..")}/${i.config.nodes.editor.dirName}/assets/tailwind.scss`)[0],s=n.length?M__default.default.readFileSync(n,"utf8"):"";return (await U__default.default([Ee__default.default(o),me("autoprefixer")]).process(s,{from:void 0})).css}function Te(){let e=i.getResolvedSrcPathsScss(),t=z([...e]);return Object.values(t).join("")}async function Q(e){let{rawHtml:t,minify:r=!1,nodes:o}=e||{},n=Te(),s=He(o),m=await We(t),d=l=>`.${i.packageNameSlug}{${l}}`,p=s.map(l=>l.scssFinal).join(`
19
- `),c=d(`${m}${n}${p}`);return r?Re(c,t):c}async function X(e){let{minify:t=!1}=e||{},r=await V({minify:t,nodes:e.nodes,packageNameSlug:i.packageNameSlug}),o=await T(t),n=await Q({rawHtml:r.html,minify:t,nodes:e.nodes}),s=B(),m=`<script type="application/javascript">${o.trim()}</script>`,d=`<style>${n}</style>`;return `
20
- ${r.allWrappedHtml}
21
- ${d}
22
- ${m}
23
- ${s}`.trim()}var Y=`
24
- // generated by @keload/node-red-dev-xp
25
- // do not modify this file
26
- // do not commit this file
27
- `;async function Z(e){return `
28
- ${Y}
2
+ 'use strict';var perf_hooks=require('perf_hooks'),ne=require('process'),commander=require('commander'),consola=require('consola'),M=require('fs'),q=require('path'),cosmiconfig=require('cosmiconfig'),glob=require('glob'),radash=require('radash'),O=require('fs/promises'),we=require('esbuild'),htmlMinifierTerser=require('html-minifier-terser'),Ie=require('@fullhuman/postcss-purgecss'),Oe=require('autoprefixer'),ke=require('cssnano'),U=require('postcss'),z=require('sass'),He=require('tailwindcss'),_e=require('prettyjson'),ze=require('handlebars'),et=require('browser-sync'),tt=require('chokidar'),te=require('nodemon');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var ne__namespace=/*#__PURE__*/_interopNamespace(ne);var M__default=/*#__PURE__*/_interopDefault(M);var q__default=/*#__PURE__*/_interopDefault(q);var O__default=/*#__PURE__*/_interopDefault(O);var we__default=/*#__PURE__*/_interopDefault(we);var Ie__default=/*#__PURE__*/_interopDefault(Ie);var Oe__default=/*#__PURE__*/_interopDefault(Oe);var ke__default=/*#__PURE__*/_interopDefault(ke);var U__default=/*#__PURE__*/_interopDefault(U);var z__namespace=/*#__PURE__*/_interopNamespace(z);var He__default=/*#__PURE__*/_interopDefault(He);var _e__default=/*#__PURE__*/_interopDefault(_e);var ze__default=/*#__PURE__*/_interopDefault(ze);var et__default=/*#__PURE__*/_interopDefault(et);var tt__default=/*#__PURE__*/_interopDefault(tt);var te__default=/*#__PURE__*/_interopDefault(te);var ae=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var A={name:"@keload/node-red-dxp",version:"1.3.2",description:"",type:"module",scripts:{build:"tsup",watch:"tsup --watch",format:"pnpm biome format",lint:"pnpm biome lint","lint:check":"pnpm biome check",release:"pnpm release-it","release:test":"pnpm release-it --dry-run","docs:dev":"vitepress dev docs","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs"},publishConfig:{access:"public"},bin:{"node-red-dxp":"./dist/cli/index.cjs"},exports:{".":{import:"./dist/index.js",require:"./dist/index.cjs"},"./builder":{import:"./dist/builder/index.js",require:"./dist/builder/index.cjs"},"./editor":{import:"./dist/editor/index.js",require:"./dist/editor/index.cjs"},"./package.json":"./package.json"},keywords:[],author:"Cl\xE9ment BERARD <contact@berard.dev>",license:"MIT",repository:{type:"git",url:"https://github.com/clement-berard/node-red-dxp.git"},bugs:{url:"https://github.com/clement-berard/node-red-dxp/issues"},homepage:"https://github.com/clement-berard/node-red-dxp",devDependencies:{"@biomejs/biome":"1.9.4","@release-it/conventional-changelog":"9.0.3","@types/handlebars":"4.1.0","release-it":"17.10.0",tsup:"8.3.5",tsx:"4.19.2",typescript:"5.6.3",vitepress:"1.5.0"},dependencies:{"@fullhuman/postcss-purgecss":"^6.0.0","@types/html-minifier-terser":"7.0.2","@types/jquery":"3.5.32","@types/jqueryui":"1.12.23","@types/node-red":"1.3.5","@types/prettyjson":"0.0.33",autoprefixer:"^10.4.20","browser-sync":"3.0.3",chokidar:"4.0.1",commander:"12.1.0",consola:"3.2.3",cosmiconfig:"9.0.0",cssnano:"^7.0.6",esbuild:"0.24.0",glob:"11.0.0",handlebars:"4.7.8","html-minifier-terser":"7.2.0","merge-anything":"6.0.2",nodemon:"3.1.7",postcss:"^8.4.49",prettyjson:"1.2.5",radash:"12.1.0",sass:"1.81.0","solid-js":"1.9.3",tailwindcss:"^3.4.15"},files:["dist"]};function w(t){return Object.prototype.toString.call(t).slice(8,-1)}function g(t){if(w(t)!=="Object")return !1;let e=Object.getPrototypeOf(t);return !!e&&e.constructor===Object&&e===Object.prototype}function P(t){return w(t)==="Symbol"}function H(t,e,r,o){let n={}.propertyIsEnumerable.call(o,e)?"enumerable":"nonenumerable";n==="enumerable"&&(t[e]=r),n==="nonenumerable"&&Object.defineProperty(t,e,{value:r,enumerable:!1,writable:!0,configurable:!0});}function B(t,e,r){if(!g(e))return e;let o={};if(g(t)){let m=Object.getOwnPropertyNames(t),c=Object.getOwnPropertySymbols(t);o=[...m,...c].reduce((a,l)=>{let v=t[l];return (!P(l)&&!Object.getOwnPropertyNames(e).includes(l)||P(l)&&!Object.getOwnPropertySymbols(e).includes(l))&&H(a,l,v,t),a},{});}let n=Object.getOwnPropertyNames(e),i=Object.getOwnPropertySymbols(e);return [...n,...i].reduce((m,c)=>{let a=e[c],l=g(t)?t[c]:void 0;l!==void 0&&g(a)&&(a=B(l,a));let v=a;return H(m,c,v,e),m},o)}function R(t,...e){return e.reduce((r,o)=>B(r,o),t)}var T={libCacheDir:".node-red-dx",srcDir:"src",nodesDirName:"nodes",nodes:{controllerName:"index",editor:{dirName:"editor",htmlName:"index",tsName:"index"}},builder:{outputDir:"dist"},watcher:{nodeRed:{enabled:!0,path:"~/.node-red",url:"http://localhost:1880"}}};var ue="node-red-dx",he=t=>t.replace("@","").replace("/","-");function ge(){let t=cosmiconfig.cosmiconfigSync(ue);try{let e=t.search();return R(T,e?e.config:{})}catch(e){throw console.error("Error while loading configuration",e),e}}var d=ge(),u=process.cwd(),L=JSON.parse(M.readFileSync(`${u}/package.json`,"utf-8")),I=`${u}/${d.srcDir}`,ye=`${u}/resources`,$=`${I}/${d.nodesDirName}`,E=`${u}/${d.libCacheDir}`,xe=`${q__default.default.resolve(__dirname,"..")}`,W=he(L.name);function be(){return glob.globSync(`${$}/*`,{withFileTypes:!0}).map(e=>{let r=e.fullpath(),o=`${r}/${d.nodes.editor.dirName}`,n=r.replace(u,"").slice(1),i=`${n}/${d.nodes.editor.dirName}`,p=glob.globSync(`${o}/**/*.scss`),m=glob.globSync(`${r}/doc.mdx`),c=glob.globSync(`${r}/doc.md`),a=radash.dash(e.name);return {fullEditorPath:o,fullPath:r,name:e.name,pascalName:radash.pascal(e.name),dashName:a,relativeEditorPath:i,relativePath:n,nodeIdentifier:`${W}-${a}`,fullControllerPath:`${r}/${d.nodes.controllerName}.ts`,editor:{tsPath:`${o}/${d.nodes.editor.tsName}.ts`,htmlPath:`${o}/${d.nodes.editor.htmlName}.html`,scssFiles:p},doc:{mdxFiles:m,mdFiles:c}}})}function Ne(){return {currentDir:u,pathSrcDir:I,pathSrcNodesDir:$,additionalResourcesDir:ye,pathDist:`${u}/${d.builder.outputDir}`,currentPackagedDistPath:xe,cacheDirFiles:{controllerIndex:`${E}/controller-index.ts`,editorIndex:`${E}/editor-index.ts`},pathLibCacheDir:E,packageName:L.name,packageNameSlug:W,config:d,resolvedSrcPathsScss:glob.globSync(`${I}/**/*.scss`,{ignore:`${$}/**/*.scss`}),resolvedNodesPaths:glob.globSync(`${$}/*`),listNodesFull:be()}}var s=Ne();var G=`${q__default.default.resolve(__dirname,"..")}`;function C(t){M__default.default.existsSync(t)||M__default.default.mkdirSync(t,{recursive:!0});}async function f(t,e){try{await O__default.default.writeFile(t,e);}catch(r){console.error("Error writing controller index:",r);}}async function J(t){for(let e of t)try{let r=q__default.default.resolve(e),o=await O__default.default.stat(r).catch(()=>null);o!=null&&o.isDirectory()&&await O__default.default.rm(r,{recursive:!0,force:!0});}catch(r){console.error(`Error cleaning path (${e}): ${r}`);}}var S=class{params;constructor(e){this.params={minify:!1,...e};}async getControllerIndexContent(){return `
29
3
  import type { NodeAPI } from 'node-red';
30
- ${e.map(t=>`import ${t.pascalName} from '${t.fullControllerPath}';`).join(`
4
+ ${s.listNodesFull.map(e=>`import ${e.pascalName} from '${e.fullControllerPath}';`).join(`
31
5
  `)}
32
6
 
33
7
 
34
8
  export default async (RED: NodeAPI): Promise<void> => {
35
9
  global.RED = RED;
36
10
 
37
- ${e.map(t=>`// @ts-ignore
38
- global.RED.nodes.registerType('${t.name}', ${t.pascalName});`).join(`
11
+ ${s.listNodesFull.map(e=>`// @ts-ignore
12
+ global.RED.nodes.registerType('${e.name}', ${e.pascalName});`).join(`
39
13
  `)}
40
14
  };
41
- `.trim()}async function ee(e){return `
42
- ${Y}
15
+ `.trim()}buildScript(){return we__default.default.build({entryPoints:[s.cacheDirFiles.controllerIndex],outfile:`${s.pathDist}/index.js`,bundle:!0,minify:this.params.minify,minifyWhitespace:this.params.minify,minifyIdentifiers:this.params.minify,minifySyntax:this.params.minify,platform:"node",format:"cjs",target:"es2018",loader:{".ts":"ts"},packages:"external"})}async getControllerTask(){return this.getControllerIndexContent().then(e=>{f(`${s.cacheDirFiles.controllerIndex}`,e).then(()=>{this.buildScript();});})}};var D=class{getAllDocContent(){let e=[];for(let r of s.listNodesFull)if(r.doc.mdFiles[0]){let n=M__default.default.readFileSync(r.doc.mdFiles[0],"utf-8"),i=`
16
+ <script type="text/markdown" data-help-name="${r.name}">
17
+ ${n}
18
+ </script>
19
+ `;e.push(i);}return e.length?e.join(`
20
+ `):""}};function _(t){return t.trim().replace(/\n\s+/g,"")}function V(t=""){return {name:t,dashName:radash.dash(t),pascalName:radash.pascal(t)}}async function Fe(t){return htmlMinifierTerser.minify(t,{collapseWhitespace:!0,removeComments:!0,removeRedundantAttributes:!1,useShortDoctype:!0,removeEmptyAttributes:!1,minifyCSS:!1,minifyJS:!1})}function je(t,e){return `
21
+ <script type="text/html" data-template-name="${t}">
22
+ ${e}
23
+ </script>
24
+ `}async function ve(t,e,r=!1){let o=M.readFileSync(t.editor.htmlPath,"utf8"),n=`
25
+ <div class="${e}">
26
+ <div class="${t.nodeIdentifier}">${o}</div>
27
+ </div>
28
+ `,i=r?await Fe(n):n,p=je(t.name,i);return {nodeName:t.name,nodeIdentifier:t.nodeIdentifier,html:i,wrappedHtml:p}}async function K(t){let{nodes:e,minify:r=!1}=t,o=await Promise.all(e.map(i=>ve(i,t.packageNameSlug,r)));return {html:o.map(i=>i.html).join("").trim(),allWrappedHtml:o.map(i=>r?_(i.wrappedHtml):i.wrappedHtml).join("").trim()}}async function Be(t,e){return (await U__default.default([Ie__default.default({content:[{raw:e,extension:"html"}]}),Oe__default.default,ke__default.default({preset:"default"})]).process(t,{from:void 0})).css}function Re(t){return z__namespace.compile(t,{style:"expanded"}).css}function Q(t){let e={};for(let r=0;r<t.length;r++){let o=t[r];e[o]=Re(o);}return e}function Te(t){return t.some(r=>r.editor.scssFiles.length)?t.filter(r=>r.editor.scssFiles.length).map(r=>{let o=Q(r.editor.scssFiles),n=Object.values(o).join("");return {name:r.name,mergedCompiledStyles:n,scssFinal:`
29
+ #${r.nodeIdentifier}{
30
+ ${n}
31
+ }`}}):[]}async function Le(t,e={}){let o={...{content:[{raw:t}],theme:{}},...e},n=glob.globSync(`${G}/${s.config.nodes.editor.dirName}/assets/tailwind.scss`)[0],i=n.length?M__default.default.readFileSync(n,"utf8"):"";return (await U__default.default([He__default.default(o),ae("autoprefixer")]).process(i,{from:void 0})).css}function We(){let t=s.resolvedSrcPathsScss,e=Q([...t]);return Object.values(e).join("")}async function X(t){let{rawHtml:e,minify:r=!1,nodes:o}=t||{},n=We(),i=Te(o),p=await Le(e),m=l=>`.${s.packageNameSlug}{${l}}`,c=i.map(l=>l.scssFinal).join(`
32
+ `),a=m(`${p}${n}${c}`);return r?Be(a,e):a}var F=class{params;constructor(e){this.params={minify:!1,...e};}async getEditorIndexContent(){return `
43
33
  import type { NodeAPI } from 'node-red';
44
- ${e.map(t=>`import ${t.pascalName} from '${t.editor.tsPath}';`).join(`
34
+ ${s.listNodesFull.map(e=>`import ${e.pascalName} from '${e.editor.tsPath}';`).join(`
45
35
  `)}
46
36
 
47
37
  declare const RED: NodeAPI;
48
38
 
49
- ${e.map(t=>`// @ts-ignore
50
- window.RED.nodes.registerType('${t.name}', ${t.pascalName});`).join(`
39
+ ${s.listNodesFull.map(e=>`// @ts-ignore
40
+ window.RED.nodes.registerType('${e.name}', ${e.pascalName});`).join(`
51
41
  `)}
52
- `.trim()}var a=I();async function N(e){let{minify:t=!1}=e||{},r=a.getListNodesFull();_(a.pathLibCacheDir),await J([a.pathDist]);let o=Z(r).then(s=>{b(`${a.cacheDirFiles.controllerIndex}`,s).then(()=>{W(t);});}),n=ee(r).then(s=>{b(`${a.cacheDirFiles.editorIndex}`,s).then(()=>{X({minify:t,nodes:r}).then(async m=>{await b(`${a.pathDist}/index.html`,m);});});});await Promise.all([o,n,b(`${a.pathLibCacheDir}/config.json`,JSON.stringify(a.config,null,2))]);}function te(e){let t=new commander.Command("checks").description("[WIP] Commands to check the some stuff");t.command("nodes-structure").description("[WIP] Verify the structure of the nodes").action(()=>{console.log("In construction");}),e.addCommand(t);}function re(e){let t=new commander.Command("info").description("Command to get information").description("Get information about the package").action(()=>{consola.consola.log(Ge__default.default.render(i));});e.addCommand(t);}function oe(e){let t=new commander.Command("create-node").description("[WIP] Create a new node").action(async()=>{consola.consola.warn("Command in construction - not working yet");let r=await consola.consola.prompt("Enter node name:",{type:"text"}),o=radash.dash(r),n=await consola.consola.prompt(`This name is OK for you '${o}'?`,{type:"confirm"});console.log("userIsOk",n);});e.addCommand(t);}var ie,v;function Ke(){ie=ne__default.default({exec:`node-red -u ${a.config.watcher.nodeRed.path}`,ignore:["**/*"],ext:"js,html",verbose:!0}),ne__default.default.once("start",()=>{v=Ve__default.default.create(),v.init({ui:!1,proxy:{target:a.config.watcher.nodeRed.url,ws:!0},ghostMode:!1,open:!1,reloadDelay:4e3});}).on("quit",()=>{consola.consola.info("Nodemon has quit"),process.exit(0);});}function ze(){ie.restart(),v.reload();}var se=a.config.watcher.nodeRed.enabled&&a.config.watcher.nodeRed.path;function ae(){Ue__default.default.watch(a.pathSrcDir,{}).on("ready",async()=>{consola.consola.info("Initial scan complete. Ready for changes"),await N({minify:!1}),consola.consola.success("Initial Build completed"),se?Ke():consola.consola.warn("Node-Red watcher is disabled. Please enable it in the config file");}).on("change",async t=>{consola.consola.info(`File ${t.replace(a.currentDir,"")} has been changed`),await N({minify:!1}),consola.consola.success("Build completed"),se&&ze();});}var g=new commander.Command;g.name("node-red-dxp").description("node-red-dxp CLI").version(O.version);g.command("build").description("Build project").action(async e=>{consola.consola.start("Building..."),await N({minify:!0}),consola.consola.ready("Build completed");});g.command("watch").description("watch project").option("--minify <minify>","[WIP] Minify the output",!1).action(e=>{ae();});te(g);re(g);oe(g);g.parse(le__namespace.argv);
42
+ `.trim()}async getBuiltScript(){let e=await we__default.default.build({entryPoints:[s.cacheDirFiles.editorIndex],bundle:!0,platform:"browser",format:"iife",target:"es6",sourcemap:!1,minify:this.params.minify,minifyWhitespace:this.params.minify,minifySyntax:this.params.minify,minifyIdentifiers:this.params.minify,legalComments:"none",inject:[`${s.currentPackagedDistPath}/editor/global-solid.ts`],write:!1,loader:{".ts":"ts"}});return e.outputFiles&&e.outputFiles.length>0?e.outputFiles[0].text:""}async prepareEditorIndex(){let e=await this.getBuiltScript(),r=await K({minify:this.params.minify,nodes:s.listNodesFull,packageNameSlug:s.packageNameSlug}),o=await X({rawHtml:r.html,minify:this.params.minify,nodes:s.listNodesFull}),i=new D().getAllDocContent(),p=`<script type="application/javascript">${e.trim()}</script>`,m=`<style>${o}</style>`;return `
43
+ ${r.allWrappedHtml}
44
+ ${m}
45
+ ${p}
46
+ ${i}`.trim()}async getEditorTask(){return this.getEditorIndexContent().then(e=>{f(`${s.cacheDirFiles.editorIndex}`,e).then(()=>{this.prepareEditorIndex().then(async r=>{await f(`${s.pathDist}/${s.config.nodes.editor.htmlName}.html`,r);});});})}};var x=class{params;builderController;builderEditor;constructor(e){this.params={minify:!1,...e},this.builderController=new S({minify:this.params.minify}),this.builderEditor=new F({minify:this.params.minify});}prepare(){C(s.pathLibCacheDir);let e=[J([s.pathDist]),f(`${s.pathLibCacheDir}/config.json`,JSON.stringify(s.config,null,2))];return Promise.all(e)}async buildAll(){return await this.prepare(),Promise.all([this.builderController.getControllerTask(),this.builderEditor.getEditorTask()])}};function Y(t){let e=new commander.Command("checks").description("[WIP] Commands to check the some stuff");e.command("nodes-structure").description("[WIP] Verify the structure of the nodes").action(()=>{console.log("In construction");}),t.addCommand(e);}function Z(t){let e=new commander.Command("info").description("Command to get information").description("Get information about the package").action(()=>{consola.consola.log(_e__default.default.render(s));});t.addCommand(e);}async function Qe(t){try{let e=q__default.default.resolve(t);return await O__default.default.readFile(e,"utf-8")}catch(e){throw new Error(`Failed to load file: ${e.message}`)}}async function Xe(t,e){try{let r=await Qe(t);return ze__default.default.compile(r)(e)}catch(r){throw new Error(`Failed to render template: ${r.message}`)}}var j=class{nodePascalName;nodeDashName;newNodeDistPath;newNodeEditorDistPath;scaffoldedDistHbs;constructor(e){let{pascalName:r,dashName:o}=V(e);this.nodePascalName=r,this.nodeDashName=o,this.newNodeDistPath=`${s.pathSrcNodesDir}/${o}`,this.newNodeEditorDistPath=`${this.newNodeDistPath}/${s.config.nodes.editor.dirName}`,this.scaffoldedDistHbs=`${s.currentPackagedDistPath}/scaffolding/create-node/hbs`;}distFolderExist(){return M__default.default.existsSync(this.newNodeDistPath)}prepareStructure(){return [{finalPath:`${this.newNodeDistPath}/index.ts`,templatePath:`${this.scaffoldedDistHbs}/controller.ts.hbs`,templateData:{nodePascalName:this.nodePascalName,nodeName:this.nodeDashName}},{finalPath:`${this.newNodeDistPath}/types.ts`,templatePath:`${this.scaffoldedDistHbs}/types.ts.hbs`,templateData:{nodePascalName:this.nodePascalName,nodeName:this.nodeDashName}},{finalPath:`${this.newNodeDistPath}/doc.md`,templatePath:`${this.scaffoldedDistHbs}/doc.md.hbs`,templateData:{}},{finalPath:`${this.newNodeEditorDistPath}/index.ts`,templatePath:`${this.scaffoldedDistHbs}/editor/index.ts.hbs`,templateData:{nodePascalName:this.nodePascalName,nodeName:this.nodeDashName}},{finalPath:`${this.newNodeEditorDistPath}/styles.scss`,templatePath:`${this.scaffoldedDistHbs}/editor/styles.scss.hbs`,templateData:{nodeName:this.nodeDashName}},{finalPath:`${this.newNodeEditorDistPath}/index.html`,templatePath:`${this.scaffoldedDistHbs}/editor/index.html.hbs`,templateData:{}}]}async renderFilesTemplates(){let e=this.prepareStructure().map(async r=>Xe(r.templatePath,r.templateData).then(o=>({finalPath:r.finalPath,content:o})));return await Promise.all(e)}async writeNewNode(){let e=await this.renderFilesTemplates();await Promise.all(e.map(r=>f(r.finalPath,r.content)));}};function ee(t){let e=new commander.Command("create-node").description("Create new node").action(async()=>{let r=await consola.consola.prompt("Enter node name:",{type:"text"}),o=radash.dash(r);if(!await consola.consola.prompt(`This name is OK for you '${o}'?`,{type:"confirm"})){consola.consola.info("\u{1F44C} OK. Exiting...");return}let i=new j(o);if(i.distFolderExist()){consola.consola.error(`Node ${i.nodeDashName} already exists`),consola.consola.info(`In ${i.newNodeDistPath}`);return}C(i.newNodeEditorDistPath),await i.writeNewNode();});t.addCommand(e);}var re,k;function rt(){re=te__default.default({exec:`node-red -u ${s.config.watcher.nodeRed.path}`,ignore:["**/*"],ext:"js,html",verbose:!0}),te__default.default.once("start",()=>{k=et__default.default.create(),k.init({ui:!1,proxy:{target:s.config.watcher.nodeRed.url,ws:!0},ghostMode:!1,open:!1,reloadDelay:4e3});}).on("quit",()=>{consola.consola.info("Nodemon has quit"),process.exit(0);});}function ot(){re.restart(),k.reload();}function oe(){let t=s.config.watcher.nodeRed.enabled&&s.config.watcher.nodeRed.path,e=tt__default.default.watch(s.pathSrcDir,{}),r=new x({minify:!1});e.on("ready",async()=>{consola.consola.info("Initial scan complete. Ready for changes"),await r.buildAll(),consola.consola.success("Initial Build completed"),t?rt():consola.consola.warn("Node-Red watcher is disabled. Please enable it in the config file");}).on("change",async o=>{consola.consola.info(`File ${o.replace(s.currentDir,"")} has been changed`),await r.buildAll(),consola.consola.success("Build completed"),t&&ot();});}var h=new commander.Command;h.name("node-red-dxp").description("node-red-dxp CLI").version(A.version);h.command("build").description("Build project").action(async t=>{let e=perf_hooks.performance.now();consola.consola.start("Building..."),await new x({minify:!0}).buildAll();let n=perf_hooks.performance.now()-e,i=n>1e3?`${(n/1e3).toFixed(2)}s`:`${n.toFixed(2)}ms`;consola.consola.ready(`Build completed in ${i}`);});h.command("watch").description("watch project").option("--minify <minify>","[WIP] Minify the output",!1).action(t=>{oe();});Y(h);Z(h);ee(h);h.parse(ne__namespace.argv);
@@ -0,0 +1,12 @@
1
+ import type { NodeControllerConfig, NodeControllerInst } from '@keload/node-red-dxp/editor';
2
+ import type { Node{{nodePascalName}}Props } from './types';
3
+
4
+ export default function (this: NodeControllerInst<Node{{nodePascalName}}Props>, config: NodeControllerConfig<Node{{nodePascalName}}Props>) {
5
+ RED.nodes.createNode(this, config);
6
+
7
+ this.on('input', async (msg) => {
8
+ this.send({
9
+ payload: 'foo',
10
+ });
11
+ });
12
+ }
@@ -0,0 +1,32 @@
1
+ Connects to a MQTT broker and publishes messages.
2
+
3
+ ### Inputs
4
+
5
+ : payload (string | buffer) : the payload of the message to publish.
6
+ : *topic* (string) : the MQTT topic to publish to.
7
+
8
+
9
+ ### Outputs
10
+
11
+ 1. Standard output
12
+ : payload (string) : the standard output of the command.
13
+
14
+ 2. Standard error
15
+ : payload (string) : the standard error of the command.
16
+
17
+ ### Details
18
+
19
+ `msg.payload` is used as the payload of the published message.
20
+ If it contains an Object it will be converted to a JSON string before being sent.
21
+ If it contains a binary Buffer the message will be published as-is.
22
+
23
+ The topic used can be configured in the node or, if left blank, can be set
24
+ `msg.topic`.
25
+
26
+ Likewise the QoS and retain values can be configured in the node or, if left
27
+ blank, set by `msg.qos` and `msg.retain` respectively.
28
+
29
+ ### References
30
+
31
+ - [Twitter API docs]() - full description of `msg.tweet` property
32
+ - [GitHub]() - the nodes github repository
@@ -0,0 +1,8 @@
1
+ <div class="form-row">
2
+ <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
3
+ <input type="text" id="node-input-name" placeholder="custom name"/>
4
+ </div>
5
+ <div class="form-row">
6
+ <label for="node-input-age" ><i class="fa fa-tag"></i> Age</label>
7
+ <input type="text" id="node-input-age" placeholder="enter age"/>
8
+ </div>
@@ -0,0 +1,26 @@
1
+ import { type NodeEditorProps, createEditorNode, domHelper } from '@keload/node-red-dxp/editor';
2
+ import type { Node{{nodePascalName}}Props } from '../types';
3
+
4
+ const {{nodePascalName}} = createEditorNode<NodeEditorProps<Node{{nodePascalName}}Props>>({
5
+ category: 'my_cat',
6
+ color: '#a6bbcf',
7
+ defaults: {
8
+ name: { value: '', required: true },
9
+ age: { value: '' },
10
+ },
11
+ inputs: 1,
12
+ outputs: 1,
13
+ icon: 'font-awesome/fa-tower-broadcast',
14
+ label: function () {
15
+ return this.name || '{{nodePascalName}}';
16
+ },
17
+ oneditprepare: function () {
18
+ const { watchInput } = domHelper<Node{{nodePascalName}}Props>(this);
19
+ // $age == #node-input-age in DOM
20
+ watchInput('$age', ([ageValue]) => {
21
+ console.log('ageValue', ageValue);
22
+ });
23
+ },
24
+ });
25
+
26
+ export default {{nodePascalName}};
@@ -0,0 +1,2 @@
1
+ // this file is optional and can be removed if you don't need it
2
+ // all styles are scoped to the editor of this node `{{nodeName}}`
@@ -0,0 +1,3 @@
1
+ export interface Node{{nodePascalName}}Props {
2
+ age: string;
3
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keload/node-red-dxp",
3
- "version": "1.3.2",
3
+ "version": "1.4.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -50,6 +50,7 @@
50
50
  "devDependencies": {
51
51
  "@biomejs/biome": "1.9.4",
52
52
  "@release-it/conventional-changelog": "9.0.3",
53
+ "@types/handlebars": "4.1.0",
53
54
  "release-it": "17.10.0",
54
55
  "tsup": "8.3.5",
55
56
  "tsx": "4.19.2",