node-opcua-schemas 2.75.0 → 2.77.0
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/source/dynamic_extension_object.d.ts +4 -4
- package/dist/source/dynamic_extension_object.js +95 -77
- package/dist/source/dynamic_extension_object.js.map +1 -1
- package/dist/source/parse_binary_xsd.d.ts +11 -8
- package/dist/source/parse_binary_xsd.js +55 -53
- package/dist/source/parse_binary_xsd.js.map +1 -1
- package/dist/source/toTypeScript.js +11 -7
- package/dist/source/toTypeScript.js.map +1 -1
- package/dist/source/tools.d.ts +2 -2
- package/dist/source/tools.js +70 -86
- package/dist/source/tools.js.map +1 -1
- package/package.json +17 -16
- package/source/dynamic_extension_object.ts +113 -88
- package/source/parse_binary_xsd.ts +107 -74
- package/source/toTypeScript.ts +19 -10
- package/source/tools.ts +73 -88
|
@@ -61,21 +61,6 @@ const predefinedType: any = {
|
|
|
61
61
|
"ua:XmlElement": 1
|
|
62
62
|
};
|
|
63
63
|
|
|
64
|
-
const found: any = {};
|
|
65
|
-
|
|
66
|
-
function resolveType(typeDictionary: string, typeName: string) {
|
|
67
|
-
const namespace = typeName.split(":")[0];
|
|
68
|
-
if (predefinedType[typeName]) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (!found[typeName]) {
|
|
72
|
-
found[typeName] = typeName;
|
|
73
|
-
}
|
|
74
|
-
if (namespace === "ua") {
|
|
75
|
-
/** */
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
64
|
export interface EnumeratedType {
|
|
80
65
|
name: string;
|
|
81
66
|
documentation?: string;
|
|
@@ -85,36 +70,79 @@ export interface EnumeratedType {
|
|
|
85
70
|
|
|
86
71
|
export interface StructureTypeRaw {
|
|
87
72
|
name: string;
|
|
88
|
-
baseType
|
|
73
|
+
baseType: string;
|
|
89
74
|
base?: StructureTypeRaw;
|
|
90
75
|
fields: any[];
|
|
91
76
|
}
|
|
92
77
|
|
|
93
78
|
export interface ITypeDictionary {
|
|
94
79
|
targetNamespace: string;
|
|
80
|
+
defaultByteOrder: string;
|
|
95
81
|
imports: string[];
|
|
96
|
-
structuredTypesRaw: StructureTypeRaw[];
|
|
97
|
-
enumeratedTypesRaw: EnumeratedType[];
|
|
98
82
|
}
|
|
99
83
|
|
|
100
|
-
export class
|
|
84
|
+
export class InternalTypeDictionary implements ITypeDictionary {
|
|
101
85
|
public targetNamespace = "";
|
|
86
|
+
public defaultByteOrder = "";
|
|
102
87
|
public imports: string[] = [];
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
private
|
|
88
|
+
|
|
89
|
+
private structuredTypesRaw: Record<string, StructureTypeRaw> = {};
|
|
90
|
+
private enumeratedTypesRaw: Record<string, EnumeratedType> = {};
|
|
91
|
+
|
|
92
|
+
// tns: "http://opcfoundation.org/a/b"
|
|
93
|
+
public _namespaces: Record<string, string> = {};
|
|
94
|
+
|
|
106
95
|
constructor() {
|
|
107
96
|
/** */
|
|
108
97
|
}
|
|
109
|
-
public
|
|
110
|
-
this.
|
|
111
|
-
|
|
98
|
+
public addEnumeration(name: string, e: EnumeratedType): void {
|
|
99
|
+
this.enumeratedTypesRaw[name] = e;
|
|
100
|
+
}
|
|
101
|
+
public getEnumerations(): EnumeratedType[] {
|
|
102
|
+
return Object.values(this.enumeratedTypesRaw);
|
|
103
|
+
}
|
|
104
|
+
public getStructures(): StructureTypeRaw[] {
|
|
105
|
+
return Object.values(this.structuredTypesRaw);
|
|
106
|
+
}
|
|
107
|
+
public addStructureRaw(structuredType: StructureTypeRaw): void {
|
|
108
|
+
this.structuredTypesRaw[structuredType.name] = structuredType;
|
|
112
109
|
}
|
|
113
110
|
public getStructuredTypesRawByName(name: string): StructureTypeRaw {
|
|
114
|
-
|
|
111
|
+
name = name.split(":")[1] || name;
|
|
112
|
+
return this.structuredTypesRaw[name]! as StructureTypeRaw;
|
|
115
113
|
}
|
|
116
114
|
}
|
|
117
115
|
|
|
116
|
+
interface _IParser {
|
|
117
|
+
attrs: any;
|
|
118
|
+
text?: string;
|
|
119
|
+
}
|
|
120
|
+
interface ITypeDefinitionParser extends _IParser {
|
|
121
|
+
typeDictionary: InternalTypeDictionary;
|
|
122
|
+
engine: { typeDictionary: InternalTypeDictionary };
|
|
123
|
+
}
|
|
124
|
+
interface IEnumeratedTypeParser extends _IParser {
|
|
125
|
+
typescriptDefinition: string;
|
|
126
|
+
enumeratedType: EnumeratedType;
|
|
127
|
+
parent: { typeDictionary: InternalTypeDictionary };
|
|
128
|
+
}
|
|
129
|
+
interface IEnumeratedTypeDocumentParser extends _IParser {
|
|
130
|
+
parent: IEnumeratedTypeParser;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
interface IEnumeratedTypeEnumeratedValueParser extends _IParser {
|
|
134
|
+
parent: IEnumeratedTypeParser;
|
|
135
|
+
}
|
|
136
|
+
interface IStructureTypeParser extends _IParser {
|
|
137
|
+
structuredType: Omit<StructuredTypeOptions, "dataTypeFactory">;
|
|
138
|
+
parent: { typeDictionary: InternalTypeDictionary };
|
|
139
|
+
}
|
|
140
|
+
interface IImportParser extends _IParser {
|
|
141
|
+
parent: { typeDictionary: InternalTypeDictionary };
|
|
142
|
+
}
|
|
143
|
+
interface IStructureTypeFieldParser extends _IParser {
|
|
144
|
+
parent: IStructureTypeParser;
|
|
145
|
+
}
|
|
118
146
|
/* tslint:disable:object-literal-shorthand */
|
|
119
147
|
const state0: any = {
|
|
120
148
|
init: () => {
|
|
@@ -122,17 +150,25 @@ const state0: any = {
|
|
|
122
150
|
},
|
|
123
151
|
parser: {
|
|
124
152
|
TypeDictionary: {
|
|
125
|
-
init: function (this:
|
|
126
|
-
this.typeDictionary = this.engine.typeDictionary
|
|
153
|
+
init: function (this: ITypeDefinitionParser, name: string, attributes: Record<string, string>) {
|
|
154
|
+
this.typeDictionary = this.engine.typeDictionary;
|
|
127
155
|
this.typeDictionary.defaultByteOrder = attributes.DefaultByteOrder;
|
|
128
156
|
this.typeDictionary.targetNamespace = attributes.TargetNamespace;
|
|
157
|
+
|
|
158
|
+
for (const [k, v] of Object.entries(attributes)) {
|
|
159
|
+
if (k.match(/xmlns:/)) {
|
|
160
|
+
const ns = k.split(":")[1];
|
|
161
|
+
this.typeDictionary._namespaces[ns] = v;
|
|
162
|
+
this.typeDictionary._namespaces[v] = ns;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
129
165
|
},
|
|
130
166
|
parser: {
|
|
131
167
|
Import: {
|
|
132
|
-
init: function (this:
|
|
168
|
+
init: function (this: IImportParser, name: string, attributes: any) {
|
|
133
169
|
this.parent.typeDictionary.imports.push(attributes.Namespace);
|
|
134
170
|
},
|
|
135
|
-
finish: function (this:
|
|
171
|
+
finish: function (this: IImportParser) {
|
|
136
172
|
// _register_namespace_uri(this.text);
|
|
137
173
|
// istanbul ignore next
|
|
138
174
|
if (doDebug) {
|
|
@@ -142,7 +178,7 @@ const state0: any = {
|
|
|
142
178
|
},
|
|
143
179
|
|
|
144
180
|
EnumeratedType: {
|
|
145
|
-
init: function (this:
|
|
181
|
+
init: function (this: IEnumeratedTypeParser) {
|
|
146
182
|
this.typescriptDefinition = "";
|
|
147
183
|
// istanbul ignore next
|
|
148
184
|
if (doDebug) {
|
|
@@ -164,12 +200,12 @@ const state0: any = {
|
|
|
164
200
|
},
|
|
165
201
|
parser: {
|
|
166
202
|
Documentation: {
|
|
167
|
-
finish: function (this:
|
|
203
|
+
finish: function (this: IEnumeratedTypeDocumentParser) {
|
|
168
204
|
this.parent.enumeratedType.documentation = this.text;
|
|
169
205
|
}
|
|
170
206
|
},
|
|
171
207
|
EnumeratedValue: {
|
|
172
|
-
finish: function (this:
|
|
208
|
+
finish: function (this: IEnumeratedTypeEnumeratedValueParser) {
|
|
173
209
|
// istanbul ignore next
|
|
174
210
|
if (doDebug) {
|
|
175
211
|
debugLog(" EnumeratedValue Name=", w(this.attrs.Name, 40), " Value=", this.attrs.Value);
|
|
@@ -182,9 +218,9 @@ const state0: any = {
|
|
|
182
218
|
}
|
|
183
219
|
}
|
|
184
220
|
},
|
|
185
|
-
finish: function (this:
|
|
221
|
+
finish: function (this: IEnumeratedTypeParser) {
|
|
186
222
|
this.typescriptDefinition += `\n}`;
|
|
187
|
-
this.parent.typeDictionary.
|
|
223
|
+
this.parent.typeDictionary.addEnumeration(this.attrs.Name, this.enumeratedType);
|
|
188
224
|
// istanbul ignore next
|
|
189
225
|
if (doDebug) {
|
|
190
226
|
debugLog(" this.typescriptDefinition = ", this.typescriptDefinition);
|
|
@@ -192,7 +228,7 @@ const state0: any = {
|
|
|
192
228
|
}
|
|
193
229
|
},
|
|
194
230
|
StructuredType: {
|
|
195
|
-
init: function (this:
|
|
231
|
+
init: function (this: IStructureTypeParser) {
|
|
196
232
|
// istanbul ignore next
|
|
197
233
|
if (doDebug) {
|
|
198
234
|
debugLog(
|
|
@@ -205,21 +241,16 @@ const state0: any = {
|
|
|
205
241
|
|
|
206
242
|
const baseType = this.attrs.BaseType;
|
|
207
243
|
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
const structuredType: StructuredTypeOptions = {
|
|
244
|
+
const structuredType: Omit<StructuredTypeOptions, "dataTypeFactory"> = {
|
|
211
245
|
name: this.attrs.Name,
|
|
212
|
-
baseType
|
|
246
|
+
baseType,
|
|
213
247
|
fields: []
|
|
214
248
|
};
|
|
215
|
-
if (base) {
|
|
216
|
-
structuredType.base = base;
|
|
217
|
-
}
|
|
218
249
|
this.structuredType = structuredType;
|
|
219
250
|
},
|
|
220
251
|
parser: {
|
|
221
252
|
Field: {
|
|
222
|
-
finish: function (this:
|
|
253
|
+
finish: function (this: IStructureTypeFieldParser) {
|
|
223
254
|
if (this.attrs.SourceType) {
|
|
224
255
|
// ignore this field, This is a repetition of the base type field with same name
|
|
225
256
|
return;
|
|
@@ -243,14 +274,13 @@ const state0: any = {
|
|
|
243
274
|
// chalk.yellow(" lengthField="), w(this.attrs.LengthField, 40)
|
|
244
275
|
);
|
|
245
276
|
}
|
|
246
|
-
resolveType(this.parent.typeDictionary, this.attrs.TypeName);
|
|
247
277
|
|
|
248
278
|
const field: FieldInterfaceOptions = {
|
|
249
279
|
name: this.attrs.Name,
|
|
250
280
|
fieldType: this.attrs.TypeName
|
|
251
281
|
};
|
|
252
282
|
|
|
253
|
-
const structuredType
|
|
283
|
+
const structuredType = this.parent.structuredType;
|
|
254
284
|
if (field.fieldType === "opc:Bit") {
|
|
255
285
|
// do something to collect bits but ignore them as field
|
|
256
286
|
structuredType.bitFields = structuredType.bitFields || [];
|
|
@@ -309,9 +339,9 @@ const state0: any = {
|
|
|
309
339
|
}
|
|
310
340
|
}
|
|
311
341
|
},
|
|
312
|
-
finish: function (this:
|
|
342
|
+
finish: function (this: IStructureTypeParser) {
|
|
313
343
|
assert(this.attrs.Name === this.structuredType.name);
|
|
314
|
-
this.parent.typeDictionary.
|
|
344
|
+
this.parent.typeDictionary.addStructureRaw(this.structuredType);
|
|
315
345
|
}
|
|
316
346
|
}
|
|
317
347
|
}
|
|
@@ -329,29 +359,27 @@ export interface MapDataTypeAndEncodingIdProvider {
|
|
|
329
359
|
// getDataTypeNodeId(key: string): NodeId;
|
|
330
360
|
getDataTypeAndEncodingId(key: string): DataTypeAndEncodingId | null;
|
|
331
361
|
}
|
|
332
|
-
|
|
362
|
+
interface WithTypeDictionary extends Xml2Json {
|
|
363
|
+
typeDictionary: InternalTypeDictionary;
|
|
364
|
+
}
|
|
333
365
|
export function parseBinaryXSD(
|
|
334
366
|
xmlString: string,
|
|
335
367
|
idProvider: MapDataTypeAndEncodingIdProvider,
|
|
336
368
|
dataTypeFactory: DataTypeFactory,
|
|
337
369
|
callback: (err?: Error | null) => void
|
|
338
370
|
): void {
|
|
339
|
-
const parser = new Xml2Json(state0);
|
|
340
|
-
const typeDictionary = new
|
|
341
|
-
|
|
371
|
+
const parser = new Xml2Json(state0) as WithTypeDictionary;
|
|
372
|
+
const typeDictionary = new InternalTypeDictionary();
|
|
373
|
+
parser.typeDictionary = typeDictionary;
|
|
342
374
|
|
|
343
375
|
parser.parseString(xmlString, (err?: Error | null) => {
|
|
344
376
|
// resolve and prepare enumerations
|
|
345
|
-
for (const
|
|
346
|
-
if (!Object.prototype.hasOwnProperty.call(typeDictionary.enumeratedTypesRaw, key)) {
|
|
347
|
-
continue;
|
|
348
|
-
}
|
|
349
|
-
const enumeratedType = typeDictionary.enumeratedTypesRaw[key];
|
|
377
|
+
for (const enumeratedType of typeDictionary.getEnumerations()) {
|
|
350
378
|
if (Object.keys(enumeratedType.enumeratedValues).length >= 1) {
|
|
351
379
|
const e = new EnumerationDefinitionSchema({
|
|
352
380
|
lengthInBits: enumeratedType.lengthInBits || 32,
|
|
353
381
|
enumValues: enumeratedType.enumeratedValues,
|
|
354
|
-
name:
|
|
382
|
+
name: enumeratedType.name
|
|
355
383
|
});
|
|
356
384
|
dataTypeFactory.registerEnumeration(e);
|
|
357
385
|
}
|
|
@@ -360,43 +388,49 @@ export function parseBinaryXSD(
|
|
|
360
388
|
// istanbul ignore next
|
|
361
389
|
if (doDebug) {
|
|
362
390
|
debugLog("------------------------------- Resolving complex Type");
|
|
363
|
-
typeDictionary.
|
|
391
|
+
typeDictionary.getStructures().map((x: any) => debugLog(x.name));
|
|
364
392
|
}
|
|
365
393
|
|
|
366
394
|
// create area in navigation order
|
|
367
395
|
function createExplorationOrder(): StructureTypeRaw[] {
|
|
368
396
|
const array: StructureTypeRaw[] = [];
|
|
369
|
-
const
|
|
370
|
-
|
|
397
|
+
const _map: Record<string, string> = {};
|
|
398
|
+
function alreadyVisited(name: string) {
|
|
399
|
+
name = name.split(":")[1] || name;
|
|
400
|
+
return !!_map[name];
|
|
401
|
+
}
|
|
402
|
+
function markAsVisited(name: string) {
|
|
403
|
+
name = name.split(":")[1] || name;
|
|
404
|
+
_map[name] = "1";
|
|
405
|
+
}
|
|
371
406
|
function visitStructure(structuredType: StructureTypeRaw) {
|
|
372
|
-
if (!structuredType) {
|
|
407
|
+
if (!structuredType || structuredType.name === "ua:ExtensionObject") {
|
|
373
408
|
return;
|
|
374
409
|
}
|
|
375
|
-
if (
|
|
410
|
+
if (alreadyVisited(structuredType.name)) {
|
|
376
411
|
return;
|
|
377
412
|
}
|
|
378
|
-
|
|
413
|
+
markAsVisited(structuredType.name);
|
|
414
|
+
if (structuredType.baseType && structuredType.baseType !== "ua:ExtensionObject") {
|
|
379
415
|
const base = typeDictionary.getStructuredTypesRawByName(structuredType.baseType);
|
|
380
|
-
if (base) {
|
|
416
|
+
if (base && base.baseType) {
|
|
417
|
+
doDebug && debugLog(" investigating base", chalk.cyan(base.name));
|
|
381
418
|
visitStructure(base);
|
|
382
419
|
}
|
|
383
420
|
}
|
|
384
421
|
for (const f of structuredType.fields) {
|
|
385
|
-
const
|
|
386
|
-
const s = typeDictionary.getStructuredTypesRawByName(fieldType);
|
|
422
|
+
const s = typeDictionary.getStructuredTypesRawByName(f.fieldType);
|
|
387
423
|
if (s !== structuredType && s) {
|
|
388
424
|
visitStructure(s);
|
|
389
425
|
} else {
|
|
390
|
-
|
|
426
|
+
markAsVisited(f.fieldType);
|
|
391
427
|
}
|
|
392
428
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
array.push(structuredType);
|
|
396
|
-
}
|
|
429
|
+
doDebug && debugLog("processing ", chalk.cyan(structuredType.name));
|
|
430
|
+
array.push(structuredType);
|
|
397
431
|
}
|
|
398
432
|
|
|
399
|
-
for (const structuredType of typeDictionary.
|
|
433
|
+
for (const structuredType of typeDictionary.getStructures()) {
|
|
400
434
|
visitStructure(structuredType);
|
|
401
435
|
}
|
|
402
436
|
return array;
|
|
@@ -404,7 +438,6 @@ export function parseBinaryXSD(
|
|
|
404
438
|
// resolve complex types
|
|
405
439
|
const schemaInVisitingOrder = createExplorationOrder();
|
|
406
440
|
for (const structuredType of schemaInVisitingOrder) {
|
|
407
|
-
debugLog("processing ", chalk.cyan(structuredType.name));
|
|
408
441
|
getOrCreateStructuredTypeSchema(structuredType.name, typeDictionary, dataTypeFactory, idProvider);
|
|
409
442
|
}
|
|
410
443
|
callback(err);
|
package/source/toTypeScript.ts
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ConstructorFuncWithSchema,
|
|
3
|
+
DataTypeFactory,
|
|
4
|
+
EnumerationDefinitionSchema,
|
|
5
|
+
IStructuredTypeSchema,
|
|
6
|
+
StructureInfo
|
|
7
|
+
} from "node-opcua-factory";
|
|
2
8
|
|
|
3
9
|
export function toTypeScript(dataTypeFactory: DataTypeFactory): string {
|
|
4
|
-
const enumeratedTypes: Map<string, EnumerationDefinitionSchema> = (
|
|
5
|
-
const
|
|
10
|
+
const enumeratedTypes: Map<string, EnumerationDefinitionSchema> = new Map();
|
|
11
|
+
for (const k of dataTypeFactory.enumerations()) {
|
|
12
|
+
enumeratedTypes.set(k, dataTypeFactory.getEnumeration(k)!);
|
|
13
|
+
}
|
|
14
|
+
const structuredTypes: Map<string, StructureInfo> = new Map();
|
|
15
|
+
for (const k of dataTypeFactory.structuredTypesNames()) {
|
|
16
|
+
structuredTypes.set(k, dataTypeFactory.getStructureInfoByTypeName(k)!);
|
|
17
|
+
}
|
|
6
18
|
|
|
7
19
|
const declaration: Map<string, string> = new Map();
|
|
8
20
|
|
|
@@ -12,7 +24,7 @@ export function toTypeScript(dataTypeFactory: DataTypeFactory): string {
|
|
|
12
24
|
} else if (t === "Boolean") {
|
|
13
25
|
t = "UABoolean";
|
|
14
26
|
}
|
|
15
|
-
|
|
27
|
+
|
|
16
28
|
if (!enumeratedTypes.has(t) && !structuredTypes.has(t)) {
|
|
17
29
|
declaration.set(t, t);
|
|
18
30
|
}
|
|
@@ -35,15 +47,12 @@ export function toTypeScript(dataTypeFactory: DataTypeFactory): string {
|
|
|
35
47
|
const alreadyDone: Set<string> = new Set();
|
|
36
48
|
function dumpType(o: IStructuredTypeSchema) {
|
|
37
49
|
// base type first
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
const bt = structuredTypes.get(b)?.schema;
|
|
41
|
-
|
|
42
|
-
if (b && !alreadyDone.has(o.baseType) && bt) {
|
|
50
|
+
const bt = o.getBaseSchema();
|
|
51
|
+
if (bt && !alreadyDone.has(o.baseType) && bt) {
|
|
43
52
|
dumpType(bt);
|
|
44
53
|
}
|
|
45
54
|
alreadyDone.add(o.name);
|
|
46
|
-
const ex1 =
|
|
55
|
+
const ex1 = bt ? `extends ${bt.name} ` : "";
|
|
47
56
|
|
|
48
57
|
if (o.baseType === "Union") {
|
|
49
58
|
const p: string[] = [];
|
package/source/tools.ts
CHANGED
|
@@ -8,20 +8,19 @@ import {
|
|
|
8
8
|
FieldCategory,
|
|
9
9
|
getBuiltInType,
|
|
10
10
|
hasBuiltInType,
|
|
11
|
-
hasStructuredType,
|
|
12
11
|
IStructuredTypeSchema,
|
|
13
|
-
|
|
12
|
+
StructuredTypeSchema
|
|
14
13
|
} from "node-opcua-factory";
|
|
15
14
|
import { ExpandedNodeId } from "node-opcua-nodeid";
|
|
16
15
|
|
|
17
16
|
import { createDynamicObjectConstructor } from "./dynamic_extension_object";
|
|
18
|
-
import {
|
|
17
|
+
import { InternalTypeDictionary, MapDataTypeAndEncodingIdProvider } from "./parse_binary_xsd";
|
|
19
18
|
|
|
20
19
|
const errorLog = make_errorLog(__filename);
|
|
21
20
|
|
|
22
|
-
function _removeNamespacePart(str?: string): string
|
|
21
|
+
function _removeNamespacePart(str?: string): string {
|
|
23
22
|
if (!str) {
|
|
24
|
-
return str;
|
|
23
|
+
return str || "";
|
|
25
24
|
}
|
|
26
25
|
const data = str.split(":");
|
|
27
26
|
return data.length > 1 ? data[1] : str;
|
|
@@ -45,13 +44,12 @@ function _adjustFieldTypeName(fieldTypeName: string): string {
|
|
|
45
44
|
|
|
46
45
|
export function getOrCreateStructuredTypeSchema(
|
|
47
46
|
name: string,
|
|
48
|
-
typeDictionary:
|
|
47
|
+
typeDictionary: InternalTypeDictionary,
|
|
49
48
|
dataTypeFactory: DataTypeFactory,
|
|
50
49
|
idProvider: MapDataTypeAndEncodingIdProvider
|
|
51
50
|
): IStructuredTypeSchema {
|
|
52
|
-
// eslint-disable-next-line complexity
|
|
53
51
|
function _getOrCreateStructuredTypeSchema(_name: string): IStructuredTypeSchema {
|
|
54
|
-
if (dataTypeFactory.
|
|
52
|
+
if (dataTypeFactory.hasStructureByTypeName(_name)) {
|
|
55
53
|
return dataTypeFactory.getStructuredTypeSchema(_name);
|
|
56
54
|
}
|
|
57
55
|
if (dataTypeFactory.hasEnumeration(_name)) {
|
|
@@ -94,83 +92,11 @@ export function getOrCreateStructuredTypeSchema(
|
|
|
94
92
|
return index < 0;
|
|
95
93
|
});
|
|
96
94
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
switch (prefix) {
|
|
104
|
-
case "tns":
|
|
105
|
-
field.fieldType = fieldTypeName;
|
|
106
|
-
if (dataTypeFactory.hasEnumeration(fieldTypeName)) {
|
|
107
|
-
const enumeratedType = dataTypeFactory.getEnumeration(fieldTypeName);
|
|
108
|
-
field.category = FieldCategory.enumeration;
|
|
109
|
-
field.schema = enumeratedType;
|
|
110
|
-
} else {
|
|
111
|
-
// must be a structure then ....
|
|
112
|
-
field.category = FieldCategory.complex;
|
|
113
|
-
const schema1 = dataTypeFactory.getStructuredTypeSchema(fieldTypeName);
|
|
114
|
-
field.schema = schema1;
|
|
115
|
-
// _getOrCreateStructuredTypeSchema(fieldTypeName);
|
|
116
|
-
|
|
117
|
-
// istanbul ignore next
|
|
118
|
-
if (!field.schema) {
|
|
119
|
-
errorLog("cannot find schema for ", fieldTypeName);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
break;
|
|
123
|
-
case "ua":
|
|
124
|
-
field.fieldType = fieldTypeName;
|
|
125
|
-
if (hasBuiltInType(fieldTypeName)) {
|
|
126
|
-
field.category = FieldCategory.basic;
|
|
127
|
-
field.schema = getBuiltInType(fieldTypeName);
|
|
128
|
-
} else if (dataTypeFactory.hasStructuredType(fieldTypeName)) {
|
|
129
|
-
field.category = FieldCategory.complex;
|
|
130
|
-
field.schema = dataTypeFactory.getStructuredTypeSchema(fieldTypeName);
|
|
131
|
-
} else {
|
|
132
|
-
field.category = FieldCategory.basic;
|
|
133
|
-
// try in this
|
|
134
|
-
field.schema = _getOrCreateStructuredTypeSchema(fieldTypeName);
|
|
135
|
-
// istanbul ignore next
|
|
136
|
-
if (!field.schema) {
|
|
137
|
-
errorLog("What should I do ??", fieldTypeName, " ", hasStructuredType(fieldTypeName));
|
|
138
|
-
} else {
|
|
139
|
-
if (hasBuiltInType(fieldTypeName)) {
|
|
140
|
-
field.category = FieldCategory.basic;
|
|
141
|
-
} else {
|
|
142
|
-
field.category = FieldCategory.complex;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
break;
|
|
147
|
-
case "opc":
|
|
148
|
-
if ((fieldTypeName === "UAString" || fieldTypeName === "String") && field.name === "IndexRange") {
|
|
149
|
-
field.fieldType = "NumericRange";
|
|
150
|
-
} else {
|
|
151
|
-
field.fieldType = fieldTypeName;
|
|
152
|
-
}
|
|
153
|
-
if (!hasBuiltInType(fieldTypeName)) {
|
|
154
|
-
throw new Error("Unknown basic type " + fieldTypeName);
|
|
155
|
-
}
|
|
156
|
-
field.category = FieldCategory.basic;
|
|
157
|
-
break;
|
|
158
|
-
default:
|
|
159
|
-
if (dataTypeFactory.hasEnumeration(fieldTypeName)) {
|
|
160
|
-
field.category = FieldCategory.enumeration;
|
|
161
|
-
const enumeratedType = dataTypeFactory.getEnumeration(fieldTypeName);
|
|
162
|
-
field.schema = enumeratedType;
|
|
163
|
-
} else if (dataTypeFactory.hasStructuredType(fieldTypeName)) {
|
|
164
|
-
field.category = FieldCategory.complex;
|
|
165
|
-
const schema1 = dataTypeFactory.getStructuredTypeSchema(fieldTypeName);
|
|
166
|
-
field.schema = schema1;
|
|
167
|
-
}
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const schema = buildStructuredType(structuredType as StructuredTypeOptions);
|
|
95
|
+
applyOnFields();
|
|
96
|
+
const schema = new StructuredTypeSchema({
|
|
97
|
+
...structuredType,
|
|
98
|
+
dataTypeFactory
|
|
99
|
+
});
|
|
174
100
|
const ids = idProvider.getDataTypeAndEncodingId(schema.name);
|
|
175
101
|
if (!ids) {
|
|
176
102
|
// this may happen if the type is abstract or if the type referes to a internal ExtnsionObject
|
|
@@ -179,9 +105,8 @@ export function getOrCreateStructuredTypeSchema(
|
|
|
179
105
|
const Constructor = createDynamicObjectConstructor(schema, dataTypeFactory) as unknown as ConstructorFuncWithSchema;
|
|
180
106
|
return schema;
|
|
181
107
|
}
|
|
182
|
-
schema.id = ids.dataTypeNodeId;
|
|
183
108
|
schema.dataTypeNodeId = ids.dataTypeNodeId;
|
|
184
|
-
if (schema.
|
|
109
|
+
if (schema.dataTypeNodeId.namespace === 0 && schema.dataTypeNodeId.value === 0) {
|
|
185
110
|
return schema;
|
|
186
111
|
}
|
|
187
112
|
schema.encodingDefaultXml = ExpandedNodeId.fromNodeId(ids.xmlEncodingNodeId);
|
|
@@ -191,8 +116,68 @@ export function getOrCreateStructuredTypeSchema(
|
|
|
191
116
|
const Constructor = createDynamicObjectConstructor(schema, dataTypeFactory) as unknown as ConstructorFuncWithSchema;
|
|
192
117
|
Constructor.encodingDefaultBinary = schema.encodingDefaultBinary;
|
|
193
118
|
Constructor.encodingDefaultXml = schema.encodingDefaultXml;
|
|
194
|
-
|
|
119
|
+
Constructor.encodingDefaultJson = schema.encodingDefaultJson;
|
|
195
120
|
return schema;
|
|
121
|
+
|
|
122
|
+
function applyOnFields() {
|
|
123
|
+
for (const field of structuredType.fields) {
|
|
124
|
+
const fieldType = field.fieldType;
|
|
125
|
+
if (!field.schema) {
|
|
126
|
+
const prefix = _getNamespacePart(fieldType);
|
|
127
|
+
const fieldTypeName = _adjustFieldTypeName(_removeNamespacePart(fieldType)!);
|
|
128
|
+
|
|
129
|
+
switch (prefix) {
|
|
130
|
+
case "ua":
|
|
131
|
+
field.fieldType = fieldTypeName;
|
|
132
|
+
if (hasBuiltInType(fieldTypeName)) {
|
|
133
|
+
field.category = FieldCategory.basic;
|
|
134
|
+
field.schema = getBuiltInType(fieldTypeName);
|
|
135
|
+
} else if (dataTypeFactory.hasStructureByTypeName(fieldTypeName)) {
|
|
136
|
+
field.category = FieldCategory.complex;
|
|
137
|
+
field.schema = dataTypeFactory.getStructuredTypeSchema(fieldTypeName);
|
|
138
|
+
} else {
|
|
139
|
+
field.category = FieldCategory.basic;
|
|
140
|
+
// try in this
|
|
141
|
+
field.schema = _getOrCreateStructuredTypeSchema(fieldTypeName);
|
|
142
|
+
// istanbul ignore next
|
|
143
|
+
if (!field.schema) {
|
|
144
|
+
errorLog("What should I do ??", fieldTypeName, " ", dataTypeFactory.hasStructureByTypeName(fieldTypeName));
|
|
145
|
+
} else {
|
|
146
|
+
if (hasBuiltInType(fieldTypeName)) {
|
|
147
|
+
field.category = FieldCategory.basic;
|
|
148
|
+
} else {
|
|
149
|
+
field.category = FieldCategory.complex;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case "opc":
|
|
155
|
+
if ((fieldTypeName === "UAString" || fieldTypeName === "String") && field.name === "IndexRange") {
|
|
156
|
+
field.fieldType = "NumericRange";
|
|
157
|
+
} else {
|
|
158
|
+
field.fieldType = fieldTypeName;
|
|
159
|
+
}
|
|
160
|
+
if (!hasBuiltInType(fieldTypeName)) {
|
|
161
|
+
throw new Error("Unknown basic type " + fieldTypeName);
|
|
162
|
+
}
|
|
163
|
+
field.category = FieldCategory.basic;
|
|
164
|
+
break;
|
|
165
|
+
default:
|
|
166
|
+
field.fieldType = fieldTypeName;
|
|
167
|
+
if (dataTypeFactory.hasEnumeration(fieldTypeName)) {
|
|
168
|
+
field.category = FieldCategory.enumeration;
|
|
169
|
+
const enumeratedType = dataTypeFactory.getEnumeration(fieldTypeName);
|
|
170
|
+
field.schema = enumeratedType;
|
|
171
|
+
} else if (dataTypeFactory.hasStructureByTypeName(fieldTypeName)) {
|
|
172
|
+
field.category = FieldCategory.complex;
|
|
173
|
+
const schema1 = dataTypeFactory.getStructuredTypeSchema(fieldTypeName);
|
|
174
|
+
field.schema = schema1;
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
196
181
|
}
|
|
197
182
|
return _getOrCreateStructuredTypeSchema(name);
|
|
198
183
|
}
|