![Renai](resources/logo.png 'Renai') # レンアイ - Hentai Library Thingy ## Development ### Quickstart - `npm install`, the postinstall runs - `npm run rebuild` - might need to install some build tools depending on your platform - `npm run watch` for code transpilation (starts watchers) - `npm run start` ### Git Commits This project uses [Conventional Commits](https://www.conventionalcommits.or) with the following types: - `feat`: features, if any part of your commit implements a new functionality or changes an existing one, use this - `remove`: removal of existing code/functionality - `fix`: bugfixes - `refactor`: code refactoring - `test`: any of the above, but with tests/mocks - `update`: updating dependencies and associated code changes - `config`: changing configuration (linters, build process) - `doc`: documentation, including comments - `reformat`: fixing code formatting Always try to split up your changes into coherent commits, a single commit should do a single thing. If your commit needs to do more than one thing it should be labeled with the type coming first in this list. ### Database Migrations Migrations are stored in [src/main/migrations](src/main/migrations) and handled by typeorm. Migrations are run on app start inside [database.ts](src/main/services/database.ts). To auto-generate a migration: `node_modules/.bin/typeorm migration:generate -n -c ` To create an empty creation which can be filled with custom migration code: `node_modules/.bin/typeorm migration:create -n -c ` To run migrations: `node_modules/.bin/typeorm migration:run -c ` This is also pre-defined in the npm script `typeorm:migrate`. ### Testing The testing framework of choice is [Mocha](https://mochajs.org/). Call `npm run test` to run all tests. Tests are written in typescript and need to be transpiled before testing. - assertion is (mainly) done by [Chai](https://www.chaijs.com/) - Electron specific testing is done by [Spectron](https://electronjs.org/spectron) - spies, stubs and mocks are provided by [Sinon.JS](https://sinonjs.org/) - HTTP server mocking is done by [nock](https://github.com/nock/nock) - property based testing is made possible by [fast-check](https://github.com/dubzzz/fast-check) #### Mocks There are 2 ways in which mocks are defined/used: 0. for external modules, in [mocks](mocks), uses the [rewiremock](https://github.com/theKashey/rewiremock) package; use this only when there is some magic happening like for electron which normally runs in its own node process 1. for own modules, just beside their test file in [tests](tests); name the file `*.mock.ts` and use other files for orientation; use sparingly and only when not having a mock makes it more complex e.g. for modules which interact with the file system #### Tagging Mocha does [not have a seperate tagging feature](https://github.com/mochajs/mocha/wiki/Tagging), but it can filter via title. Us the following tags in your test titles: - `@slow` when the test is particularly slow #### Coverage Code coverage is provided by [nyc](https://github.com/istanbuljs/nyc). The detailed code coverage can be found [here](.nyc_output/coverage/index.html) after running the tests (open in browser).