node-red-contrib-prib-functions 0.22.0 → 0.23.3

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 (38) hide show
  1. package/README.md +142 -92
  2. package/lib/AlphaBeta.js +32 -0
  3. package/lib/GraphDB.js +40 -9
  4. package/lib/MinMax.js +17 -0
  5. package/lib/Tree.js +64 -0
  6. package/lib/common.js +128 -0
  7. package/lib/objectExtensions.js +213 -80
  8. package/lib/timeDimension.js +36 -0
  9. package/lib/typedInput.js +77 -0
  10. package/matrix/matrixNode.html +2 -1
  11. package/package.json +15 -13
  12. package/test/00-objectExtensions.js +192 -1
  13. package/test/02-graphdb.js +46 -0
  14. package/test/data/.config.nodes.json +3 -3
  15. package/test/data/.config.nodes.json.backup +3 -3
  16. package/test/data/.config.users.json +3 -2
  17. package/test/data/.config.users.json.backup +3 -2
  18. package/test/data/.flow.json.backup +3875 -472
  19. package/test/data/flow.json +3874 -471
  20. package/test/data/package-lock.json +11 -11
  21. package/test/data/shares/.config.nodes.json +589 -0
  22. package/test/data/shares/.config.runtime.json +4 -0
  23. package/test/data/shares/.config.runtime.json.backup +3 -0
  24. package/test/data/shares/.config.users.json +32 -0
  25. package/test/data/shares/.config.users.json.backup +29 -0
  26. package/test/data/shares/.flow.json.backup +230 -0
  27. package/test/data/shares/.flow_cred.json.backup +3 -0
  28. package/test/data/shares/flow.json +267 -0
  29. package/test/data/shares/flow_cred.json +3 -0
  30. package/test/data/shares/package.json +6 -0
  31. package/test/data/shares/settings.js +544 -0
  32. package/testing/test.js +63 -29
  33. package/transform/transform.html +185 -20
  34. package/transform/transform.js +272 -265
  35. package/transform/xlsx2.js +74 -0
  36. package/visual/shapes/base..js +1 -0
  37. package/visual/visual.js +0 -0
  38. package/visual/visualNode.js +45 -0
