The Module System
In Open-BPMN we are using the ES Module System (ESM). The following sections contain information how to work with modules and how to setup new modules.
Create a New Sub Module
Modules are located as sub directories in /open-bpmn.glsp-client/ . This is also called a MonoRepo:
.
├── open-bpmn.glsp-client
│ ├── open-bpmn-app/
│ ├── open-bpmn-glsp/
│ ├── open-bpmn-theia/
│ ├── sub1/
│ │ ├── src
│ │ │ ├── dummy1.tsx
│ │ │ └── index.ts
│ │ ├── package.json
│ │ └── tsconfig.json
│ ├── package.json
│ ├── tsconfig.json
│ └── yarn.lock
In this example ‘sub1’ is a sub module within the MonoRepo ‘open-bpmn.glsp-client’.
The Parent package.json and tsconfig.json
To work with a sub module using yarn
within a MonoRepo first add your new module to the ‘workspaces’ section in the parent package.json
file:
....
"workspaces": [
"open-bpmn-glsp",
"open-bpmn-theia",
"open-bpmn-app",
"sub1"
],
....
Next it is also necessary to add the module also into the ‘include’ section of the tsconfig.json
file:
.....
"include": [
"open-bpmn-glsp/src",
"open-bpmn-theia/src",
"open-bpmn-app",
"sub1/src"
]
....
Note: In this case you have to add the /src/ sub folder containing your source files.
The Module package.json and tsconfig.json
Within the module the file package.json
can be quite simple but should contain a @domain name and a version number:
{
"private": "true",
"name": "@open-bpmn/sub1",
"version": "0.0.9",
"dependencies": {
"@eclipse-glsp/client": "0.9.0"
},
"scripts": {
"prepare": "yarn clean && yarn build && yarn lint",
"clean": "rimraf lib",
"build": "tsc",
"lint": "eslint -c ../.eslintrc.js --ext .ts,.tsx ./src",
"watch": "tsc -w"
},
"files": [
"lib",
"src",
"build",
"css"
],
"main": "lib/index",
"types": "lib/index"
}
The file tsconfig.json
can look like this:
{
"extends": "@eclipse-glsp/ts-config/tsconfig.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "lib",
"baseUrl": ".",
"skipLibCheck": true
},
"include": ["src"]
}
The index.ts file
Beside the module sources your sub module must include the file index.ts
. This file is refered in the package.json
file and need to resolve the imports. At least this file exports all functionallity provided by the module source files:
/********************************************************************************
* LCopyright (c)
********************************************************************************/
export * from './dummy1';
The module code
The module source code is simply exporting some functionality:
// export a function
export function log (message: string) {
console.log(message);
}
// export a class
export class logger {
name?: string;
constructor (name: string) {
this.name = name;
}
log (message: string) {
console.log('[${this.name}] ${message}')
}
}
Import from a Sub Module
To import functionality from your sub module now you can now add the module into the dependency section of your package.json
file:
....
"dependencies": {
....
"@open-bpmn/sub1": "0.0.9",
....
},
In your main module code you are now able to add a import declaration like this:
import * as loggerModule from '@open-bpmn/sub1';