@keload/node-red-dxp 1.7.0 → 1.8.1

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.
Files changed (40) hide show
  1. package/dist/chunk-TEASWJ66.js +1 -0
  2. package/dist/chunk-WOT6VMZA.js +1 -0
  3. package/dist/cli/index.cjs +42 -3975
  4. package/dist/editor/assets/tailwind.scss +7 -0
  5. package/dist/editor/dom-helper/index.cjs +1 -0
  6. package/dist/editor/dom-helper/index.d.cts +33 -0
  7. package/dist/editor/dom-helper/index.d.ts +33 -0
  8. package/dist/editor/dom-helper/index.js +1 -0
  9. package/dist/editor/index.cjs +1 -176
  10. package/dist/editor/index.d.cts +3 -24
  11. package/dist/editor/index.d.ts +3 -24
  12. package/dist/editor/index.js +1 -105
  13. package/dist/index.cjs +1 -4
  14. package/dist/index.js +0 -3
  15. package/dist/scaffolding/create-node/hbs/controller-config.ts.hbs +17 -0
  16. package/dist/scaffolding/create-node/hbs/editor/index-config.html.hbs +16 -0
  17. package/dist/scaffolding/create-node/hbs/editor/index-config.ts.hbs +35 -0
  18. package/dist/scaffolding/create-node/hbs/editor/index.ts.hbs +3 -3
  19. package/dist/types-DGuXTnAE.d.cts +13 -0
  20. package/dist/types-DGuXTnAE.d.ts +13 -0
  21. package/dist/utils/index.cjs +13 -0
  22. package/dist/{utils.d.cts → utils/index.d.cts} +7 -0
  23. package/dist/{utils.d.ts → utils/index.d.ts} +7 -0
  24. package/dist/utils/index.js +13 -0
  25. package/package.json +8 -3
  26. package/dist/builder/index.cjs +0 -738
  27. package/dist/builder/index.cjs.map +0 -1
  28. package/dist/builder/index.js +0 -705
  29. package/dist/builder/index.js.map +0 -1
  30. package/dist/chunk-DATO2UPN.js +0 -108
  31. package/dist/chunk-DATO2UPN.js.map +0 -1
  32. package/dist/cli/index.cjs.map +0 -1
  33. package/dist/editor/index.cjs.map +0 -1
  34. package/dist/editor/index.js.map +0 -1
  35. package/dist/index.cjs.map +0 -1
  36. package/dist/index.js.map +0 -1
  37. package/dist/utils.cjs +0 -119
  38. package/dist/utils.cjs.map +0 -1
  39. package/dist/utils.js +0 -13
  40. package/dist/utils.js.map +0 -1
@@ -19,4 +19,11 @@
19
19
  .alert-dark {
20
20
  @apply text-gray-800 bg-gray-50;
21
21
  }
22
+
23
+ div.form-row {
24
+ select {
25
+ @apply w-[70%];
26
+ }
27
+ }
22
28
  }
