**WatermelonDB is an open-source project and it needs your help to thrive!**
If there's a missing feature, a bug, or other improvement you'd like, we encourage you to contribute! Feel free to open an issue to get some guidance and see [Contributing guide](./CONTRIBUTING.md) for details about project setup, testing, etc.
If you're just getting started, see [good first issues](https://github.com/Nozbe/WatermelonDB/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) that are easy to contribute to. If you make a non-trivial contribution, email me, and I'll send you a nice 🍉 sticker!
If you make or are considering making an app using WatermelonDB, please let us know!
## Before you send a pull request
1. Did you add or changed some functionality?
Add (or modify) tests!
2. Check if the automated tests pass
```bash
yarn ci:check
```
3. Format the files you changed
```bash
yarn prettier
```
4. Mark your changes in CHANGELOG
Put a one-line description of your change under Added/Changed section. See [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Running Watermelon in development
### Download source and dependencies
```bash
git clone https://github.com/Nozbe/WatermelonDB.git
cd WatermelonDB
yarn
```
### Developing Watermelon alongside your app
To work on Watermelon code in the sandbox of your app:
```bash
yarn dev
```
This will create a `dev/` folder in Watermelon and observe changes to source files (only JavaScript files) and recompile them as needed.
Then in your app:
```bash
cd node_modules/@nozbe
rm -fr watermelondb
ln -s path-to-watermelondb/dev watermelondb
```
**This will work in Webpack but not in Metro** (React Native). Metro doesn't follow symlinks. Instead, you can compile WatermelonDB directly to your project:
```bash
DEV_PATH="/path/to/your/app/node_modules/@nozbe/watermelondb" yarn dev
```
### Running tests
This runs Jest, ESLint and Flow:
```bash
yarn ci:check
```
You can also run them separately:
```bash
yarn test
yarn eslint
yarn flow
```
### Editing files
We recommend VS Code with ESLint, Flow, and Prettier (with prettier-eslint enabled) plugins for best development experience. (To see lint/type issues inline + have automatic reformatting of code)
## Editing native code
In `native/ios` and `native/android` you'll find the native bridge code for React Native.
It's recommended to use the latest stable version of Xcode / Android Studio to work on that code.
### Integration tests
If you change native bridge code or `adapter/sqlite` code, it's recommended to run integration tests that run the entire Watermelon code with SQLite and React Native in the loop:
```bash
yarn test:ios
yarn test:android
```
### Running tests manualy
- For iOS open the `native/iosTest/WatermelonTester.xcworkspace` project and hit Cmd+U.
- For Android open `native/androidTest` in AndroidStudio navigate to `app/src/androidTest/java/com.nozbe.watermelonTest/BridgeTest` and click green arrow near `class BridgeTest`
### Native linting
Make sure the native code you're editing conforms to Watermelon standards:
```bash
yarn ktlint
```
### Native code troubleshooting
1. If `test:ios` fails in terminal:
- Run tests in Xcode first before running from terminal
- Make sure you have the right version of Xcode CLI tools set in Preferences -> Locations
1. Make sure you're on the most recent stable version of Xcode / Android Studio
1. Remove native caches:
- Xcode: `~/Library/Developer/Xcode/DerivedData`:
- Android: `.gradle` and `build` folders in `native/android` and `native/androidTest`
- `node_modules` (because of React Native precompiled third party libraries)