This package contains utility functions, classes, types, etc. that are shared between the frontend and the backend.
Keep in mind to add new exports to the index.ts
file in the folder.
- src/data/ data like default objects for the state or dummy objects for testing
- src/export-import/ contains typings for export and import files
- src/models/ classes, interfaces and types that are used in the state
- Note that in all cases (other than validation) plain objects of these classes have to be used (instead of instance objects). You can use the
create
methods of all models for this.
- Note that in all cases (other than validation) plain objects of these classes have to be used (instead of instance objects). You can use the
- src/socket-api/ the types for socket.io
- src/state-helpers/ utilities for working with the state.
- src/state-migrations/ migrations to update old states and actions to the newest version.
- src/store/ reducers, actions and utilities that are used with the state
- src/utils/ general utilities
Note that whenever the state types get updated you have to increase ExerciseState.currentStateVersion
in state.ts
.
In addition, you have to add a migration in state-migrations
. Look at ./src/state-migrations/migration-functions.ts
for more information.
To test the migrations, you can use the benchmarks in ../benchmark
and look for errors.
When writing new Action
s, note the comments in src/store/action-reducer.ts and src/store/action-reducers/action-reducers.ts.
You can orient yourself at the already existing Action
s in src/store/action-reducers.
Note especially that new Action
s have to be registered in actionReducers
in src/store/action-reducers/action-reducers.ts.
When adding new models note that they must expose a static
create
method that calls the constructor, removes the prototype and freezes the object.
This can be achieved by using static create = getCreate(this)
, like in existing models.
Also, mark the constructor
as deprecated
via a JSDoc comment.
We are using class-validator
for validating all elements in the state
and all Action
s.
The conversion to instance objects is done with class-transformer.
It is desirable to narrow down the types of the validation as much as possible, within reason.
Note that we are currently not able to validate any kind of plain objects (e.g. { [key: string]: SomeModel }
) and union types (e.g. 'and' | 'or'
).
This is tracked in #116.