node-opcua-modeler 2.63.1 → 2.63.2
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.
- package/dist/displayNodeElement.js +119 -99
- package/dist/displayNodeElement.js.map +1 -1
- package/dist/generate_markdown_doc.js +5 -8
- package/dist/generate_markdown_doc.js.map +1 -1
- package/dist/to_graphivz.d.ts +1 -0
- package/dist/to_graphivz.js +84 -37
- package/dist/to_graphivz.js.map +1 -1
- package/package.json +16 -16
- package/source/displayNodeElement.ts +148 -111
- package/source/generate_markdown_doc.ts +3 -5
- package/source/to_graphivz.ts +104 -39
|
@@ -28,130 +28,150 @@ function symbol(nodeClass) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
const hasSubtypeNodeId = (0, node_opcua_nodeid_1.resolveNodeId)("HasSubtype");
|
|
31
|
-
function
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const superType = node.subtypeOfObj;
|
|
36
|
-
if (superType) {
|
|
37
|
-
table.push(["Base", superType.browseName.toString(), { colSpan: 6, content: node.browseName.toString() }]);
|
|
31
|
+
function dumpReference(data, ref, filter) {
|
|
32
|
+
(0, node_opcua_address_space_1.resolveReferenceNode)(data.node.addressSpace, ref);
|
|
33
|
+
if (!ref.isForward) {
|
|
34
|
+
return;
|
|
38
35
|
}
|
|
39
|
-
if (
|
|
40
|
-
|
|
36
|
+
if (node_opcua_nodeid_1.NodeId.sameNodeId(ref.referenceType, hasSubtypeNodeId)) {
|
|
37
|
+
return; // ignore forward HasSubtype
|
|
41
38
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
// ignore subtype references
|
|
40
|
+
/* istanbul ignore next */
|
|
41
|
+
if (!ref.node) {
|
|
42
|
+
// tslint:disable-next-line: no-console
|
|
43
|
+
console.log(" Halt ", ref.toString({ addressSpace: data.node.addressSpace }));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const dir = ref.isForward ? " " : " ";
|
|
47
|
+
const refNode = ref.node;
|
|
48
|
+
const refType = (0, node_opcua_address_space_1.resolveReferenceType)(data.node.addressSpace, ref);
|
|
49
|
+
if (filter) {
|
|
50
|
+
if (refType.browseName.toString() !== filter) {
|
|
47
51
|
return;
|
|
48
52
|
}
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
}
|
|
54
|
+
if (data.alreadyDumped[refNode.nodeId.toString()]) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// xx const r = refNode.findReferencesAsObject("HasModellingRule", true);
|
|
58
|
+
const modelingRule = refNode.modellingRule || ""; // r[0] ? r[0].browseName.toString() : "/";
|
|
59
|
+
let value = "";
|
|
60
|
+
let dataType = "";
|
|
61
|
+
if (refNode.nodeClass === node_opcua_data_model_1.NodeClass.Variable) {
|
|
62
|
+
const v = refNode;
|
|
63
|
+
const val = v.readValue().value.value;
|
|
64
|
+
if (v.isExtensionObject()) {
|
|
65
|
+
// don't do anything
|
|
51
66
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
// tslint:disable-next-line: no-console
|
|
56
|
-
console.log(" Halt ", ref.toString({ addressSpace: node.addressSpace }));
|
|
57
|
-
return;
|
|
67
|
+
else if (v.isEnumeration() && val !== null) {
|
|
68
|
+
const enumValue = v.readEnumValue();
|
|
69
|
+
value = enumValue.value + " (" + enumValue.name + ")";
|
|
58
70
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const refType = (0, node_opcua_address_space_1.resolveReferenceType)(node.addressSpace, ref);
|
|
62
|
-
if (filter) {
|
|
63
|
-
if (refType.browseName.toString() !== filter) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
71
|
+
else if (val instanceof Date) {
|
|
72
|
+
value = val ? val.toUTCString() : "";
|
|
66
73
|
}
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
else {
|
|
75
|
+
value = val ? val.toString() : "null";
|
|
69
76
|
}
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const v = refNode;
|
|
76
|
-
const val = v.readValue().value.value;
|
|
77
|
-
if (v.isExtensionObject()) {
|
|
78
|
-
// don't do anything
|
|
79
|
-
}
|
|
80
|
-
else if (v.isEnumeration() && val !== null) {
|
|
81
|
-
const enumValue = v.readEnumValue();
|
|
82
|
-
value = enumValue.value + " (" + enumValue.name + ")";
|
|
83
|
-
}
|
|
84
|
-
else if (val instanceof Date) {
|
|
85
|
-
value = val ? val.toUTCString() : "";
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
value = val ? val.toString() : "null";
|
|
89
|
-
}
|
|
90
|
-
const actualDataType = node_opcua_variant_1.DataType[v.readValue().value.dataType];
|
|
91
|
-
const basicDataType = node_opcua_variant_1.DataType[v.dataTypeObj.basicDataType];
|
|
92
|
-
dataType = v.dataTypeObj.browseName.toString();
|
|
93
|
-
if (basicDataType !== dataType) {
|
|
94
|
-
dataType = dataType + "(" + basicDataType + ")";
|
|
95
|
-
}
|
|
96
|
-
// findBasicDataType(v.dataTypeObj);
|
|
77
|
+
const actualDataType = node_opcua_variant_1.DataType[v.readValue().value.dataType];
|
|
78
|
+
const basicDataType = node_opcua_variant_1.DataType[v.dataTypeObj.basicDataType];
|
|
79
|
+
dataType = v.dataTypeObj.browseName.toString();
|
|
80
|
+
if (basicDataType !== dataType) {
|
|
81
|
+
dataType = dataType + "(" + basicDataType + ")";
|
|
97
82
|
}
|
|
98
|
-
|
|
99
|
-
refType.browseName.toString() + dir + symbol(refNode.nodeClass),
|
|
100
|
-
refNode.nodeId.toString(),
|
|
101
|
-
refNode.browseName.toString(),
|
|
102
|
-
modelingRule,
|
|
103
|
-
refNode.typeDefinitionObj ? refNode.typeDefinitionObj.browseName.toString() : "",
|
|
104
|
-
dataType,
|
|
105
|
-
value
|
|
106
|
-
];
|
|
107
|
-
table.push(row);
|
|
108
|
-
descriptions.push({
|
|
109
|
-
description: refNode.description ? refNode.description.toString() : "",
|
|
110
|
-
name: refNode.browseName.name,
|
|
111
|
-
type: dataType
|
|
112
|
-
});
|
|
113
|
-
alreadyDumped[refNode.nodeId.toString()] = 1;
|
|
83
|
+
// findBasicDataType(v.dataTypeObj);
|
|
114
84
|
}
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
85
|
+
const row = [
|
|
86
|
+
refType.browseName.toString() + dir + symbol(refNode.nodeClass),
|
|
87
|
+
refNode.nodeId.toString(),
|
|
88
|
+
refNode.browseName.toString(),
|
|
89
|
+
modelingRule,
|
|
90
|
+
refNode.typeDefinitionObj ? refNode.typeDefinitionObj.browseName.toString() : "",
|
|
91
|
+
dataType,
|
|
92
|
+
value
|
|
93
|
+
];
|
|
94
|
+
data.table.push(row);
|
|
95
|
+
data.descriptions.push({
|
|
96
|
+
description: refNode.description ? refNode.description.toString() : "",
|
|
97
|
+
name: refNode.browseName.name,
|
|
98
|
+
type: dataType
|
|
99
|
+
});
|
|
100
|
+
data.alreadyDumped[refNode.nodeId.toString()] = 1;
|
|
101
|
+
}
|
|
102
|
+
function dumpReferences(data, _references) {
|
|
103
|
+
// xx for (const ref of references) {
|
|
104
|
+
// xx dumpReference(ref, "HasSubtype");
|
|
105
|
+
// xx }
|
|
106
|
+
for (const ref of _references) {
|
|
107
|
+
dumpReference(data, ref, "HasTypeDefinition");
|
|
108
|
+
}
|
|
109
|
+
for (const ref of _references) {
|
|
110
|
+
dumpReference(data, ref, "HasEncoding");
|
|
111
|
+
}
|
|
112
|
+
for (const ref of _references) {
|
|
113
|
+
dumpReference(data, ref, "HasComponent");
|
|
114
|
+
}
|
|
115
|
+
for (const ref of _references) {
|
|
116
|
+
dumpReference(data, ref, "HasProperty");
|
|
117
|
+
}
|
|
118
|
+
for (const ref of _references) {
|
|
119
|
+
dumpReference(data, ref, "Organizes");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function displayNodeElement(node, options) {
|
|
123
|
+
const head = ["ReferenceType", "NodeId", "BrowseName", "ModellingRule", "TypeDefinition", "DataType", "Value"];
|
|
124
|
+
function createTable() {
|
|
125
|
+
const table = new tableHelper_1.TableHelper(head);
|
|
126
|
+
table.push(["BrowseName: ", { colSpan: 6, content: node.browseName.toString() }]);
|
|
127
|
+
const superType = node.subtypeOfObj;
|
|
128
|
+
if (superType) {
|
|
129
|
+
table.push(["Base", superType.browseName.toString(), { colSpan: 6, content: node.browseName.toString() }]);
|
|
126
130
|
}
|
|
127
|
-
|
|
128
|
-
|
|
131
|
+
if (node.description) {
|
|
132
|
+
table.push(["Description", node.description.toString(), { colSpan: 6, content: node.browseName.toString() }]);
|
|
129
133
|
}
|
|
130
|
-
|
|
131
|
-
|
|
134
|
+
return table;
|
|
135
|
+
}
|
|
136
|
+
const table = createTable();
|
|
137
|
+
const alreadyDumped = {};
|
|
138
|
+
const descriptions = [];
|
|
139
|
+
const references = node.allReferences();
|
|
140
|
+
const m = {};
|
|
141
|
+
const data = { table, node, alreadyDumped, descriptions };
|
|
142
|
+
dumpReferences(data, references);
|
|
143
|
+
function toText(table) {
|
|
144
|
+
if (options && options.format === "markdown") {
|
|
145
|
+
return table.toMarkdownTable();
|
|
132
146
|
}
|
|
133
|
-
|
|
134
|
-
|
|
147
|
+
else {
|
|
148
|
+
return table.toString();
|
|
135
149
|
}
|
|
136
150
|
}
|
|
137
|
-
|
|
151
|
+
const str = [];
|
|
152
|
+
const tables = [];
|
|
153
|
+
tables.push(table);
|
|
154
|
+
str.push(toText(table));
|
|
155
|
+
const str2 = [];
|
|
138
156
|
// add property from base object/variable type
|
|
139
157
|
if (node.nodeClass === node_opcua_data_model_1.NodeClass.ObjectType || node.nodeClass === node_opcua_data_model_1.NodeClass.VariableType) {
|
|
140
158
|
const curNode = node;
|
|
141
159
|
let subtypeOf = curNode.subtypeOfObj;
|
|
142
160
|
while (subtypeOf) {
|
|
161
|
+
data.table = createTable();
|
|
143
162
|
table.push([subtypeOf.browseName.toString() + ":", "--", "--", "--"]);
|
|
144
163
|
const references2 = subtypeOf.allReferences();
|
|
145
|
-
dumpReferences(references2);
|
|
164
|
+
dumpReferences(data, references2);
|
|
165
|
+
str.push("<details>");
|
|
166
|
+
str.push("<summary>Base type: " + subtypeOf.browseName.toString() + "</summary>");
|
|
167
|
+
str.push("");
|
|
168
|
+
str.push(toText(table));
|
|
169
|
+
str.push("");
|
|
170
|
+
str2.push("</details>");
|
|
146
171
|
subtypeOf = subtypeOf.subtypeOfObj;
|
|
147
172
|
}
|
|
148
173
|
}
|
|
149
|
-
|
|
150
|
-
return table.toMarkdownTable();
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
return table.toString();
|
|
154
|
-
}
|
|
174
|
+
return str.join("\n") + str2.join("\n");
|
|
155
175
|
}
|
|
156
176
|
exports.displayNodeElement = displayNodeElement;
|
|
157
177
|
//# sourceMappingURL=displayNodeElement.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"displayNodeElement.js","sourceRoot":"","sources":["../source/displayNodeElement.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"displayNodeElement.js","sourceRoot":"","sources":["../source/displayNodeElement.ts"],"names":[],"mappings":";;;AAAA,uEAQkC;AAClC,iEAAkD;AAClD,yDAA0D;AAC1D,2DAA8C;AAC9C,+CAA4C;AAE5C,MAAM,CAAC,GAAG,YAAY,CAAC;AACvB,SAAS,MAAM,CAAC,SAAoB;IAChC,QAAQ,SAAS,EAAE;QACf,KAAK,iCAAS,CAAC,QAAQ;YACnB,OAAO,GAAG,CAAC;QACf,KAAK,iCAAS,CAAC,UAAU;YACrB,OAAO,IAAI,CAAC;QAChB,KAAK,iCAAS,CAAC,YAAY;YACvB,OAAO,IAAI,CAAC;QAChB,KAAK,iCAAS,CAAC,MAAM;YACjB,OAAO,GAAG,CAAC;QACf,KAAK,iCAAS,CAAC,MAAM;YACjB,OAAO,GAAG,CAAC;QACf,KAAK,iCAAS,CAAC,QAAQ;YACnB,OAAO,GAAG,CAAC;QACf,KAAK,iCAAS,CAAC,IAAI;YACf,OAAO,GAAG,CAAC;QACf;YACI,OAAO,GAAG,CAAC;KAClB;AACL,CAAC;AACD,MAAM,gBAAgB,GAAG,IAAA,iCAAa,EAAC,YAAY,CAAC,CAAC;AAiBrD,SAAS,aAAa,CAAC,IAAU,EAAE,GAAgB,EAAE,MAAe;IAChE,IAAA,+CAAoB,EAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;QAChB,OAAO;KACV;IACD,IAAI,0BAAM,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC,EAAE;QACxD,OAAO,CAAC,4BAA4B;KACvC;IACD,4BAA4B;IAC5B,0BAA0B;IAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QACX,uCAAuC;QACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC9E,OAAO;KACV;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAK,CAAC;IAE1B,MAAM,OAAO,GAAG,IAAA,+CAAoB,EAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,MAAM,EAAE;QACR,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE;YAC1C,OAAO;SACV;KACJ;IACD,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE;QAC/C,OAAO;KACV;IACD,yEAAyE;IACzE,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,4CAA4C;IAE9F,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,OAAO,CAAC,SAAS,KAAK,iCAAS,CAAC,QAAQ,EAAE;QAC1C,MAAM,CAAC,GAAG,OAAqB,CAAC;QAEhC,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC,CAAC,iBAAiB,EAAE,EAAE;YACvB,oBAAoB;SACvB;aAAM,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,GAAG,KAAK,IAAI,EAAE;YAC1C,MAAM,SAAS,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YACpC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC;SACzD;aAAM,IAAI,GAAG,YAAY,IAAI,EAAE;YAC5B,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC;aAAM;YACH,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SACzC;QACD,MAAM,cAAc,GAAG,6BAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,6BAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5D,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC/C,IAAI,aAAa,KAAK,QAAQ,EAAE;YAC5B,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,CAAC;SACnD;QACD,oCAAoC;KACvC;IAED,MAAM,GAAG,GAAG;QACR,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAC/D,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE;QACzB,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE;QAC7B,YAAY;QACX,OAAe,CAAC,iBAAiB,CAAC,CAAC,CAAE,OAAe,CAAC,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QAClG,QAAQ;QACR,KAAK;KACR,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAErB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QACtE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAK;QAC9B,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC;IACH,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AACD,SAAS,cAAc,CAAC,IAAU,EAAE,WAA0B;IAC1D,qCAAqC;IACrC,wCAAwC;IACxC,OAAO;IACP,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;QAC3B,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;KACjD;IACD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;QAC3B,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;KAC3C;IACD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;QAC3B,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;KAC5C;IACD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;QAC3B,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;KAC3C;IACD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;QAC3B,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;KACzC;AACL,CAAC;AACD,SAAgB,kBAAkB,CAAC,IAAc,EAAE,OAA4B;IAC3E,MAAM,IAAI,GAAa,CAAC,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAEzH,SAAS,WAAW;QAChB,MAAM,KAAK,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAElF,MAAM,SAAS,GAAI,IAAqB,CAAC,YAAY,CAAC;QACtD,IAAI,SAAS,EAAE;YACX,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;SAC9G;QAED,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;SACjH;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAE5B,MAAM,aAAa,GAAwB,EAAE,CAAC;IAE9C,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IAExC,MAAM,CAAC,GAAG,EAAE,CAAC;IAEb,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IAC1D,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEjC,SAAS,MAAM,CAAC,KAAkB;QAC9B,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE;YAC1C,OAAO,KAAK,CAAC,eAAe,EAAE,CAAC;SAClC;aAAM;YACH,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;SAC3B;IACL,CAAC;IAED,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAExB,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,8CAA8C;IAC9C,IAAI,IAAI,CAAC,SAAS,KAAK,iCAAS,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,KAAK,iCAAS,CAAC,YAAY,EAAE;QACtF,MAAM,OAAO,GAAG,IAAI,CAAC;QAErB,IAAI,SAAS,GAAI,OAAyC,CAAC,YAAY,CAAC;QACxE,OAAO,SAAS,EAAE;YACd,IAAI,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACtE,MAAM,WAAW,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;YAC9C,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAElC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,YAAY,CAAC,CAAC;YAClF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAExB,SAAS,GAAI,SAA0B,CAAC,YAAY,CAAC;SACxD;KACJ;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AApED,gDAoEC"}
|
|
@@ -66,7 +66,7 @@ function dataTypeToMarkdown(dataType) {
|
|
|
66
66
|
f.valueRank ? f.valueRank : "",
|
|
67
67
|
f.maxStringLength ? f.maxStringLength : "",
|
|
68
68
|
f.arrayDimensions ? f.arrayDimensions : "",
|
|
69
|
-
f.description.text || ""
|
|
69
|
+
(f.description.text || "").replace(/\n/g, "<br>"),
|
|
70
70
|
]);
|
|
71
71
|
}
|
|
72
72
|
writer.writeLine(table.toMarkdownTable());
|
|
@@ -113,8 +113,8 @@ function buildDocumentation(namespace, writer) {
|
|
|
113
113
|
for (const objectType of namespacePriv._objectTypeIterator()) {
|
|
114
114
|
writer.writeLine("\n\n### " + objectType.browseName.name.toString());
|
|
115
115
|
writer.writeLine(d(objectType));
|
|
116
|
-
writer.writeLine(graphVizToPlantUml((0, to_graphivz_1.dumpClassHierachry)(objectType, { showBaseType: true, depth: 2 })));
|
|
117
|
-
writer.writeLine(graphVizToPlantUml((0, to_graphivz_1.opcuaToDot)(objectType)));
|
|
116
|
+
writer.writeLine((0, to_graphivz_1.graphVizToPlantUml)((0, to_graphivz_1.dumpClassHierachry)(objectType, { showBaseType: true, depth: 2 })));
|
|
117
|
+
writer.writeLine((0, to_graphivz_1.graphVizToPlantUml)((0, to_graphivz_1.opcuaToDot)(objectType)));
|
|
118
118
|
// enumerate components
|
|
119
119
|
writer.writeLine((0, displayNodeElement_1.displayNodeElement)(objectType, { format: "markdown" }));
|
|
120
120
|
for (const comp of objectType.getComponents()) {
|
|
@@ -136,8 +136,8 @@ function buildDocumentation(namespace, writer) {
|
|
|
136
136
|
writer.writeLine("\n\n### " + variableType.browseName.name.toString());
|
|
137
137
|
writer.writeLine(d(variableType));
|
|
138
138
|
writer.writeLine("");
|
|
139
|
-
writer.writeLine(graphVizToPlantUml((0, to_graphivz_1.dumpClassHierachry)(variableType, { showBaseType: true, depth: 2 })));
|
|
140
|
-
writer.writeLine(graphVizToPlantUml((0, to_graphivz_1.opcuaToDot)(variableType)));
|
|
139
|
+
writer.writeLine((0, to_graphivz_1.graphVizToPlantUml)((0, to_graphivz_1.dumpClassHierachry)(variableType, { showBaseType: true, depth: 2 })));
|
|
140
|
+
writer.writeLine((0, to_graphivz_1.graphVizToPlantUml)((0, to_graphivz_1.opcuaToDot)(variableType)));
|
|
141
141
|
// enumerate components
|
|
142
142
|
writer.writeLine((0, displayNodeElement_1.displayNodeElement)(variableType, { format: "markdown" }));
|
|
143
143
|
for (const reference of variableType.allReferences()) {
|
|
@@ -150,7 +150,4 @@ function buildDocumentation(namespace, writer) {
|
|
|
150
150
|
});
|
|
151
151
|
}
|
|
152
152
|
exports.buildDocumentation = buildDocumentation;
|
|
153
|
-
function graphVizToPlantUml(arg0) {
|
|
154
|
-
throw new Error("Function not implemented.");
|
|
155
|
-
}
|
|
156
153
|
//# sourceMappingURL=generate_markdown_doc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate_markdown_doc.js","sourceRoot":"","sources":["../source/generate_markdown_doc.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,mEAAsD;AACtD,uDAA2G;AAC3G,2DAA8C;AAE9C,6DAA0D;AAC1D,+CAA4C;AAC5C,+
|
|
1
|
+
{"version":3,"file":"generate_markdown_doc.js","sourceRoot":"","sources":["../source/generate_markdown_doc.ts"],"names":[],"mappings":"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"}
|
package/dist/to_graphivz.d.ts
CHANGED
|
@@ -9,5 +9,6 @@ export declare function dumpClassHierachry(typeNode: UAObjectType | UAVariableTy
|
|
|
9
9
|
showBaseType?: boolean;
|
|
10
10
|
showSubType?: boolean;
|
|
11
11
|
}): string;
|
|
12
|
+
export declare function graphVizToPlantUml(str: string): string;
|
|
12
13
|
export declare function dumpTypeDiagram(namespace: any): string;
|
|
13
14
|
export {};
|
package/dist/to_graphivz.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.dumpTypeDiagram = exports.dumpClassHierachry = exports.opcuaToDot = void 0;
|
|
3
|
+
exports.dumpTypeDiagram = exports.graphVizToPlantUml = exports.dumpClassHierachry = exports.opcuaToDot = void 0;
|
|
4
4
|
const node_opcua_constants_1 = require("node-opcua-constants");
|
|
5
5
|
const node_opcua_data_model_1 = require("node-opcua-data-model");
|
|
6
|
+
function e(str) {
|
|
7
|
+
return str.replace(/</g, "<").replace(/>/g, ">");
|
|
8
|
+
}
|
|
6
9
|
function innerText(node) {
|
|
7
10
|
var _a, _b;
|
|
8
11
|
const browseName = node.browseName.name;
|
|
9
12
|
const typeDefinition = (_b = (_a = node.typeDefinitionObj) === null || _a === void 0 ? void 0 : _a.browseName) === null || _b === void 0 ? void 0 : _b.name;
|
|
10
13
|
if (typeDefinition) {
|
|
11
|
-
return `[ label =< <FONT point-size="8" ><I>${typeDefinition}</I></FONT><BR/>${browseName} >]`;
|
|
14
|
+
return `[ label =< <FONT point-size="8" ><I>${typeDefinition}</I></FONT><BR/>${e(browseName)} >]`;
|
|
12
15
|
}
|
|
13
16
|
else {
|
|
14
|
-
return `[label =< ${browseName} >]`;
|
|
17
|
+
return `[label =< ${e(browseName)} >]`;
|
|
15
18
|
}
|
|
16
19
|
}
|
|
17
20
|
function arrowHeadAttribute(reference) {
|
|
@@ -51,11 +54,16 @@ class NodeRegistry {
|
|
|
51
54
|
constructor() {
|
|
52
55
|
this.m = {};
|
|
53
56
|
this.invisibleNodes = [];
|
|
57
|
+
this.duplicated = {};
|
|
54
58
|
}
|
|
55
|
-
add(node) {
|
|
59
|
+
add(name, node) {
|
|
60
|
+
if (this.duplicated[name]) {
|
|
61
|
+
return; //throw new Error("Already included");
|
|
62
|
+
}
|
|
63
|
+
this.duplicated[name] = name;
|
|
56
64
|
const nodeClass = node_opcua_data_model_1.NodeClass[node.nodeClass];
|
|
57
65
|
this.m[nodeClass] = this.m[nodeClass] || [];
|
|
58
|
-
this.m[nodeClass].push(node);
|
|
66
|
+
this.m[nodeClass].push({ name, node });
|
|
59
67
|
}
|
|
60
68
|
addInvisibleNode(name) {
|
|
61
69
|
this.invisibleNodes.push(name);
|
|
@@ -67,22 +75,22 @@ function dumpNodeByNodeClass(str, nodeRegistry) {
|
|
|
67
75
|
continue;
|
|
68
76
|
}
|
|
69
77
|
str.push(` ## -> ${className}`);
|
|
70
|
-
const mandatoryNodes = listNode.filter((node) => !node.modellingRule || node.modellingRule.match(/Mandatory/));
|
|
71
|
-
const optionalNodes = listNode.filter((node) => node.modellingRule && node.modellingRule.match(/Optional/));
|
|
78
|
+
const mandatoryNodes = listNode.filter(({ name, node }) => !node.modellingRule || node.modellingRule.match(/Mandatory/));
|
|
79
|
+
const optionalNodes = listNode.filter(({ name, node }) => node.modellingRule && node.modellingRule.match(/Optional/));
|
|
72
80
|
if (mandatoryNodes.length > 0) {
|
|
73
81
|
str.push(` node [];`);
|
|
74
82
|
const decoration = regularShapes[className];
|
|
75
83
|
str.push(` node ${decoration};`);
|
|
76
|
-
for (const node of mandatoryNodes) {
|
|
77
|
-
str.push(` ${
|
|
84
|
+
for (const { name, node } of mandatoryNodes) {
|
|
85
|
+
str.push(` ${name} ${innerText(node)}`);
|
|
78
86
|
}
|
|
79
87
|
}
|
|
80
88
|
if (optionalNodes.length > 0) {
|
|
81
89
|
const decoration2 = regularShapesOptionals[className];
|
|
82
90
|
str.push(` node [];`);
|
|
83
91
|
str.push(` node ${decoration2};`);
|
|
84
|
-
for (const node of listNode) {
|
|
85
|
-
str.push(` ${
|
|
92
|
+
for (const { name, node } of listNode) {
|
|
93
|
+
str.push(` ${name} ${innerText(node)}`);
|
|
86
94
|
}
|
|
87
95
|
}
|
|
88
96
|
}
|
|
@@ -96,7 +104,6 @@ function dumpNodeByNodeClass(str, nodeRegistry) {
|
|
|
96
104
|
function opcuaToDot(node, options) {
|
|
97
105
|
options = options || { naked: false };
|
|
98
106
|
const nodeRegistry = new NodeRegistry();
|
|
99
|
-
nodeRegistry.add(node);
|
|
100
107
|
const str = [];
|
|
101
108
|
const str2 = [];
|
|
102
109
|
str.push("digraph G {");
|
|
@@ -105,8 +112,12 @@ function opcuaToDot(node, options) {
|
|
|
105
112
|
str.push(" nodesep=0.5;");
|
|
106
113
|
str.push(" node [];");
|
|
107
114
|
}
|
|
115
|
+
function makeId(p, c) {
|
|
116
|
+
return `${p}_${c}`.replace(" ", "_").replace(/<|>/g, "_");
|
|
117
|
+
}
|
|
118
|
+
// eslint-disable-next-line max-params
|
|
108
119
|
// eslint-disable-next-line max-statements
|
|
109
|
-
function typeMemberAndSubTypeMember(str, node, parent, offset, prefix, joinWithCaller) {
|
|
120
|
+
function typeMemberAndSubTypeMember(str, parentNode, node, parent, offset, prefix, joinWithCaller, visitorMap) {
|
|
110
121
|
let innerDepth = 0;
|
|
111
122
|
const browseName = (parent || node).browseName.name.toString();
|
|
112
123
|
const r = [];
|
|
@@ -114,34 +125,49 @@ function opcuaToDot(node, options) {
|
|
|
114
125
|
const references = node.findReferencesEx("Aggregates", node_opcua_data_model_1.BrowseDirection.Forward);
|
|
115
126
|
const folderElements = node.findReferencesEx("Organizes", node_opcua_data_model_1.BrowseDirection.Forward);
|
|
116
127
|
const childReferences = [...references, ...folderElements];
|
|
128
|
+
const id = makeId(parentNode, browseName);
|
|
129
|
+
nodeRegistry.add(id, node);
|
|
130
|
+
function addInvisibleNode(prefix, index) {
|
|
131
|
+
const breakNode = `${prefix}${index}`;
|
|
132
|
+
r2.push(breakNode);
|
|
133
|
+
nodeRegistry.addInvisibleNode(breakNode);
|
|
134
|
+
return breakNode;
|
|
135
|
+
}
|
|
117
136
|
for (let i = 0; i < childReferences.length; i++) {
|
|
118
137
|
const isLast = i === childReferences.length - 1;
|
|
119
|
-
innerDepth++;
|
|
120
138
|
const reference = childReferences[i];
|
|
121
139
|
const childNode = reference.node;
|
|
122
140
|
const childName = childNode.browseName.name.toString();
|
|
123
|
-
|
|
141
|
+
const fullChildName = makeId(id, childName);
|
|
142
|
+
// avoid member duplication
|
|
143
|
+
if (visitorMap[fullChildName]) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
visitorMap[fullChildName] = 1;
|
|
148
|
+
}
|
|
149
|
+
innerDepth++;
|
|
150
|
+
nodeRegistry.add(fullChildName, childNode);
|
|
124
151
|
const edgeAttributes = arrowHead(reference);
|
|
125
|
-
const breakNode =
|
|
126
|
-
|
|
127
|
-
nodeRegistry.addInvisibleNode(breakNode);
|
|
128
|
-
const horizontalPart = `{ rank=same ${breakNode} -> ${childName} ${edgeAttributes} }`;
|
|
152
|
+
const breakNode = addInvisibleNode(prefix, i + offset);
|
|
153
|
+
const horizontalPart = `{ rank=same ${breakNode} -> ${fullChildName} ${edgeAttributes} }`;
|
|
129
154
|
r.push(horizontalPart);
|
|
130
155
|
// push children on same level
|
|
131
|
-
const [depth] = typeMemberAndSubTypeMember(str, childNode, null, 0, `${prefix}${i + offset}_`, false);
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
156
|
+
const [depth] = typeMemberAndSubTypeMember(str, id, childNode, null, 0, `${prefix}${i + offset}_`, false, visitorMap);
|
|
157
|
+
// add invisible nodes
|
|
158
|
+
{
|
|
159
|
+
for (let d = 0; d < depth; d++) {
|
|
160
|
+
offset++;
|
|
161
|
+
if (!isLast) {
|
|
162
|
+
addInvisibleNode(prefix, i + offset);
|
|
163
|
+
}
|
|
138
164
|
}
|
|
165
|
+
innerDepth += depth;
|
|
139
166
|
}
|
|
140
|
-
innerDepth += depth;
|
|
141
167
|
}
|
|
142
168
|
if (node.nodeClass == node_opcua_data_model_1.NodeClass.ObjectType || node.nodeClass === node_opcua_data_model_1.NodeClass.VariableType) {
|
|
143
169
|
if (node.subtypeOfObj && node.subtypeOfObj.nodeId.namespace === node.nodeId.namespace) {
|
|
144
|
-
const [depth, rr2] = typeMemberAndSubTypeMember(str, node.subtypeOfObj, node, r.length, prefix, true);
|
|
170
|
+
const [depth, rr2] = typeMemberAndSubTypeMember(str, parentNode, node.subtypeOfObj, node, r.length, prefix, true, visitorMap);
|
|
145
171
|
innerDepth += depth;
|
|
146
172
|
r2.push(...rr2);
|
|
147
173
|
}
|
|
@@ -151,12 +177,13 @@ function opcuaToDot(node, options) {
|
|
|
151
177
|
}
|
|
152
178
|
if (!joinWithCaller) {
|
|
153
179
|
if (r2.length) {
|
|
154
|
-
str.push(` ${
|
|
180
|
+
str.push(` ${id} -> ${r2.join(" -> ")} [arrowhead=none];`);
|
|
155
181
|
}
|
|
156
182
|
}
|
|
157
183
|
return [innerDepth, r2];
|
|
158
184
|
}
|
|
159
|
-
|
|
185
|
+
const visitorMap = {};
|
|
186
|
+
typeMemberAndSubTypeMember(str2, "", node, null, 0, "r", false, visitorMap);
|
|
160
187
|
if (!options.naked) {
|
|
161
188
|
dumpNodeByNodeClass(str, nodeRegistry);
|
|
162
189
|
}
|
|
@@ -172,7 +199,7 @@ function dumpClassHierachry(typeNode, options) {
|
|
|
172
199
|
const level = options.depth || 50;
|
|
173
200
|
const str = [];
|
|
174
201
|
const nodeRegistry = new NodeRegistry();
|
|
175
|
-
nodeRegistry.add(typeNode);
|
|
202
|
+
nodeRegistry.add(typeNode.browseName.name, typeNode);
|
|
176
203
|
str.push("digraph G {");
|
|
177
204
|
if (!options.naked) {
|
|
178
205
|
// str.push(" splines=ortho;");
|
|
@@ -188,7 +215,7 @@ function dumpClassHierachry(typeNode, options) {
|
|
|
188
215
|
const childNode = reference.node;
|
|
189
216
|
const nodeClass = node_opcua_data_model_1.NodeClass[childNode.nodeClass];
|
|
190
217
|
const childName = childNode.browseName.name.toString();
|
|
191
|
-
nodeRegistry.add(
|
|
218
|
+
nodeRegistry.add(childName, childNode);
|
|
192
219
|
const edgeAttributes = arrowHead(reference);
|
|
193
220
|
str.push(` ${childName} -> ${parentName} ${edgeAttributes};`);
|
|
194
221
|
if (level > 0) {
|
|
@@ -196,8 +223,27 @@ function dumpClassHierachry(typeNode, options) {
|
|
|
196
223
|
}
|
|
197
224
|
}
|
|
198
225
|
}
|
|
199
|
-
|
|
226
|
+
function dumpBaseTypes(str, typeNode, level) {
|
|
227
|
+
const parentName = typeNode.browseName.name.toString();
|
|
228
|
+
const references = typeNode.findReferencesEx("HasSubtype", node_opcua_data_model_1.BrowseDirection.Inverse);
|
|
229
|
+
for (let i = 0; i < references.length; i++) {
|
|
230
|
+
const reference = references[i];
|
|
231
|
+
const childNode = reference.node;
|
|
232
|
+
const nodeClass = node_opcua_data_model_1.NodeClass[childNode.nodeClass];
|
|
233
|
+
const childName = childNode.browseName.name.toString();
|
|
234
|
+
nodeRegistry.add(childName, childNode);
|
|
235
|
+
const edgeAttributes = arrowHead(reference);
|
|
236
|
+
str.push(` ${parentName} -> ${childName} ${edgeAttributes};`);
|
|
237
|
+
if (level > 0) {
|
|
238
|
+
dumpBaseTypes(str, childNode, level - 1);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
200
242
|
const str2 = [];
|
|
243
|
+
if (options.showBaseType) {
|
|
244
|
+
dumpBaseTypes(str2, typeNode, level);
|
|
245
|
+
}
|
|
246
|
+
/** */
|
|
201
247
|
if (options.showSubType) {
|
|
202
248
|
dumpSubtypes(str2, typeNode, level);
|
|
203
249
|
}
|
|
@@ -211,8 +257,9 @@ function dumpClassHierachry(typeNode, options) {
|
|
|
211
257
|
exports.dumpClassHierachry = dumpClassHierachry;
|
|
212
258
|
function graphVizToPlantUml(str) {
|
|
213
259
|
const ttt = "```";
|
|
214
|
-
return `${ttt}plantuml\n@startuml\n${str
|
|
260
|
+
return `${ttt}plantuml\n@startuml\n${str}\n@enduml\n${ttt}`;
|
|
215
261
|
}
|
|
262
|
+
exports.graphVizToPlantUml = graphVizToPlantUml;
|
|
216
263
|
function dumpTypeDiagram(namespace) {
|
|
217
264
|
const objectTypes = [...namespace._objectTypeIterator()];
|
|
218
265
|
const variableTypes = [...namespace._variableTypeIterator()];
|
|
@@ -222,13 +269,13 @@ function dumpTypeDiagram(namespace) {
|
|
|
222
269
|
const str = [];
|
|
223
270
|
for (const type of [...objectTypes, ...variableTypes]) {
|
|
224
271
|
const d = opcuaToDot(type);
|
|
225
|
-
str.push(graphVizToPlantUml(
|
|
272
|
+
str.push(graphVizToPlantUml(d));
|
|
226
273
|
const d2 = dumpClassHierachry(type);
|
|
227
|
-
str.push(graphVizToPlantUml(
|
|
274
|
+
str.push(graphVizToPlantUml(d2));
|
|
228
275
|
}
|
|
229
276
|
for (const dataType of dataTypes) {
|
|
230
277
|
const d = opcuaToDot(dataType);
|
|
231
|
-
str.push(graphVizToPlantUml(
|
|
278
|
+
str.push(graphVizToPlantUml(d));
|
|
232
279
|
}
|
|
233
280
|
return str.join("\n");
|
|
234
281
|
}
|