node-opcua-modeler 2.63.1 → 2.64.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.
- package/MyModel.NodeSet2.xml +125 -0
- package/dist/addExtensionObjectDataType.d.ts +21 -21
- package/dist/addExtensionObjectDataType.js +130 -130
- package/dist/buildModel.d.ts +16 -0
- package/dist/buildModel.js +91 -0
- package/dist/buildModel.js.map +1 -0
- package/dist/build_model_inner.d.ts +17 -17
- package/dist/build_model_inner.js +40 -40
- package/dist/display.d.ts +2 -0
- package/dist/display.js +96 -0
- package/dist/display.js.map +1 -0
- package/dist/displayNodeElement.d.ts +5 -5
- package/dist/displayNodeElement.js +191 -156
- package/dist/displayNodeElement.js.map +1 -1
- package/dist/dump_state_machine_to_graphviz.d.ts +6 -0
- package/dist/dump_state_machine_to_graphviz.js +120 -0
- package/dist/dump_state_machine_to_graphviz.js.map +1 -0
- package/dist/generate_markdown_doc.d.ts +6 -6
- package/dist/generate_markdown_doc.js +266 -155
- package/dist/generate_markdown_doc.js.map +1 -1
- package/dist/index.d.ts +24 -24
- package/dist/index.js +48 -48
- package/dist/promoteToMandatory.d.ts +8 -8
- package/dist/promoteToMandatory.js +97 -97
- package/dist/setNamespaceMetaData.d.ts +1 -1
- package/dist/setNamespaceMetaData.js +5 -5
- package/dist/symbol.d.ts +1 -1
- package/dist/symbol.js +2 -2
- package/dist/tableHelper.d.ts +9 -9
- package/dist/tableHelper.js +60 -60
- package/dist/to_cvs.d.ts +2 -2
- package/dist/to_cvs.js +11 -11
- package/dist/to_graphivz.d.ts +14 -13
- package/dist/to_graphivz.js +294 -235
- package/dist/to_graphivz.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +2 -2
- package/distNodeJS/build_documentation_to_file.d.ts +2 -2
- package/distNodeJS/build_documentation_to_file.js +26 -26
- package/distNodeJS/build_model.d.ts +7 -7
- package/distNodeJS/build_model.js +21 -21
- package/distNodeJS/index.d.ts +5 -5
- package/distNodeJS/index.js +19 -19
- package/distNodeJS/symbol_cvs.d.ts +3 -3
- package/distNodeJS/symbol_cvs.js +63 -63
- package/examples/make_model.ts +4 -3
- package/package.json +19 -19
- package/source/displayNodeElement.ts +165 -112
- package/source/dump_state_machine_to_graphviz.ts +164 -0
- package/source/generate_markdown_doc.ts +217 -82
- package/source/to_graphivz.ts +129 -48
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
/* eslint-disable max-statements */
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BaseNode,
|
|
4
|
+
dumpReferenceDescription,
|
|
5
|
+
Namespace,
|
|
6
|
+
UADataType,
|
|
7
|
+
UAObject,
|
|
8
|
+
UAObjectType,
|
|
9
|
+
UAReferenceType,
|
|
10
|
+
UAVariable,
|
|
11
|
+
UAVariableType
|
|
12
|
+
} from "node-opcua-address-space";
|
|
3
13
|
import { coerceUInt32 } from "node-opcua-basic-types";
|
|
4
|
-
import {
|
|
14
|
+
import { NodeClass } from "node-opcua-data-model";
|
|
15
|
+
import { NodeId } from "node-opcua-nodeid";
|
|
16
|
+
import { StructureField } from "node-opcua-types";
|
|
5
17
|
import { DataType } from "node-opcua-variant";
|
|
6
|
-
|
|
18
|
+
|
|
7
19
|
import { displayNodeElement } from "./displayNodeElement";
|
|
8
20
|
import { TableHelper } from "./tableHelper";
|
|
9
|
-
import { dumpClassHierachry, opcuaToDot } from "./to_graphivz";
|
|
21
|
+
import { dumpClassHierachry, graphVizToPlantUml, opcuaToDot } from "./to_graphivz";
|
|
10
22
|
|
|
11
23
|
interface NamespacePriv2 {
|
|
12
24
|
nodeIterator(): IterableIterator<BaseNode>;
|
|
@@ -42,48 +54,167 @@ export async function buildDocumentationToString(namespace: Namespace): Promise<
|
|
|
42
54
|
return writer.toString();
|
|
43
55
|
}
|
|
44
56
|
|
|
45
|
-
|
|
57
|
+
interface V {
|
|
58
|
+
valueRank?: number;
|
|
59
|
+
arrayDimensions?: number[];
|
|
60
|
+
dataType: NodeId;
|
|
61
|
+
}
|
|
62
|
+
const toDataTypeStr = (p: BaseNode): string => {
|
|
63
|
+
if (p.nodeClass === NodeClass.Variable) {
|
|
64
|
+
const v = p as UAVariable;
|
|
65
|
+
const arr = v.valueRank == 1 ? "[]" : "";
|
|
66
|
+
const brn = toDataTypeStr((p as UAVariable).dataTypeObj);
|
|
67
|
+
return brn + arr;
|
|
68
|
+
}
|
|
69
|
+
if (p.nodeClass === NodeClass.DataType) {
|
|
70
|
+
const dataType = p as UADataType;
|
|
71
|
+
const brn = dataType.browseName.toString();
|
|
72
|
+
return brn;
|
|
73
|
+
}
|
|
74
|
+
return "";
|
|
75
|
+
};
|
|
76
|
+
function dataTypeEnumerationToMarkdown(dataType: UADataType): string {
|
|
46
77
|
const addressSpace = dataType.addressSpace;
|
|
78
|
+
const writer = new Writer();
|
|
79
|
+
|
|
80
|
+
writer.writeLine("");
|
|
81
|
+
if (dataType.description) {
|
|
82
|
+
writer.writeLine(dataType.description.text || "");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
writer.writeLine(`\nThe fields of the ${dataType.browseName.name} DataType are defined in the following table:`);
|
|
86
|
+
|
|
87
|
+
writer.writeLine("");
|
|
88
|
+
const definition = dataType.getEnumDefinition();
|
|
89
|
+
writer.writeLine("\nBasic Type: " + (DataType as any)[DataType.Int32]);
|
|
90
|
+
writer.writeLine("");
|
|
91
|
+
|
|
92
|
+
const table = new TableHelper(["Name", "Value", "Description"]);
|
|
93
|
+
for (const f of definition.fields || []) {
|
|
94
|
+
table.push([f.name, coerceUInt32(f.value[1]), f.description.text || ""]);
|
|
95
|
+
}
|
|
96
|
+
writer.writeLine(table.toMarkdownTable());
|
|
97
|
+
|
|
98
|
+
const str = dumpTypeRepresentation(dataType);
|
|
99
|
+
writer.writeLine(str);
|
|
100
|
+
|
|
101
|
+
return writer.toString();
|
|
102
|
+
}
|
|
47
103
|
|
|
104
|
+
function dumpTypeRepresentation(uaType: UAObjectType | UADataType | UAReferenceType): string {
|
|
105
|
+
const className = NodeClass[uaType.nodeClass];
|
|
48
106
|
const writer = new Writer();
|
|
49
|
-
|
|
107
|
+
writer.writeLine("\n");
|
|
108
|
+
writer.writeLine(
|
|
109
|
+
`\nThe representation of the ${uaType.browseName.name} ${className} in the address space is shown in the following table:`
|
|
110
|
+
);
|
|
50
111
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
112
|
+
const table = new TableHelper(["Name", "Attribute"]);
|
|
113
|
+
table.push(["NodeId", uaType.nodeId.toString()]);
|
|
114
|
+
table.push(["NamespaceUri", uaType.addressSpace.getNamespaceUri(uaType.nodeId.namespace)]);
|
|
115
|
+
table.push(["BrowseName", uaType.browseName.name!.toString()]);
|
|
116
|
+
table.push(["NodeClass", NodeClass[uaType.nodeClass]]);
|
|
117
|
+
if (uaType.nodeClass === NodeClass.ReferenceType) {
|
|
118
|
+
table.push(["InverseName", (uaType as UAReferenceType).inverseName!.text]);
|
|
119
|
+
// table.push(["IsSymmetric", (uaType as UAReferenceType).isSymetric ? "Yes" : "No"]);
|
|
54
120
|
}
|
|
121
|
+
table.push(["IsAbstract", uaType.isAbstract ? "Yes" : "No"]);
|
|
122
|
+
table.push(["SubtypeOf", uaType.subtypeOfObj ? uaType.subtypeOfObj.browseName.toString() : ""]);
|
|
123
|
+
writer.writeLine("");
|
|
124
|
+
writer.writeLine(table.toMarkdownTable());
|
|
55
125
|
writer.writeLine("");
|
|
56
126
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
127
|
+
// forward refereces
|
|
128
|
+
{
|
|
129
|
+
const properties = uaType.findReferencesExAsObject("HasProperty");
|
|
130
|
+
const table = new TableHelper(["Reference", "NodeClass", "BrowseName", "DataType", "TypeDefinition", "ModellingRule"]);
|
|
60
131
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
132
|
+
if (uaType.subtypeOfObj) {
|
|
133
|
+
const referenceName = "HasSubType";
|
|
134
|
+
const p = uaType.subtypeOfObj!;
|
|
135
|
+
const nodeClass = NodeClass[p.nodeClass];
|
|
136
|
+
const browseName = p.browseName.toString();
|
|
137
|
+
const dataTypeStr = toDataTypeStr(p);
|
|
138
|
+
const modellingRule = p.modellingRule || "";
|
|
139
|
+
const typeDefinitionName = "";
|
|
140
|
+
table.push([referenceName, nodeClass, browseName, dataTypeStr, typeDefinitionName, modellingRule]);
|
|
64
141
|
}
|
|
142
|
+
if (properties.length > 0) {
|
|
143
|
+
writer.writeLine(`\nThe reference of the ${uaType.browseName.name} ${className} is shown in the following table:`);
|
|
144
|
+
writer.writeLine("");
|
|
145
|
+
for (const p of properties) {
|
|
146
|
+
const referenceName = "HasProperty";
|
|
147
|
+
const nodeClass = NodeClass[p.nodeClass];
|
|
148
|
+
const browseName = p.browseName.toString();
|
|
149
|
+
const dataTypeStr = toDataTypeStr(p);
|
|
150
|
+
const typeDefinitionName = (p as UAVariable | UAObject).typeDefinitionObj?.browseName.toString();
|
|
151
|
+
const modellingRule = p.modellingRule || "";
|
|
152
|
+
table.push([referenceName, nodeClass, browseName, dataTypeStr, typeDefinitionName, modellingRule]);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
writer.writeLine("");
|
|
65
156
|
writer.writeLine(table.toMarkdownTable());
|
|
66
|
-
|
|
67
|
-
|
|
157
|
+
writer.writeLine("");
|
|
158
|
+
}
|
|
159
|
+
return writer.toString();
|
|
160
|
+
}
|
|
161
|
+
function dataTypeStructureToMarkdown(dataType: UADataType): string {
|
|
162
|
+
const addressSpace = dataType.addressSpace;
|
|
163
|
+
const writer = new Writer();
|
|
68
164
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
165
|
+
writer.writeLine("");
|
|
166
|
+
if (dataType.description) {
|
|
167
|
+
writer.writeLine(dataType.description.text || "");
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const definition = dataType.getStructureDefinition();
|
|
171
|
+
writer.writeLine("\nBasic Type: " + (DataType as any)[dataType.basicDataType]);
|
|
172
|
+
writer.writeLine("");
|
|
173
|
+
writer.writeLine(`The fields of the ${dataType.browseName.name} DataType are defined in the following table:`);
|
|
174
|
+
|
|
175
|
+
const c = (f: StructureField) => {
|
|
176
|
+
let dataTypeString = addressSpace.findDataType(f.dataType)!.browseName.toString();
|
|
177
|
+
if (f.valueRank === 1) {
|
|
178
|
+
dataTypeString += "[]";
|
|
179
|
+
} else if (f.valueRank >= 2) {
|
|
180
|
+
dataTypeString += "[" + f.arrayDimensions?.map((d) => "" + d).join(" ") + "]";
|
|
81
181
|
}
|
|
82
|
-
|
|
182
|
+
// f.maxStringLength ? f.maxStringLength : "",
|
|
183
|
+
// f.arrayDimensions ? f.arrayDimensions : "",
|
|
184
|
+
return dataTypeString;
|
|
185
|
+
};
|
|
186
|
+
const table = new TableHelper(["Name", "Type", "Description"]);
|
|
187
|
+
table.push([dataType.browseName.name, "Structure"]);
|
|
188
|
+
for (const f of definition.fields || []) {
|
|
189
|
+
table.push([" " + f.name, c(f), (f.description.text || "").replace(/\n/g, "<br>")]);
|
|
190
|
+
}
|
|
191
|
+
writer.writeLine(table.toMarkdownTable());
|
|
192
|
+
|
|
193
|
+
const str = dumpTypeRepresentation(dataType);
|
|
194
|
+
writer.writeLine(str);
|
|
195
|
+
|
|
196
|
+
return writer.toString();
|
|
197
|
+
}
|
|
198
|
+
function dataTypeToMarkdown(dataType: UADataType): string {
|
|
199
|
+
if (dataType.isEnumeration()) {
|
|
200
|
+
return dataTypeEnumerationToMarkdown(dataType);
|
|
201
|
+
} else if (dataType.isStructure()) {
|
|
202
|
+
return dataTypeStructureToMarkdown(dataType);
|
|
83
203
|
} else {
|
|
204
|
+
const writer = new Writer();
|
|
205
|
+
writer.writeLine("");
|
|
206
|
+
if (dataType.description) {
|
|
207
|
+
writer.writeLine(dataType.description.text || "");
|
|
208
|
+
}
|
|
84
209
|
writer.writeLine("\nBasic Type: " + (DataType as any)[dataType.basicDataType]);
|
|
85
210
|
writer.writeLine("");
|
|
211
|
+
return writer.toString();
|
|
86
212
|
}
|
|
213
|
+
}
|
|
214
|
+
function dumpReferenceType(referenceType: UAReferenceType): string {
|
|
215
|
+
const writer = new Writer();
|
|
216
|
+
const str = dumpTypeRepresentation(referenceType);
|
|
217
|
+
writer.writeLine(str);
|
|
87
218
|
return writer.toString();
|
|
88
219
|
}
|
|
89
220
|
export async function buildDocumentation(namespace: Namespace, writer: IWriter): Promise<void> {
|
|
@@ -97,78 +228,82 @@ export async function buildDocumentation(namespace: Namespace, writer: IWriter):
|
|
|
97
228
|
writer.writeLine("");
|
|
98
229
|
writer.writeLine("# Namespace " + namespaceUri);
|
|
99
230
|
writer.writeLine("");
|
|
231
|
+
|
|
232
|
+
const namespacePriv = namespace as unknown as NamespacePriv2;
|
|
100
233
|
// -------------- writeReferences
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
234
|
+
if (namespacePriv._referenceTypeCount() > 0) {
|
|
235
|
+
writer.writeLine("");
|
|
236
|
+
writer.writeLine("## References ");
|
|
237
|
+
writer.writeLine("");
|
|
238
|
+
for (const referenceType of namespacePriv._referenceTypeIterator()) {
|
|
239
|
+
writer.writeLine("\n\n### reference " + referenceType.browseName.name!);
|
|
240
|
+
dumpReferenceType(referenceType);
|
|
241
|
+
}
|
|
107
242
|
}
|
|
108
|
-
|
|
109
243
|
function d(node: BaseNode): string {
|
|
110
244
|
return node.description ? node.description!.text!.toString() : "";
|
|
111
245
|
}
|
|
112
246
|
// -------------- writeDataType
|
|
113
|
-
|
|
114
|
-
writer.writeLine("## DataTypes");
|
|
115
|
-
writer.writeLine("");
|
|
116
|
-
for (const dataType of namespacePriv._dataTypeIterator()) {
|
|
117
|
-
writer.writeLine("\n\n### " + dataType.browseName.name!.toString());
|
|
247
|
+
if (namespacePriv._dataTypeCount() > 0) {
|
|
118
248
|
writer.writeLine("");
|
|
119
|
-
writer.writeLine(
|
|
249
|
+
writer.writeLine("## DataTypes");
|
|
250
|
+
writer.writeLine("");
|
|
251
|
+
for (const dataType of namespacePriv._dataTypeIterator()) {
|
|
252
|
+
writer.writeLine("\n\n### " + dataType.browseName.name!.toString());
|
|
253
|
+
writer.writeLine("");
|
|
254
|
+
writer.writeLine(dataTypeToMarkdown(dataType));
|
|
255
|
+
}
|
|
120
256
|
}
|
|
121
257
|
// -------------- writeObjectType
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
258
|
+
if (namespacePriv._objectTypeCount() > 0) {
|
|
259
|
+
writer.writeLine("");
|
|
260
|
+
writer.writeLine("## ObjectTypes");
|
|
261
|
+
writer.writeLine("");
|
|
262
|
+
for (const objectType of namespacePriv._objectTypeIterator()) {
|
|
263
|
+
writer.writeLine("\n\n### " + objectType.browseName.name!.toString());
|
|
264
|
+
writer.writeLine(d(objectType));
|
|
128
265
|
|
|
129
|
-
|
|
266
|
+
writer.writeLine(graphVizToPlantUml(dumpClassHierachry(objectType, { showBaseType: true, depth: 2 })));
|
|
130
267
|
|
|
131
|
-
|
|
268
|
+
writer.writeLine(graphVizToPlantUml(opcuaToDot(objectType)));
|
|
132
269
|
|
|
133
|
-
|
|
134
|
-
|
|
270
|
+
// enumerate components
|
|
271
|
+
writer.writeLine(displayNodeElement(objectType, { format: "markdown" }));
|
|
135
272
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
273
|
+
for (const comp of objectType.getComponents()) {
|
|
274
|
+
writer.writeLine("\n\n#### " + comp.browseName.name!.toString());
|
|
275
|
+
writer.writeLine("");
|
|
276
|
+
writer.writeLine(d(comp));
|
|
277
|
+
}
|
|
278
|
+
for (const comp of objectType.getProperties()) {
|
|
279
|
+
writer.writeLine("\n\n#### " + comp.browseName.name!.toString());
|
|
280
|
+
writer.writeLine("");
|
|
281
|
+
writer.writeLine(d(comp));
|
|
282
|
+
}
|
|
145
283
|
}
|
|
146
284
|
}
|
|
147
285
|
// -------------- writeVariableType
|
|
148
|
-
|
|
149
|
-
writer.writeLine("## VariableTypes");
|
|
150
|
-
writer.writeLine("");
|
|
151
|
-
for (const variableType of namespacePriv._variableTypeIterator()) {
|
|
152
|
-
writer.writeLine("\n\n### " + variableType.browseName.name!.toString());
|
|
153
|
-
writer.writeLine(d(variableType));
|
|
286
|
+
if (namespacePriv._variableTypeCount() > 0) {
|
|
154
287
|
writer.writeLine("");
|
|
288
|
+
writer.writeLine("## VariableTypes");
|
|
289
|
+
writer.writeLine("");
|
|
290
|
+
for (const variableType of namespacePriv._variableTypeIterator()) {
|
|
291
|
+
writer.writeLine("\n\n### " + variableType.browseName.name!.toString());
|
|
292
|
+
writer.writeLine(d(variableType));
|
|
293
|
+
writer.writeLine("");
|
|
155
294
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
writer.writeLine(graphVizToPlantUml(opcuaToDot(variableType)));
|
|
295
|
+
writer.writeLine(graphVizToPlantUml(dumpClassHierachry(variableType, { showBaseType: true, depth: 2 })));
|
|
159
296
|
|
|
297
|
+
writer.writeLine(graphVizToPlantUml(opcuaToDot(variableType)));
|
|
160
298
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
299
|
+
// enumerate components
|
|
300
|
+
writer.writeLine(displayNodeElement(variableType, { format: "markdown" }));
|
|
301
|
+
for (const reference of variableType.allReferences()) {
|
|
302
|
+
const n = reference.node!;
|
|
303
|
+
writer.writeLine("\n\n#### " + n.browseName.name!.toString());
|
|
304
|
+
writer.writeLine("");
|
|
305
|
+
writer.writeLine(d(n));
|
|
306
|
+
}
|
|
168
307
|
}
|
|
169
308
|
}
|
|
170
309
|
}
|
|
171
|
-
function graphVizToPlantUml(arg0: string): any {
|
|
172
|
-
throw new Error("Function not implemented.");
|
|
173
|
-
}
|
|
174
|
-
|