29
+
@@ -0,0 +1 @@
1
+ 'use strict';var solidJs=require('solid-js');function f(t){let e=t.startsWith("$"),n=t.startsWith("$$"),r=t.startsWith("#node-config-input")||t.startsWith("#node-input");return {isNodeIdShortcut:e,isNodeConfigIdShortcut:n,isFullSelector:r,value:e||n||r}}function s(t){let e=f(t);return e.isNodeConfigIdShortcut?`#node-config-input-${t.replace("$$","")}`:e.isNodeIdShortcut?`#node-input-${t.replace("$","")}`:t}function S(t,e){let n=s(t),r=document.querySelector(n);if(!r)throw new Error(`Element with id '${t}' not found`);let[o,i]=solidJs.createSignal(e||""),l=()=>{i(r.value);},a=c=>{r.value!==c&&(r.value=c);};return r.addEventListener("input",l),solidJs.onCleanup(()=>{r.removeEventListener("input",l);}),solidJs.createEffect(()=>{a(o());}),i(r.value||e),[o,i]}function u(t,e,n){e.forEach(r=>{let o=document.querySelector(r);o&&n.forEach(i=>o.classList[t](i));});}function m(t,e){u("remove",t,e);}function x(t,e){u("add",t,e);}function h(t){return s(t).split("-input-")[1]}function E(t,e,n){let r=s(t),o=e;n!=null&&n.emptyValue&&(o=[{value:"",text:n.emptyValue},...e]),$(r).empty().append(o.map(i=>$("<option>",{value:i.value,text:i.text,selected:i.value===(n==null?void 0:n.selected)})));}function y(t,e){let r=(Array.isArray(t)?t:[t]).map(s).join(", ");$(r).on("input",()=>{let o=$(r).map(function(){return $(this).val()}).get();e(o);});}function I(t,e){let n=s(t);$(n).val(e);}function T(t,e){let n=s(t);$(n).text(e);}exports.addClassesOnSelectors=x;exports.createReactiveField=S;exports.handleAddRemoveClassesOnSelectors=u;exports.initSelect=E;exports.isNodeInput=f;exports.removeClassesOnSelectors=m;exports.resolveInputKey=h;exports.resolveSelector=s;exports.setInputValue=I;exports.setText=T;exports.watchInput=y;
@@ -0,0 +1,33 @@
1
+ import { E as EditorDomHelper } from '../../types-DGuXTnAE.cjs';
2
+ import 'node-red';
3
+
4
+ /**
5
+ * Checks if a given selector is a node input selector.
6
+ *
7
+ * @param selector - The selector string to check.
8
+ * @returns True if the selector is a node input selector, false otherwise.
9
+ */
10
+ declare function isNodeInput(selector: string): {
11
+ isNodeIdShortcut: boolean;
12
+ isNodeConfigIdShortcut: boolean;
13
+ isFullSelector: boolean;
14
+ value: boolean;
15
+ };
16
+ /**
17
+ * Resolves a given selector to a specific format based on its prefix.
18
+ *
19
+ * @param inSelector - The input selector string to resolve.
20
+ * @returns The resolved selector string.
21
+ */
22
+ declare function resolveSelector(inSelector: string): string;
23
+ declare function createReactiveField<T extends HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(selector: string, defaultValue?: string): [() => string, (value: string) => void];
24
+ declare function handleAddRemoveClassesOnSelectors(action: 'add' | 'remove', selectors: string[], classesToRemove: string[]): void;
25
+ declare function removeClassesOnSelectors(selectors: string[], classesToRemove: string[]): void;
26
+ declare function addClassesOnSelectors(selectors: string[], classesToAdd: string[]): void;
27
+ declare function resolveInputKey(selector: string): string;
28
+ declare function initSelect(selector: string, options: Record<string, string>[], params?: EditorDomHelper.InitSelectParams): void;
29
+ declare function watchInput<T = any>(selectors: string | string[], callback: (values: T[]) => void): void;
30
+ declare function setInputValue(selector: string, val: string): void;
31
+ declare function setText(selector: string, text: string): void;
32
+
33
+ export { addClassesOnSelectors, createReactiveField, handleAddRemoveClassesOnSelectors, initSelect, isNodeInput, removeClassesOnSelectors, resolveInputKey, resolveSelector, setInputValue, setText, watchInput };
@@ -0,0 +1,33 @@
1
+ import { E as EditorDomHelper } from '../../types-DGuXTnAE.js';
2
+ import 'node-red';
3
+
4
+ /**
5
+ * Checks if a given selector is a node input selector.
6
+ *
7
+ * @param selector - The selector string to check.
8
+ * @returns True if the selector is a node input selector, false otherwise.
9
+ */
10
+ declare function isNodeInput(selector: string): {
11
+ isNodeIdShortcut: boolean;
12
+ isNodeConfigIdShortcut: boolean;
13
+ isFullSelector: boolean;
14
+ value: boolean;
15
+ };
16
+ /**
17
+ * Resolves a given selector to a specific format based on its prefix.
18
+ *
19
+ * @param inSelector - The input selector string to resolve.
20
+ * @returns The resolved selector string.
21
+ */
22
+ declare function resolveSelector(inSelector: string): string;
23
+ declare function createReactiveField<T extends HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(selector: string, defaultValue?: string): [() => string, (value: string) => void];
24
+ declare function handleAddRemoveClassesOnSelectors(action: 'add' | 'remove', selectors: string[], classesToRemove: string[]): void;
25
+ declare function removeClassesOnSelectors(selectors: string[], classesToRemove: string[]): void;
26
+ declare function addClassesOnSelectors(selectors: string[], classesToAdd: string[]): void;
27
+ declare function resolveInputKey(selector: string): string;
28
+ declare function initSelect(selector: string, options: Record<string, string>[], params?: EditorDomHelper.InitSelectParams): void;
29
+ declare function watchInput<T = any>(selectors: string | string[], callback: (values: T[]) => void): void;
30
+ declare function setInputValue(selector: string, val: string): void;
31
+ declare function setText(selector: string, text: string): void;
32
+
33
+ export { addClassesOnSelectors, createReactiveField, handleAddRemoveClassesOnSelectors, initSelect, isNodeInput, removeClassesOnSelectors, resolveInputKey, resolveSelector, setInputValue, setText, watchInput };
@@ -0,0 +1 @@
1
+ import'../../chunk-WOT6VMZA.js';import {createSignal,onCleanup,createEffect}from'solid-js';function f(t){let e=t.startsWith("$"),n=t.startsWith("$$"),r=t.startsWith("#node-config-input")||t.startsWith("#node-input");return {isNodeIdShortcut:e,isNodeConfigIdShortcut:n,isFullSelector:r,value:e||n||r}}function s(t){let e=f(t);return e.isNodeConfigIdShortcut?`#node-config-input-${t.replace("$$","")}`:e.isNodeIdShortcut?`#node-input-${t.replace("$","")}`:t}function S(t,e){let n=s(t),r=document.querySelector(n);if(!r)throw new Error(`Element with id '${t}' not found`);let[o,i]=createSignal(e||""),l=()=>{i(r.value);},a=c=>{r.value!==c&&(r.value=c);};return r.addEventListener("input",l),onCleanup(()=>{r.removeEventListener("input",l);}),createEffect(()=>{a(o());}),i(r.value||e),[o,i]}function u(t,e,n){e.forEach(r=>{let o=document.querySelector(r);o&&n.forEach(i=>o.classList[t](i));});}function m(t,e){u("remove",t,e);}function x(t,e){u("add",t,e);}function h(t){return s(t).split("-input-")[1]}function E(t,e,n){let r=s(t),o=e;n!=null&&n.emptyValue&&(o=[{value:"",text:n.emptyValue},...e]),$(r).empty().append(o.map(i=>$("<option>",{value:i.value,text:i.text,selected:i.value===(n==null?void 0:n.selected)})));}function y(t,e){let r=(Array.isArray(t)?t:[t]).map(s).join(", ");$(r).on("input",()=>{let o=$(r).map(function(){return $(this).val()}).get();e(o);});}function I(t,e){let n=s(t);$(n).val(e);}function T(t,e){let n=s(t);$(n).text(e);}export{x as addClassesOnSelectors,S as createReactiveField,u as handleAddRemoveClassesOnSelectors,E as initSelect,f as isNodeInput,m as removeClassesOnSelectors,h as resolveInputKey,s as resolveSelector,I as setInputValue,T as setText,y as watchInput};
@@ -1,176 +1 @@
1
- 'use strict';
2
-
3
- var solidJs = require('solid-js');
4
-
5
- // node_modules/.pnpm/is-what@5.0.2/node_modules/is-what/dist/getType.js
6
- function getType(payload) {
7
- return Object.prototype.toString.call(payload).slice(8, -1);
8
- }
9
-
10
- // node_modules/.pnpm/is-what@5.0.2/node_modules/is-what/dist/isPlainObject.js
11
- function isPlainObject(payload) {
12
- if (getType(payload) !== "Object")
13
- return false;
14
- const prototype = Object.getPrototypeOf(payload);
15
- return !!prototype && prototype.constructor === Object && prototype === Object.prototype;
16
- }
17
-
18
- // node_modules/.pnpm/is-what@5.0.2/node_modules/is-what/dist/isSymbol.js
19
- function isSymbol(payload) {
20
- return getType(payload) === "Symbol";
21
- }
22
-
23
- // node_modules/.pnpm/merge-anything@6.0.2/node_modules/merge-anything/dist/merge.js
24
- function assignProp(carry, key, newVal, originalObject) {
25
- const propType = {}.propertyIsEnumerable.call(originalObject, key) ? "enumerable" : "nonenumerable";
26
- if (propType === "enumerable")
27
- carry[key] = newVal;
28
- if (propType === "nonenumerable") {
29
- Object.defineProperty(carry, key, {
30
- value: newVal,
31
- enumerable: false,
32
- writable: true,
33
- configurable: true
34
- });
35
- }
36
- }
37
- function mergeRecursively(origin, newComer, compareFn) {
38
- if (!isPlainObject(newComer))
39
- return newComer;
40
- let newObject = {};
41
- if (isPlainObject(origin)) {
42
- const props2 = Object.getOwnPropertyNames(origin);
43
- const symbols2 = Object.getOwnPropertySymbols(origin);
44
- newObject = [...props2, ...symbols2].reduce((carry, key) => {
45
- const targetVal = origin[key];
46
- if (!isSymbol(key) && !Object.getOwnPropertyNames(newComer).includes(key) || isSymbol(key) && !Object.getOwnPropertySymbols(newComer).includes(key)) {
47
- assignProp(carry, key, targetVal, origin);
48
- }
49
- return carry;
50
- }, {});
51
- }
52
- const props = Object.getOwnPropertyNames(newComer);
53
- const symbols = Object.getOwnPropertySymbols(newComer);
54
- const result = [...props, ...symbols].reduce((carry, key) => {
55
- let newVal = newComer[key];
56
- const targetVal = isPlainObject(origin) ? origin[key] : void 0;
57
- if (targetVal !== void 0 && isPlainObject(newVal)) {
58
- newVal = mergeRecursively(targetVal, newVal);
59
- }
60
- const propToAssign = newVal;
61
- assignProp(carry, key, propToAssign, newComer);
62
- return carry;
63
- }, newObject);
64
- return result;
65
- }
66
- function merge(object, ...otherObjects) {
67
- return otherObjects.reduce((result, newComer) => {
68
- return mergeRecursively(result, newComer);
69
- }, object);
70
- }
71
-
72
- // src/editor/utils.ts
73
- function resolveSelector(inSelector) {
74
- if (inSelector.startsWith("$$")) {
75
- return `#node-config-input-${inSelector.replace("$$", "")}`;
76
- }
77
- if (inSelector.startsWith("$")) {
78
- return `#node-input-${inSelector.replace("$", "")}`;
79
- }
80
- return inSelector;
81
- }
82
- function createReactiveField(selector, defaultValue) {
83
- const realSelector = resolveSelector(selector);
84
- const formElement = document.querySelector(realSelector);
85
- if (!formElement) {
86
- throw new Error(`Element with id '${selector}' not found`);
87
- }
88
- const [fieldValue, setFieldValue] = solidJs.createSignal(defaultValue || "");
89
- const updateSignal = () => {
90
- setFieldValue(formElement.value);
91
- };
92
- const updateDOM = (newValue) => {
93
- if (formElement.value !== newValue) {
94
- formElement.value = newValue;
95
- }
96
- };
97
- formElement.addEventListener("input", updateSignal);
98
- solidJs.onCleanup(() => {
99
- console.log("JE CLEAN");
100
- formElement.removeEventListener("input", updateSignal);
101
- });
102
- solidJs.createEffect(() => {
103
- updateDOM(fieldValue());
104
- });
105
- setFieldValue(formElement.value || defaultValue);
106
- return [fieldValue, setFieldValue];
107
- }
108
-
109
- // src/editor/index.ts
110
- var defaultNodeDef = {};
111
- function createEditorNode(props) {
112
- return merge(defaultNodeDef, props);
113
- }
114
- function resolveInputKey(selector) {
115
- const realSelector = resolveSelector(selector);
116
- return realSelector.split("-input-")[1];
117
- }
118
- function domHelper(vm) {
119
- function getVmInputKey(key) {
120
- return vm[key];
121
- }
122
- const initSelect = (selector, options, params) => {
123
- const selectedValue = (params == null ? void 0 : params.selected) || getVmInputKey(resolveInputKey(selector));
124
- const realSelector = resolveSelector(selector);
125
- let realOptions = options;
126
- if (params == null ? void 0 : params.emptyValue) {
127
- realOptions = [{ value: "", text: params.emptyValue }, ...options];
128
- }
129
- $(realSelector).empty().append(
130
- realOptions.map((opt) => {
131
- return $("<option>", { value: opt.value, text: opt.text, selected: opt.value === selectedValue });
132
- })
133
- );
134
- };
135
- const getInputValue = (key) => {
136
- const keyStr = key;
137
- return $(`#node-input-${keyStr}`).val();
138
- };
139
- function setText(selector, text) {
140
- const realSelector = resolveSelector(selector);
141
- $(realSelector).text(text);
142
- }
143
- function jqSelector(selector) {
144
- const realSelector = resolveSelector(selector);
145
- return $(realSelector);
146
- }
147
- function setInputValue(selector, val) {
148
- const realSelector = resolveSelector(selector);
149
- $(realSelector).val(val);
150
- }
151
- function watchInput(selectors, callback) {
152
- const selectorsArray = Array.isArray(selectors) ? selectors : [selectors];
153
- const realSelectors = selectorsArray.map(resolveSelector).join(", ");
154
- $(realSelectors).on("input", () => {
155
- const values = $(realSelectors).map(function() {
156
- return $(this).val();
157
- }).get();
158
- callback(values);
159
- });
160
- }
161
- return {
162
- getInputValue,
163
- watchInput,
164
- setText,
165
- setInputValue,
166
- jqSelector,
167
- initSelect
168
- };
169
- }
170
-
171
- exports.createEditorNode = createEditorNode;
172
- exports.createReactiveField = createReactiveField;
173
- exports.domHelper = domHelper;
174
- exports.resolveSelector = resolveSelector;
175
- //# sourceMappingURL=index.cjs.map
176
- //# sourceMappingURL=index.cjs.map
1
+ 'use strict';function u(e){return Object.prototype.toString.call(e).slice(8,-1)}function n(e){if(u(e)!=="Object")return !1;let r=Object.getPrototypeOf(e);return !!r&&r.constructor===Object&&r===Object.prototype}function c(e){return u(e)==="Symbol"}function x(e,r,o,p){let f={}.propertyIsEnumerable.call(p,r)?"enumerable":"nonenumerable";f==="enumerable"&&(e[r]=o),f==="nonenumerable"&&Object.defineProperty(e,r,{value:o,enumerable:!1,writable:!0,configurable:!0});}function d(e,r,o){if(!n(r))return r;let p={};if(n(e)){let m=Object.getOwnPropertyNames(e),i=Object.getOwnPropertySymbols(e);p=[...m,...i].reduce((s,t)=>{let l=e[t];return (!c(t)&&!Object.getOwnPropertyNames(r).includes(t)||c(t)&&!Object.getOwnPropertySymbols(r).includes(t))&&x(s,t,l,e),s},{});}let f=Object.getOwnPropertyNames(r),a=Object.getOwnPropertySymbols(r);return [...f,...a].reduce((m,i)=>{let s=r[i],t=n(e)?e[i]:void 0;t!==void 0&&n(s)&&(s=d(t,s));let l=s;return x(m,i,l,r),m},p)}function b(e,...r){return r.reduce((o,p)=>d(o,p),e)}var O={};function F(e){return b(O,e)}exports.createEditorNode=F;
@@ -1,27 +1,6 @@
1
- import { NodeDef, Node, EditorNodeProperties, EditorNodeDef, EditorNodeInstance } from 'node-red';
2
-
3
- type NodeControllerConfig<T> = NodeDef & T;
4
- type NodeControllerInst<T> = Node & T;
5
- type NodeEditorProps<T> = EditorNodeProperties & T;
6
- declare namespace EditorDomHelper {
7
- type InitSelectParams = {
8
- selected?: string | number | unknown;
9
- emptyValue?: string;
10
- };
11
- }
12
-
13
- declare function resolveSelector(inSelector: string): string;
14
-
15
- declare function createReactiveField<T extends HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(selector: string, defaultValue?: string): [() => string, (value: string) => void];
1
+ import { EditorNodeProperties, EditorNodeDef } from 'node-red';
2
+ export { E as EditorDomHelper, N as NodeControllerConfig, a as NodeControllerInst, b as NodeEditorProps } from '../types-DGuXTnAE.cjs';
16
3
 