@@ -0,0 +1,74 @@
1
+ //see https://docs.sheetjs.com/docs/api/utilities/array
2
+
3
+ let XLSX=()=>{
4
+ const requireXLSX=require('xlsx')
5
+ XLSX=()=>requireXLSX
6
+ return requireXLSX
7
+ }
8
+ const XMLoptions = {
9
+ // attributeNamePrefix : "@_",
10
+ // attrNodeName: "attr", //default is 'false'
11
+ // textNodeName : "#text",
12
+ ignoreAttributes : false,
13
+ ignoreNameSpace : false,
14
+ allowBooleanAttributes : true,
15
+ parseNodeValue : true,
16
+ parseAttributeValue : false,
17
+ // cdataTagName: "__cdata", //default is 'false'
18
+ // cdataPositionChar: "\\c",
19
+ // parseTrueNumberOnly: false,
20
+ // arrayMode: false, //"strict"
21
+ // attrValueProcessor: (val, attrName) => he.decode(val, {isAttributeValue: true}),//default is a=>a
22
+ // tagValueProcessor : (val, tagName) => he.decode(val), //default is a=>a
23
+ // stopNodes: ["parse-me-as-string"]
24
+ trimValues: false
25
+ }
26
+
27
+ const addWorksheet2JSON=(object,worksheet,workbook,options={header:1,raw:true})=>{
28
+ object[worksheet]=XLSX().utils.sheet_to_json(workbook.Sheets[worksheet],options)
29
+ return object
30
+ }
31
+
32
+ const XLSXObject2JSON=(workbook,options)=>workbook.SheetNames.reduce((a,worksheet)=>addWorksheet2JSON(a,worksheet,workbook,options),{})
33
+ const XLSX2Array=data=>XLSXObject2Array(XLSX2XLSXObject(data))
34
+ const XLSX2JSON=data=>XLSX2XLSXObject(XLSXObject2JSON(data))
35
+ const XLSX2XLSXObject=data=>XLSX().read(data, {raw:true,type: 'buffer' })
36
+ const XLSXObject2Array=(workbookoptions={header:1,raw:true})=>workbook.SheetNames.reduce((a,worksheet)=>{
37
+ a.push(XLSX().utils.sheet_to_json(workbook.Sheets[worksheet],options))
38
+ return a
39
+ },[])
40
+ const JSON2XLSX=data=>XLSX().write(JSON2XLSXObject(data), {bookType:"xlsx", type:'buffer'})
41
+ const JSON2XLSXObject=data=>{
42
+ const workbook = XLSX().utils.book_new();
43
+ for(const worksheet in data) {
44
+ const ws=XLSX().utils.json_to_sheet(data[worksheet]);
45
+ XLSX().utils.book_append_sheet(workbook, ws, worksheet);
46
+ }
47
+ return workbook
48
+ }
49
+ const Array2XLSX=data=>XLSX().write(Array2XLSXObject(data), {bookType:"xlsx", type:'buffer'})
50
+ const Array2XLSXObject=data=>{
51
+ const workbook = XLSX().utils.book_new();
52
+ if(Array.isArray(data)) {
53
+ const ws=XLSX().utils.aoa_to_sheet(data);
54
+ XLSX().utils.book_append_sheet(workbook, ws,"worksheet 1");
55
+ return workbook
56
+ }
57
+ for(const worksheet in data) {
58
+ const ws=XLSX().utils.aoa_to_sheet(data[worksheet]);
59
+ XLSX().utils.book_append_sheet(workbook, ws, worksheet);
60
+ }
61
+ return workbook
62
+ }
63
+ module.exports={
64
+ addWorksheet2JSON:addWorksheet2JSON,
65
+ XLSXObject2JSON:XLSXObject2JSON,
66
+ XLSX2Array:XLSX2Array,
67
+ XLSX2JSON:XLSX2JSON,
68
+ XLSX2XLSXObject:XLSX2XLSXObject,
69
+ XLSXObject2Array:XLSXObject2Array,
70
+ JSON2XLSX:JSON2XLSX,
71
+ JSON2XLSXObject:JSON2XLSXObject,
72
+ Array2XLSX:Array2XLSX,
73
+ Array2XLSXObject:Array2XLSXObject
74
+ }
@@ -0,0 +1 @@
1
+ const square=[[0,0],[1,0],[1,1],[0,1]]
File without changes
@@ -0,0 +1,45 @@
1
+ const logger = new (require("node-red-contrib-logger"))("visual");
2
+ logger.sendInfo("Copyright 2025 Jaroslav Peter Prib");
3
+ const levenshteinDistance = require("./levenshteinDistance");
4
+ function error(node,message,shortMessage){
5
+ if(logger.active) logger.send({label:"error",node:node.id,error:error,shortMessage});
6
+ node.error(message);
7
+ node.status({fill:"red",shape:"ring",text:shortMessage});
8
+ }
9
+ function evalFunction(id,mapping){
10
+ try{
11
+ return eval(mapping);
12
+ } catch(ex) {
13
+ throw Error(id+" "+ex.message);
14
+ }
15
+ }
16
+ module.exports = function (RED) {
17
+ function loggerNode (n) {
18
+ RED.nodes.createNode(this, n);
19
+ const node = Object.assign(this, n);
20
+
21
+ const source1Map="(RED,node,msg)=>"+(node.source1Property||"msg.payload"),
22
+ source2Map="(RED,node,msg)=>"+(node.source2Property||"msg.payload"),
23
+ targetMap="(RED,node,msg,data)=>{"+(node.targetProperty||"msg.payload")+"=data;}";
24
+ logger.sendInfo({label:"mappings",source1:source1Map,source2:source2Map,target:targetMap});
25
+ try{
26
+ node.getData1=evalFunction("source1",source1Map);
27
+ node.getData2=evalFunction("source2",source2Map);
28
+ node.setData=evalFunction("target",targetMap);
29
+ } catch(ex) {
30
+ error(node,ex,"Invalid setup "+ex.message);
31
+ return;
32
+ }
33
+ node.on('input', function (msg) {
34
+ try{
35
+ node.setData(RED,node,msg,levenshteinDistance(node.getData1(RED,node,msg),node.getData2(RED,node,msg)));
36
+ node.send(msg);
37
+ } catch(ex) {
38
+ msg.error=ex.message;
39
+ error(node,ex,"Error(s), check log");
40
+ node.send([null,msg]);
41
+ }
42
+ });
43
+ }
44
+ RED.nodes.registerType(logger.label, loggerNode);
45
+ };