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.
Files changed (51) hide show
  1. package/MyModel.NodeSet2.xml +125 -0
  2. package/dist/addExtensionObjectDataType.d.ts +21 -21
  3. package/dist/addExtensionObjectDataType.js +130 -130
  4. package/dist/buildModel.d.ts +16 -0
  5. package/dist/buildModel.js +91 -0
  6. package/dist/buildModel.js.map +1 -0
  7. package/dist/build_model_inner.d.ts +17 -17
  8. package/dist/build_model_inner.js +40 -40
  9. package/dist/display.d.ts +2 -0
  10. package/dist/display.js +96 -0
  11. package/dist/display.js.map +1 -0
  12. package/dist/displayNodeElement.d.ts +5 -5
  13. package/dist/displayNodeElement.js +191 -156
  14. package/dist/displayNodeElement.js.map +1 -1
  15. package/dist/dump_state_machine_to_graphviz.d.ts +6 -0
  16. package/dist/dump_state_machine_to_graphviz.js +120 -0
  17. package/dist/dump_state_machine_to_graphviz.js.map +1 -0
  18. package/dist/generate_markdown_doc.d.ts +6 -6
  19. package/dist/generate_markdown_doc.js +266 -155
  20. package/dist/generate_markdown_doc.js.map +1 -1
  21. package/dist/index.d.ts +24 -24
  22. package/dist/index.js +48 -48
  23. package/dist/promoteToMandatory.d.ts +8 -8
  24. package/dist/promoteToMandatory.js +97 -97
  25. package/dist/setNamespaceMetaData.d.ts +1 -1
  26. package/dist/setNamespaceMetaData.js +5 -5
  27. package/dist/symbol.d.ts +1 -1
  28. package/dist/symbol.js +2 -2
  29. package/dist/tableHelper.d.ts +9 -9
  30. package/dist/tableHelper.js +60 -60
  31. package/dist/to_cvs.d.ts +2 -2
  32. package/dist/to_cvs.js +11 -11
  33. package/dist/to_graphivz.d.ts +14 -13
  34. package/dist/to_graphivz.js +294 -235
  35. package/dist/to_graphivz.js.map +1 -1
  36. package/dist/types.d.ts +1 -1
  37. package/dist/types.js +2 -2
  38. package/distNodeJS/build_documentation_to_file.d.ts +2 -2
  39. package/distNodeJS/build_documentation_to_file.js +26 -26
  40. package/distNodeJS/build_model.d.ts +7 -7
  41. package/distNodeJS/build_model.js +21 -21
  42. package/distNodeJS/index.d.ts +5 -5
  43. package/distNodeJS/index.js +19 -19
  44. package/distNodeJS/symbol_cvs.d.ts +3 -3
  45. package/distNodeJS/symbol_cvs.js +63 -63
  46. package/examples/make_model.ts +4 -3
  47. package/package.json +19 -19
  48. package/source/displayNodeElement.ts +165 -112
  49. package/source/dump_state_machine_to_graphviz.ts +164 -0
  50. package/source/generate_markdown_doc.ts +217 -82
  51. package/source/to_graphivz.ts +129 -48
@@ -1,12 +1,24 @@
1
1
  /* eslint-disable max-statements */