17
4
  declare function createEditorNode<TProps extends EditorNodeProperties, TCreds = undefined, TInstProps extends TProps = TProps>(props: Partial<EditorNodeDef<TProps, TCreds, TInstProps>>): EditorNodeDef<TProps, TCreds, TInstProps>;
18
- declare function domHelper<TProps>(vm: EditorNodeInstance): {
19
- getInputValue: (key: Exclude<keyof TProps, "inputs">) => string | number | string[];
20
- watchInput: <T = any>(selectors: string | string[], callback: (values: T[]) => void) => void;
21
- setText: (selector: string, text: string) => void;
22
- setInputValue: (selector: string, val: string) => void;
23
- jqSelector: (selector: string) => JQuery<HTMLElement>;
24
- initSelect: (selector: string, options: Record<string, string>[], params?: EditorDomHelper.InitSelectParams) => void;
25
- };
26
5
 
27
- export { EditorDomHelper, type NodeControllerConfig, type NodeControllerInst, type NodeEditorProps, createEditorNode, createReactiveField, domHelper, resolveSelector };
6
+ export { createEditorNode };
@@ -1,27 +1,6 @@
1
- import { NodeDef, Node, EditorNodeProperties, EditorNodeDef, EditorNodeInstance } from 'node-red';
2
-
3
- type NodeControllerConfig<T> = NodeDef & T;
4
- type NodeControllerInst<T> = Node & T;
5
- type NodeEditorProps<T> = EditorNodeProperties & T;
6
- declare namespace EditorDomHelper {
7
- type InitSelectParams = {
8
- selected?: string | number | unknown;
9
- emptyValue?: string;
10
- };
11
- }
12
-
13
- declare function resolveSelector(inSelector: string): string;
14
-
15
- declare function createReactiveField<T extends HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(selector: string, defaultValue?: string): [() => string, (value: string) => void];
1
+ import { EditorNodeProperties, EditorNodeDef } from 'node-red';
2
+ export { E as EditorDomHelper, N as NodeControllerConfig, a as NodeControllerInst, b as NodeEditorProps } from '../types-DGuXTnAE.js';
16
3
 
