# wsopcua DataType Code generator
## About
To be able to use custom OPC UA data types one has to generate them for the client side.
The source for the data type generator is/are one or more `xxx_NodeSet2.xml` files.
Alternatively the information for the binary serialization format is
also available in `.bsd`-file (i.e.: Opc.Ua.Types.bsd).
Actually the information of the `.bsd`-file is part of a `NodeSet2.xml` file in base64 encoded form.
## DataType Generator
wsopcua provides a dataset generator that can handle `NodeSet2.xml`- and `.bsd`-files as input to generate DataType classes.
To be able to generate classes from multiple `NodeSet2/bsd` files with
dependencies to different specified locations a data-type-gen.json file is used.
Usage Example (in your project / monorepo):
```shell
node ./node_modules/@wsopcua/wsopcua/bin/wsopcua-schema-gen.js -c ./data-type-gen.json
```
## Generator Config Format
To describe how the config file can be used let's look at an example:
You have a monorepo with 2 projects / npm packages (`ProjectA`, `ProjectB`).
In addition you get 3 NodeSet2.xml files from your OPC UA backend developer: `feature_a1.NodeSet2.xml`, `Feature_a2.NodeSet2.xml`,
`feature_b1_NodeSet2.xml`
`feature_a*.NodeSet2.xml` nodeset types should be generated to `ProjectA` and `feature_b1_NodeSet2.xml` types should go to `ProjectB`.
In addition `feature_b1.NodeSet2.xml` has types in it that have members of types defined in `feature_a1.NodeSet2.xml`
To get the imports and dependencies right the configuration contains of multiple target project configurations.
Note that all relative paths of this config file are relative to the config file itself.
```json
{
"projects": [
{
"projectName": "project-a",
"projectSrcPath": "./packages/ProjectA/src",
"schemaImports": [
{
"pathToSchema": "./nodesets/feature_a1.NodeSet2.xml",
"modulePath": "/generated/a1"
},
{
"pathToSchema": "../schemas/Opc.Ua.Di.NodeSet2.xml",
"modulePath": "/generated/a2",
"namespace": 10
}
]
},
{
"projectName": "project-b",
"projectSrcPath": "./packages/ProjectB/src",
"schemaImports": [
{
"pathToSchema": "https://files.opcfoundation.org/schemas/UA/1.05/Opc.Ua.Safety.NodeSet2.xml"
"modulePath": "/generated/safety"
}
{
"pathToSchema": "./nodesets/feature_b1.NodeSet2.xml",
"modulePath": "/generated/b1"
},
]
}
]
}
```
### The `projectName`
property contains the name of the project (npm package).
It is used for references of other DataTypes from other libraries
Such a generated DataType could look like the following example (notice the import)
```typescript
import { DataTypeA1 } from 'project-a/generated/a1';
export class DataTypeB1 extends DataTypeA1{ ... }
```
### The `projectSrcPath`
property defines the path to the `src` folder of the specific project
### The `schemaImports`
property hold a list schema imports that correspond to different `NodeSet2.xml` schema files.
`pathToSchema` can bei either a relative path to the NodeSet2.xml-file or a valid url like `https://files.opcfoundation.org/schemas/UA/1.05/Opc.Ua.Types.bsd.xml`
`modulePath` appended to `projectSrcPath` results in the target directory for
the generated classes.
In the above example the generation process results in the following folder structure
for ProjectA:
```
.
+--
+-- packages/ProjectA/src/generated/a1
| +-- data-type-a1-1.ts
| +-- data-type-a1-2.ts
| +-- name-it-a.ts
| +-- index.ts
+-- packages/ProjectA/src/generated/a2
| +-- data-type-a2_1.ts
| +-- data-type-a2_2.ts
| +-- data-type-a2_3.ts
| +-- index.ts
```
Note: the generated `index.ts` files get generated.
These barrel files are generated to be able to do easier imports.
### With the `namespace`:
property it is possible to define a fixed namespace id for generated types of a given node-set