2
- import { BaseNode, Namespace, UADataType, UAObjectType, UAReferenceType, UAVariableType } from "node-opcua-address-space";
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 { DataTypeDefinition, EnumDefinition, StructureDefinition, StructureField } from "node-opcua-types";
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
- import { object } from "underscore";
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
- function dataTypeToMarkdown(dataType: UADataType): string {
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
- const definition: DataTypeDefinition = dataType.getDefinition();
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
- writer.writeLine("\nisAbstract: " + (dataType.isAbstract ? "Yes" : "No"));
52
- if (dataType.subtypeOfObj) {
53
- writer.writeLine("\nSubtype of " + dataType.subtypeOfObj?.browseName.toString());
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
- if (definition instanceof EnumDefinition) {
58
- writer.writeLine("\nBasic Type: " + (DataType as any)[DataType.UInt32]);
59
- writer.writeLine("");
127
+ // forward refereces
128
+ {
129
+ const properties = uaType.findReferencesExAsObject("HasProperty");
130
+ const table = new TableHelper(["Reference", "NodeClass", "BrowseName", "DataType", "TypeDefinition", "ModellingRule"]);
60
131
 
61
- const table = new TableHelper(["Name", "Value", "Description"]);
62
- for (const f of definition.fields || []) {
63
- table.push([f.name, coerceUInt32(f.value[1]), f.description.text || ""]);
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
- } else if (definition instanceof StructureDefinition) {
67
- writer.writeLine("\nBasic Type: " + (DataType as any)[dataType.basicDataType]);
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
- const table = new TableHelper(["Name", "data type", "value rank", "maxStringLength", "Dimensions", "Description"]);
70
-
71
- for (const f of definition.fields || []) {
72
- const dataTypeString = addressSpace.findDataType(f.dataType)!.browseName.toString();
73
- table.push([
74
- f.name,
75
- dataTypeString,
76
- f.valueRank ? f.valueRank : "",
77
- f.maxStringLength ? f.maxStringLength : "",
78
- f.arrayDimensions ? f.arrayDimensions : "",
79
- f.description.text || ""
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
- writer.writeLine(table.toMarkdownTable());
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
- const namespacePriv = (namespace as unknown) as NamespacePriv2;
102
- writer.writeLine("");
103
- writer.writeLine("## References ");
104
- writer.writeLine("");
105
- for (const referenceType of namespacePriv._referenceTypeIterator()) {
106
- writer.writeLine("\n\n### reference " + referenceType.browseName.name!);
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
- writer.writeLine("");
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(dataTypeToMarkdown(dataType));
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
- writer.writeLine("");
123
- writer.writeLine("## ObjectTypes");
124
- writer.writeLine("");
125
- for (const objectType of namespacePriv._objectTypeIterator()) {
126
- writer.writeLine("\n\n### " + objectType.browseName.name!.toString());
127
- writer.writeLine(d(objectType));
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
- writer.writeLine(graphVizToPlantUml(dumpClassHierachry(objectType, {showBaseType: true, depth: 2})));
266
+ writer.writeLine(graphVizToPlantUml(dumpClassHierachry(objectType, { showBaseType: true, depth: 2 })));
130
267
 
131
- writer.writeLine(graphVizToPlantUml(opcuaToDot(objectType)));
268
+ writer.writeLine(graphVizToPlantUml(opcuaToDot(objectType)));
132
269
 
133
- // enumerate components
134
- writer.writeLine(displayNodeElement(objectType, { format: "markdown" }));
270
+ // enumerate components
271
+ writer.writeLine(displayNodeElement(objectType, { format: "markdown" }));
135
272
 
136
- for (const comp of objectType.getComponents()) {
137
- writer.writeLine("\n\n#### " + comp.browseName.name!.toString());
138
- writer.writeLine("");
139
- writer.writeLine(d(comp));
140
- }
141
- for (const comp of objectType.getProperties()) {
142
- writer.writeLine("\n\n#### " + comp.browseName.name!.toString());
143
- writer.writeLine("");
144
- writer.writeLine(d(comp));
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
- writer.writeLine("");
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
- writer.writeLine(graphVizToPlantUml(dumpClassHierachry(variableType, {showBaseType: true, depth: 2})));
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
- // enumerate components
162
- writer.writeLine(displayNodeElement(variableType, { format: "markdown" }));
163
- for (const reference of variableType.allReferences()) {
164
- const n = reference.node!;
165
- writer.writeLine("\n\n#### " + n.browseName.name!.toString());
166
- writer.writeLine("");
167
- writer.writeLine(d(n));
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
-