This repository contains the various platforms of the Deriv application.
In this document:
- General - Contains general philosophy and overview of this package
- Stylesheet guidelines - Contains rules for CSS/SASS code style
- JavaScript guidelines - Contains rules for JS/JSX code style
- Modules docs - Contains implementation guides (i.e., scaffolding, code usage)
- e2e and performance testing docs - Contains documents for create and running e2e and performance tests
- Manage dependencies
Before running or contribute to this project, you need to have the setup of the following package in your environment.
- node >=14.17.1
- npm >=7.21.0
- git (for
contribution
)
Note: node -v
and sudo node -v
should be the same version.
-
Fork the project
In order to work on your own version of the Deriv application, please fork the project to your own repository.
-
Clone using SSH
git clone [email protected]:binary-com/deriv-app.git
-
Enter project directory
cd deriv-app
-
Install your dependencies:
npm run bootstrap
Note: If you get the error peer dependencies
, follow the instruction below:
-
Discard any changes related
package-lock.json
(if applicable) -
Make sure that the Node version is the same as recommended version otherwise upgrade or downgrade it
-
Run the following commands:
$ npm ci $ lerna link $ lerna bootstrap --ci --hoist --strict $ lerna link $ npm run build $ npm run bootstrap
Note: Internal behavior of bootstrap has changed to hoist "common" packages to root
node_modules
instead of individual packages. This behavior benefits us from having issues with multiple instances of the same library across dependencies, but it throws errors if the package versions are out of date. This was a trade-off we decided to So when you are adding a dependency which already exists in other packages, their version should be matched. In case of wanting a new version for a dependency, please update all packages. -
Set custom domain:
If you have a custom domain that you use for GH Pages, add a file named
CNAME
inpackages/core/scripts/
to be used for your GH Pages deployments -
Build the project:
npm run build
Package name | Docs | Version |
---|---|---|
Appstore |
- | |
Bot |
- | |
Components |
- | |
Core |
- | |
P2P |
||
Shared |
- | |
Trader |
- | |
Translations |
- |
All packages must contain the following scripts to perform the stated actions:
Package param | Command | Description |
---|---|---|
✅ | start |
Runs complete test and build suite and starts the dev server. |
✅ | serve |
Runs build suite and starts the dev server. When serving core , takes optional open value as argument to open specific page. (e.g: npm run serve core --open=bot ) |
✅ | build |
Runs build suite and outputs the result into dist . Takes optional base value as argument. |
✅ | test |
Runs the test suite with eslint, stylelint and jest. |
✅ | test:mocha |
Runs only the test suite. |
✅ | test:jest |
Runs only the jest test suite. |
✅ | test:qa |
Runs the e2e test suite. |
✅ | test:performance |
Runs the performance test suite. |
Please follow the README of each package you intend to work with on how to get set up and their custom scripts. However, the above scripts can be run from the root directory in the following manner.
Each package is named with the @deriv/
prefix, however for the scripts above, you do not need to add the @deriv/
prefix as the scripts already prefix the 1st argument of the script with @deriv/
. However, if you do use the lerna
CLI directly, then you will need to use the full package name including the @deriv/
prefix.
You can find the names of packages by first navigating to the packages
folder. Each sub-folder is a package and contains a package.json
file. The value of the name
key in package.json
is the package name.
In order to run our solution for the first time, you need to configure your hosts
file:
- Open terminal.
- Open
hosts
file in your preferred text editor, f.esudo vim /etc/hosts
. - Add a new entry pointing to
127.0.0.1 localhost.binary.sx
. - Save the file and proceed to the next step.
If you wish to work on Core, simply run npm run serve core
.
But for working on any of the other packages (such as Trader, Bot, P2P), perform the following:
- Open 2 terminals.
- Run
npm run serve {package name}
in the first one. e.g.:npm run serve translations
,npm run serve bot
, etc. - Then run
npm run serve core
in the second one.
If you intend to remove node_modules
folder(s) from the projects, please run npm run clean
from the root of the project.
This runs lerna clean && rm -rf $(git rev-parse --show-toplevel)/node_modules
under the hood.
You can read more on the various lerna commands (and the clean
command) over at the Lerna docs.
Note: In case of facing permission denied error, please simply run sudo chown -R $(whoami) .
from the root of the project.
If a script supports the "Package param", you can supply a {package name}
for it to run the script in. At the moment, only 1 package name can be given to a script, if you wish to run in multiple, please use the lerna
command that's used under the hood as per its docs.
✅ In order to run the start
script for the bot
package, simply run:
npm run start bot
✅ Likewise for trader
(or any other package) with a different script:
npm run test:stylelint trader
There are 2 types of release:
- Release to staging:
git tag staging_v20191205 -m 'release staging'
# the tag needs to follow the RegExp format/^staging.*/
git push origin staging_v20191205
- Release to production:
git tag production_v20191205 -m 'release production'
git push origin production_v20191205
There is a 4th type of release: releasing npm registry packages (currently @deriv/p2p
). This a WIP, but the current method is:
- Acquire membership to
@deriv
npm organization namespace. - Ensure you have a new (bumped) version of publishable packages (currently
@deriv/p2p
). - Run
npm run publish:p2p
. The command publishes all bumped packages. However, right now the name includes the wordp2p
to signal the WIP status and that P2P is the only published package under this repo.
- Use the
developer 1|developer 2/task_name
format for PR titles. (e.g.:dev1|dev2/fixed_emoji_issue
,dev1/added_superfast_jellyfish
)- Optional square bracket tag (e.g.
[WIP]
) can be at the end.
- Optional square bracket tag (e.g.
- Use the appropriate package labels available on the repo to indicate which packages your PR modifies.
- Use Draft PRs if you don't mean to request for reviews yet. Read more here.
There are two types of test link deployment preview:
- Automatic deployment
Upon creating PR, Vercel will auto-generate a test link inside the PR. you can use that to preview the test link for the changes you have made.
- Manual deployment
If preferable to use manual deployment, you can use gh-pages functionality to create a test link. here are ways to do it:
- You can simply deploy to root of the
gh-pages
branch with:npm run deploy
. - You can clean (remove
br_
folders and clear root) yourgh-pages
branch and deploy to root in a single command withnpm run deploy:clean
- You can deploy to a folder in your
gh-pages
branch in order to separate from root app deployment and other folder deployments with:npm run deploy:folder br_test_folder
(folder name must be prefixed withbr_
))
-
How do I install an npm package in one of our packages?
A. You can simply
cd
into the package you wish to install to, then runnpm i package-name
as usual. Or simply run alerna exec
likelerna exec --scope=local-package -- npm i npm-package-name
, e.g.:lerna exec --scope=@deriv/translations -- npm i i18next
. Please note that for directlerna
CLI use, you need the full package name including the@deriv/
prefix. -
How do I uninstall an npm package from one of our packages?
A. Just as installing, except the
npm
command you'd run would benpm uninstall
(shortened tonpm un
). e.g.:lerna exec --scope=@deriv/translations -- npm un i18next
. -
How do I run
npm ci
or equivalent (to add dependencies based onpackage-lock.json
?A. You have two options:
- use
lerna exec
with the--scope
argument as the package you want to run the command on, as suchlerna exec --scope=trader -- npm ci
. cd
intopackages/PACKAGE-NAME
and runnpm ci
, as suchcd packages/trader && npm ci
- use
-
Why do I need to run commands with
sudo
?A. You shouldn't need to. The only command that needs privilege is
serve
andstart
and that's because it's on port 443 however, that script prompts you by itself, you do not need to placesudo
.If you face this issue, simply run
sudo chown -R $(whoami) .
from the root of the project. -
My build(s) fail and I can see it related to Node Sass (
node-sass
), what do I do?A. This issue happens when your
node-sass
has itsbinding.node
set to a version of node different from the current projects' one. Please try the following in order:- First run
npx lerna exec -- npm rebuild node-sass
and try building your packages again. - If that doesn't work, try
npm cache clean --force
, followed bynpm run clean
, and thennpm run bootstrap
. - And finally, if that doesn't work then you can read deeper into this StackOverflow post.
- First run