17
4
  declare function createEditorNode<TProps extends EditorNodeProperties, TCreds = undefined, TInstProps extends TProps = TProps>(props: Partial<EditorNodeDef<TProps, TCreds, TInstProps>>): EditorNodeDef<TProps, TCreds, TInstProps>;
18
- declare function domHelper<TProps>(vm: EditorNodeInstance): {
19
- getInputValue: (key: Exclude<keyof TProps, "inputs">) => string | number | string[];
20
- watchInput: <T = any>(selectors: string | string[], callback: (values: T[]) => void) => void;
21
- setText: (selector: string, text: string) => void;
22
- setInputValue: (selector: string, val: string) => void;
23
- jqSelector: (selector: string) => JQuery<HTMLElement>;
24
- initSelect: (selector: string, options: Record<string, string>[], params?: EditorDomHelper.InitSelectParams) => void;
25
- };
26
5
 
27
- export { EditorDomHelper, type NodeControllerConfig, type NodeControllerInst, type NodeEditorProps, createEditorNode, createReactiveField, domHelper, resolveSelector };
6
+ export { createEditorNode };
@@ -1,105 +1 @@
1
- import { merge } from '../chunk-DATO2UPN.js';
2
- import { createSignal, onCleanup, createEffect } from 'solid-js';
3
-
4
- // src/editor/utils.ts
5
- function resolveSelector(inSelector) {
6
- if (inSelector.startsWith("$$")) {
7
- return `#node-config-input-${inSelector.replace("$$", "")}`;
8
- }
9
- if (inSelector.startsWith("$")) {
10
- return `#node-input-${inSelector.replace("$", "")}`;
11
- }
12
- return inSelector;
13
- }
14
- function createReactiveField(selector, defaultValue) {
15
- const realSelector = resolveSelector(selector);
16
- const formElement = document.querySelector(realSelector);
17
- if (!formElement) {
18
- throw new Error(`Element with id '${selector}' not found`);
19
- }
20
- const [fieldValue, setFieldValue] = createSignal(defaultValue || "");
21
- const updateSignal = () => {
22
- setFieldValue(formElement.value);
23
- };
24
- const updateDOM = (newValue) => {
25
- if (formElement.value !== newValue) {
26
- formElement.value = newValue;
27
- }
28
- };
29
- formElement.addEventListener("input", updateSignal);
30
- onCleanup(() => {
31
- console.log("JE CLEAN");
32
- formElement.removeEventListener("input", updateSignal);
33
- });
34
- createEffect(() => {
35
- updateDOM(fieldValue());
36
- });
37
- setFieldValue(formElement.value || defaultValue);
38
- return [fieldValue, setFieldValue];
39
- }
40
-
41
- // src/editor/index.ts
42
- var defaultNodeDef = {};
43
- function createEditorNode(props) {
44
- return merge(defaultNodeDef, props);
45
- }
46
- function resolveInputKey(selector) {
47
- const realSelector = resolveSelector(selector);
48
- return realSelector.split("-input-")[1];
49
- }
50
- function domHelper(vm) {
51
- function getVmInputKey(key) {
52
- return vm[key];
53
- }
54
- const initSelect = (selector, options, params) => {
55
- const selectedValue = (params == null ? void 0 : params.selected) || getVmInputKey(resolveInputKey(selector));
56
- const realSelector = resolveSelector(selector);
57
- let realOptions = options;
58
- if (params == null ? void 0 : params.emptyValue) {
59
- realOptions = [{ value: "", text: params.emptyValue }, ...options];
60
- }
61
- $(realSelector).empty().append(
62
- realOptions.map((opt) => {
63
- return $("<option>", { value: opt.value, text: opt.text, selected: opt.value === selectedValue });
64
- })
65
- );
66
- };
67
- const getInputValue = (key) => {
68
- const keyStr = key;
69
- return $(`#node-input-${keyStr}`).val();
70
- };
71
- function setText(selector, text) {
72
- const realSelector = resolveSelector(selector);
73
- $(realSelector).text(text);
74
- }
75
- function jqSelector(selector) {
76
- const realSelector = resolveSelector(selector);
77
- return $(realSelector);
78
- }
79
- function setInputValue(selector, val) {
80
- const realSelector = resolveSelector(selector);
81
- $(realSelector).val(val);
82
- }
83
- function watchInput(selectors, callback) {
84
- const selectorsArray = Array.isArray(selectors) ? selectors : [selectors];
85
- const realSelectors = selectorsArray.map(resolveSelector).join(", ");
86
- $(realSelectors).on("input", () => {
87
- const values = $(realSelectors).map(function() {
88
- return $(this).val();
89
- }).get();
90
- callback(values);
91
- });
92
- }
93
- return {
94
- getInputValue,
95
- watchInput,
96
- setText,
97
- setInputValue,
98
- jqSelector,
99
- initSelect
100
- };
101
- }
102
-
103
- export { createEditorNode, createReactiveField, domHelper, resolveSelector };
104
- //# sourceMappingURL=index.js.map
105
- //# sourceMappingURL=index.js.map
1
+ import {b}from'../chunk-TEASWJ66.js';import'../chunk-WOT6VMZA.js';var o={};function d(r){return b(o,r)}export{d as createEditorNode};
package/dist/index.cjs CHANGED
@@ -1,4 +1 @@
1
- 'use strict';
2
-
3
- //# sourceMappingURL=index.cjs.map
4
- //# sourceMappingURL=index.cjs.map
1
+ 'use strict';
package/dist/index.js CHANGED
@@ -1,3 +0,0 @@
1
-
2
- //# sourceMappingURL=index.js.map
3
- //# sourceMappingURL=index.js.map
@@ -0,0 +1,17 @@
1
+ import type { NodeControllerConfig, NodeControllerInst } from '@keload/node-red-dxp/editor';
2
+ import type { Node{{nodePascalName}}Props } from './types';
3
+
4
+ export const credentials = {
5
+ user: { type: 'text' },
6
+ password: { type: 'password' },
7
+ };
8
+
9
+ export default function (this: NodeControllerInst<Node{{nodePascalName}}Props>, config: NodeControllerConfig<Node{{nodePascalName}}Props>) {
10
+ RED.nodes.createNode(this, config);
11
+
12
+ this.on('input', async (msg) => {
13
+ this.send({
14
+ payload: 'foo',
15
+ });
16
+ });
17
+ }
@@ -0,0 +1,16 @@
1
+ <div class="form-row">
2
+ <label for="node-config-input-name"><i class="fa fa-tag"></i> Name</label>
3
+ <input type="text" id="node-config-input-name" placeholder="custom name"/>
4
+ </div>
5
+ <div class="form-row">
6
+ <label for="node-config-input-age" ><i class="fa fa-tag"></i> Age</label>
7
+ <input type="text" id="node-config-input-age" placeholder="enter age"/>
8
+ </div>
9
+ <div class="form-row">
10
+ <label for="node-config-input-user" ><i class="fa fa-tag"></i> User</label>
11
+ <input type="text" id="node-config-input-user" placeholder="enter user"/>
12
+ </div>
13
+ <div class="form-row">
14
+ <label for="node-config-input-password" ><i class="fa fa-tag"></i> Password</label>
15
+ <input type="password" id="node-config-input-password" placeholder="enter password"/>
16
+ </div>
@@ -0,0 +1,35 @@
1
+ import { type NodeEditorProps, createEditorNode } from '@keload/node-red-dxp/editor';
2
+ import { watchInput } from '@keload/node-red-dxp/editor/dom-helper';
3
+ import type { Node{{nodePascalName}}Props } from '../types';
4
+
5
+ interface NodeCredentials {
6
+ user: string;
7
+ password: string;
8
+ }
9
+
10
+ const {{nodePascalName}} = createEditorNode<NodeEditorProps<Node{{nodePascalName}}Props>, NodeCredentials>({
11
+ category: 'config',
12
+ color: '#a6bbcf',
13
+ defaults: {
14
+ name: { value: '', required: true },
15
+ age: { value: '' },
16
+ },
17
+ credentials: {
18
+ user: { type: 'text' },
19
+ password: { type: 'password' },
20
+ },
21
+ inputs: 1,
22
+ outputs: 1,
23
+ icon: 'font-awesome/fa-tower-broadcast',
24
+ label: function () {
25
+ return this.name || '{{nodePascalName}}';
26
+ },
27
+ oneditprepare: () => {
28
+ // $age == #node-input-age in DOM
29
+ watchInput('$age', ([ageValue]) => {
30
+ console.log('ageValue', ageValue);
31
+ });
32
+ },
33
+ });
34
+
35
+ export default {{nodePascalName}};
@@ -1,4 +1,5 @@
1
- import { type NodeEditorProps, createEditorNode, domHelper } from '@keload/node-red-dxp/editor';
1
+ import { type NodeEditorProps, createEditorNode } from '@keload/node-red-dxp/editor';
2
+ import { watchInput } from '@keload/node-red-dxp/editor/dom-helper';
2
3
  import type { Node{{nodePascalName}}Props } from '../types';
3
4
 
4
5
  const {{nodePascalName}} = createEditorNode<NodeEditorProps<Node{{nodePascalName}}Props>>({
@@ -14,8 +15,7 @@ const {{nodePascalName}} = createEditorNode<NodeEditorProps<Node{{nodePascalName
14
15
  label: function () {
15
16
  return this.name || '{{nodePascalName}}';
16
17
  },
17
- oneditprepare: function () {
18
- const { watchInput } = domHelper<Node{{nodePascalName}}Props>(this);
18
+ oneditprepare: () => {
19
19
  // $age == #node-input-age in DOM
20
20
  watchInput('$age', ([ageValue]) => {
21
21
  console.log('ageValue', ageValue);
@@ -0,0 +1,13 @@
1
+ import { NodeDef, Node, EditorNodeProperties } from 'node-red';
2
+
3
+ type NodeControllerConfig<T> = NodeDef & T;
4
+ type NodeControllerInst<T> = Node & T;
5
+ type NodeEditorProps<T = Record<any, any>> = EditorNodeProperties & T;
6
+ declare namespace EditorDomHelper {
7
+ type InitSelectParams = {
8
+ selected?: string | number | unknown;
9
+ emptyValue?: string;
10
+ };
11
+ }
12
+
13
+ export { EditorDomHelper as E, type NodeControllerConfig as N, type NodeControllerInst as a, type NodeEditorProps as b };
@@ -0,0 +1,13 @@
1
+ import { NodeDef, Node, EditorNodeProperties } from 'node-red';
2
+
3
+ type NodeControllerConfig<T> = NodeDef & T;
4
+ type NodeControllerInst<T> = Node & T;
5
+ type NodeEditorProps<T = Record<any, any>> = EditorNodeProperties & T;
6
+ declare namespace EditorDomHelper {
7
+ type InitSelectParams = {
8
+ selected?: string | number | unknown;
9
+ emptyValue?: string;
10
+ };
11
+ }
12
+
13
+ export { EditorDomHelper as E, type NodeControllerConfig as N, type NodeControllerInst as a, type NodeEditorProps as b };
@@ -0,0 +1,13 @@
1
+ 'use strict';var $t=Object.defineProperty;var W=(t,e)=>{for(var r in e)$t(t,r,{get:e[r],enumerable:!0});};var _="[a-fA-F\\d:]",a=t=>t&&t.includeBoundaries?`(?:(?<=\\s|^)(?=${_})|(?<=${_})(?=\\s|$))`:"",f="(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}",i="[a-fA-F\\d]{1,4}",w=`
2
+ (?:
3
+ (?:${i}:){7}(?:${i}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8
4
+ (?:${i}:){6}(?:${f}|:${i}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4
5
+ (?:${i}:){5}(?::${f}|(?::${i}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4
6
+ (?:${i}:){4}(?:(?::${i}){0,1}:${f}|(?::${i}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4
7
+ (?:${i}:){3}(?:(?::${i}){0,2}:${f}|(?::${i}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4
8
+ (?:${i}:){2}(?:(?::${i}){0,3}:${f}|(?::${i}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4
9
+ (?:${i}:){1}(?:(?::${i}){0,4}:${f}|(?::${i}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4
10
+ (?::(?:(?::${i}){0,5}:${f}|(?::${i}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4
11
+ )(?:%[0-9a-zA-Z]{1,})? // %eth0 %1
12
+ `.replace(/\s*\/\/.*$/gm,"").replace(/\n/g,"").trim(),jt=new RegExp(`(?:^${f}$)|(?:^${w}$)`),Tt=new RegExp(`^${f}$`),Pt=new RegExp(`^${w}$`),A=t=>t&&t.exact?jt:new RegExp(`(?:${a(t)}${f}${a(t)})|(?:${a(t)}${w}${a(t)})`,"g");A.v4=t=>t&&t.exact?Tt:new RegExp(`${a(t)}${f}${a(t)}`,"g");A.v6=t=>t&&t.exact?Pt:new RegExp(`${a(t)}${w}${a(t)}`,"g");var $=A;function R(t){let e=(...r)=>t(...r);return Object.defineProperty(e,"name",{value:`functionTimeout(${t.name||"<anonymous>"})`,configurable:!0}),e}var{toString:Nt}=Object.prototype;function k(t){return Nt.call(t)==="[object RegExp]"}var Y={global:"g",ignoreCase:"i",multiline:"m",dotAll:"s",sticky:"y",unicode:"u"};function F(t,e={}){if(!k(t))throw new TypeError("Expected a RegExp instance");let r=Object.keys(Y).map(s=>(typeof e[s]=="boolean"?e[s]:t[s])?Y[s]:"").join(""),n=new RegExp(e.source||t.source,r);return n.lastIndex=typeof e.lastIndex=="number"?e.lastIndex:t.lastIndex,n}function j(t,e,{timeout:r}={}){try{return R(()=>F(t).test(e),{timeout:r})()}catch(n){throw n}}var Et=15,q=45,M={timeout:400};function K(t){return t.length>q?!1:j($({exact:!0}),t,M)}function v(t){return t.length>q?!1:j($.v6({exact:!0}),t,M)}function U(t){return t.length>Et?!1:j($.v4({exact:!0}),t,M)}function X(t){if(v(t))return 6;if(U(t))return 4}function Z(t,{lenient:e=!1}={}){if(typeof t!="string")throw new TypeError("isUrl: Expected a string");let r=t.trim();if(r.includes(" "))return !1;try{return new URL(r),!0}catch(n){return e?Z(`https://${r}`):!1}}var Ht={isIP:K,isIPv4:U,isIPv6:v,ipVersion:X,isUrl:Z};var D={};W(D,{concatArrays:()=>z,merge:()=>St,mergeAndCompare:()=>It,mergeAndConcat:()=>At});var B={};W(B,{getType:()=>o,isAnyObject:()=>T,isArray:()=>p,isBlob:()=>G,isBoolean:()=>P,isDate:()=>H,isEmptyArray:()=>J,isEmptyObject:()=>Q,isEmptyString:()=>C,isError:()=>tt,isFile:()=>et,isFullArray:()=>rt,isFullObject:()=>ot,isFullString:()=>nt,isFunction:()=>it,isInstanceOf:()=>st,isMap:()=>ct,isNaNValue:()=>ft,isNegativeNumber:()=>ut,isNull:()=>d,isNullOrUndefined:()=>pt,isNumber:()=>l,isObject:()=>mt,isObjectLike:()=>at,isOneOf:()=>E,isPlainObject:()=>c,isPositiveNumber:()=>lt,isPrimitive:()=>xt,isPromise:()=>gt,isRegExp:()=>bt,isSet:()=>yt,isString:()=>y,isSymbol:()=>g,isType:()=>N,isUndefined:()=>h,isWeakMap:()=>dt,isWeakSet:()=>ht});function o(t){return Object.prototype.toString.call(t).slice(8,-1)}function T(t){return o(t)==="Object"}function p(t){return o(t)==="Array"}function G(t){return o(t)==="Blob"}function P(t){return o(t)==="Boolean"}function H(t){return o(t)==="Date"&&!isNaN(t)}function J(t){return p(t)&&t.length===0}function c(t){if(o(t)!=="Object")return !1;let e=Object.getPrototypeOf(t);return !!e&&e.constructor===Object&&e===Object.prototype}function Q(t){return c(t)&&Object.keys(t).length===0}function C(t){return t===""}function tt(t){return o(t)==="Error"||t instanceof Error}function et(t){return o(t)==="File"}function rt(t){return p(t)&&t.length>0}function ot(t){return c(t)&&Object.keys(t).length>0}function y(t){return o(t)==="String"}function nt(t){return y(t)&&t!==""}function it(t){return typeof t=="function"}function N(t,e){if(!(e instanceof Function))throw new TypeError("Type must be a function");if(!Object.prototype.hasOwnProperty.call(e,"prototype"))throw new TypeError("Type is not a class");let r=e.name;return o(t)===r||!!(t&&t.constructor===e)}function st(t,e){if(typeof e=="function"){for(let r=t;r;r=Object.getPrototypeOf(r))if(N(r,e))return !0;return !1}else {for(let r=t;r;r=Object.getPrototypeOf(r))if(o(r)===e)return !0;return !1}}function ct(t){return o(t)==="Map"}function ft(t){return o(t)==="Number"&&isNaN(t)}function l(t){return o(t)==="Number"&&!isNaN(t)}function ut(t){return l(t)&&t<0}function d(t){return o(t)==="Null"}function E(t,e,r,n,s){return x=>t(x)||e(x)||!!r&&r(x)||!!n&&n(x)||!!s&&s(x)}function h(t){return o(t)==="Undefined"}var pt=E(d,h);function mt(t){return c(t)}function at(t){return T(t)}function lt(t){return l(t)&&t>0}function g(t){return o(t)==="Symbol"}function xt(t){return P(t)||d(t)||h(t)||l(t)||y(t)||g(t)}function gt(t){return o(t)==="Promise"}function bt(t){return o(t)==="RegExp"}function yt(t){return o(t)==="Set"}function dt(t){return o(t)==="WeakMap"}function ht(t){return o(t)==="WeakSet"}function z(t,e){return p(t)&&p(e)?t.concat(e):e}function Ot(t,e,r,n){let s={}.propertyIsEnumerable.call(n,e)?"enumerable":"nonenumerable";s==="enumerable"&&(t[e]=r),s==="nonenumerable"&&Object.defineProperty(t,e,{value:r,enumerable:!1,writable:!0,configurable:!0});}function S(t,e,r){if(!c(e))return e;let n={};if(c(t)){let O=Object.getOwnPropertyNames(t),b=Object.getOwnPropertySymbols(t);n=[...O,...b].reduce((m,u)=>{let I=t[u];return (!g(u)&&!Object.getOwnPropertyNames(e).includes(u)||g(u)&&!Object.getOwnPropertySymbols(e).includes(u))&&Ot(m,u,I,t),m},{});}let s=Object.getOwnPropertyNames(e),x=Object.getOwnPropertySymbols(e);return [...s,...x].reduce((O,b)=>{let m=e[b],u=c(t)?t[b]:void 0;u!==void 0&&c(m)&&(m=S(u,m,r));let I=r?r(u,m,b):m;return Ot(O,b,I,e),O},n)}function St(t,...e){return e.reduce((r,n)=>S(r,n),t)}function It(t,e,...r){return r.reduce((n,s)=>S(n,s,t),e)}function At(t,...e){return e.reduce((r,n)=>S(r,n,z),t)}var kt=t=>!!(t&&t.constructor&&t.call&&t.apply);var wt=t=>!(!t||!t.then||!kt(t.then));var V=t=>(...e)=>{try{let r=t(...e);return wt(r)?r.then(n=>[void 0,n]).catch(n=>[n,void 0]):[void 0,r]}catch(r){return [r,void 0]}};
13
+ exports.isWhat=B;exports.mergeAnything=D;exports.tryit=V;exports.validators=Ht;
@@ -1,12 +1,19 @@
1
1
  import { isIP, isIPv4, isIPv6, ipVersion } from 'is-ip';
2
2
  import * as mergeAnything from 'merge-anything';
3
3
  export { mergeAnything };
4
+ import * as isWhat from 'is-what';
5
+ export { isWhat };
6
+ export { tryit } from 'radash';
4
7
 
8
+ declare function isUrl(string: string, { lenient }?: {
9
+ lenient?: boolean;
10
+ }): boolean;
5
11
  declare const validators: {
6
12
  isIP: typeof isIP;
7
13
  isIPv4: typeof isIPv4;
8
14
  isIPv6: typeof isIPv6;
9
15
  ipVersion: typeof ipVersion;
16
+ isUrl: typeof isUrl;
10
17
  };
11
18
 
12
19
  export { validators };
@@ -1,12 +1,19 @@
1
1
  import { isIP, isIPv4, isIPv6, ipVersion } from 'is-ip';
2
2
  import * as mergeAnything from 'merge-anything';
3
3
  export { mergeAnything };
4
+ import * as isWhat from 'is-what';
5
+ export { isWhat };
6
+ export { tryit } from 'radash';
4
7
 
8
+ declare function isUrl(string: string, { lenient }?: {
9
+ lenient?: boolean;
10
+ }): boolean;
5
11
  declare const validators: {
6
12
  isIP: typeof isIP;
7
13
  isIPv4: typeof isIPv4;
8
14
  isIPv6: typeof isIPv6;
9
15
  ipVersion: typeof ipVersion;
16
+ isUrl: typeof isUrl;
10
17
  };
11
18
 
12
19
  export { validators };