Specify NPM dependencies
Learn how to run your tests that need third-party or private npm packages.
Though your package.json file might contain many third-party npm packages, not all of these are required for you to successfully run your Cypress tests on BrowserStack.
In this guide, you will learn:
- Why you need to specify npm packages?
- How to specify required npm dependencies?
- How to specify private npm package dependencies?
- How BrowserStack manages your npm dependency caching?
Why npm dependencies must be specified?
Your Cypress tests are uploaded to BrowserStack and are further run from the BrowserStack machines. Typically, all external npm packages that your tests need to run are specified in the package.json file under the devDependencies section.
For your Cypress tests to run on BrowserStack, we use the browserstack.json file and read your dependencies from this file. The package.json is not used by BrowserStack to identify dependencies.
You need to set your npm dependencies in the browserstack.json file because:
- The
package.jsonfile might contain severaldevDependenciesmany of which are not essential for running your tests. For example, theeslintpackage. - Installing
npmpackages in BrowserStack machines is a time intensive task. By installing non-essential packages, we would increase your build time, which can be avoided by skipping such packages.
Based on these benefits, use the information in the following sections to understand which npm packages must be specified in the browserstack.json.
Specify public npm package dependencies
You can use the following keys in the run_settings section under browserstack.json to specify the npm packages and any options that the packages might need for your tests to run successfully.
Ensure that you are using CLI v1.3.0 or higher to use the package_config_options key.
| key | value |
|---|---|
npm_dependencies |
A hash of npm packages that are required to run your Cypress tests along with their version numbers. |
package_config_options |
A hash of package options that are required to run your Cypress tests with the packages specified. |
For Example:
{
"run_settings": {
...
"npm_dependencies": {
"npm-package-you-need-to-run-tests-1": "^1.2.1",
"npm-package-you-need-to-run-tests-2": "^7.1.6-beta.13",
},
"package_config_options": {
"npm-package-you-need-to-run-tests-1_options": {
"option1": true,
"option2": "some-value"
}
}
}
}
If you encounter the Cannot find module 'cypress' error after migrating to Cypress 10, add the cypress dependency under npm_dependencies in the browserstack.json file.
Specify private npm package dependencies
If your dependencies include privately or internally-hosted npm packages, you can resolve them by adding a .npmrc file as part of your project, with authentication, if required. For such cases, the following two scenarios exist:
- Your registry URL is publicly resolvable
- Your registry URL is only available to your private network
Registry URL is publicly resolvable
Complete the following steps to ensure that your tests run seamlessly on BrowserStack:
- Specify the private npm package dependency in your
browserstack.jsonfile:
browserstack.json{ "run_settings": { ... "npm_dependencies": { "your-private-npm-package": "^1.2.1", }, } } - Create a
.npmrcfile and enter your private npm registry details as shown in the following sample snippet. Check out what are npmrc files and how to set them for more information.
.npmrc@myscope:registry=https://mycustomregistry.example.org
If your private npm registry needs authentication to access it, then follow the steps in the configuring NPM registry authentication section.
Registry URL is only available to your private network
If the NPM registry URL is accessible only in your private network, then complete the following steps to route requests through the BrowserStack Local tunnel connection:
- Specify the private
npmpackage dependency in yourbrowserstack.json:
browserstack.json{ "run_settings": { ... "npm_dependencies": { "your-private-npm-package-accessible-only-in-your-private-network": "^1.2.1", }, } } - Create a
.npmrcfile and enter your private npm registry details as shown in the following sample code snippet. Check out what are npmrc files and how to set them for more information..npmrc@myscope:registry=https://mycustomregistry.private-staging.com - Set
"local": truein the"connection_settings"section of yourbrowserstack.jsonfile since the URL is not publicly resolvable.
browserstack.json... { "connection_settings": { "local": true } } ... - If you are behind a proxy, then you need to ensure that you specify the proxy parameters in a
local-config.ymlfile and specify the path in thebrowserstack.jsonfile as shown in the following code snippet. You can see the sample config file and configure the proxy related parameters accordingly.browserstack.json... { "connection_settings": { "local": true, "local_config_file": "/path/to/your/config.yml" } } ...
If your private npm registry needs authentication to access it, then follow the steps in the configure NPM registry authentication section.
Configure NPM registry authentication
In the earlier sections, we learnt about accessing the npm registry for both when your private npm package registry URL is publicly resolvable or privately resolvable. In this section, we will learn about the steps that you must follow if your npm registry itself needs authentication.
Accessing the npm registry involves creating an npm token, and then setting the token in the .npmrc file.
- Create an npm token using
npm token createcommand. Check out Creating an access token to learn about creating access tokens including CIDR-whitelisted tokens. - After the token is created, save it in an environment variable such as
NPM_TOKENin your system. - Configure the
browserstack.jsonfile as shown in the following snippet to read the specified environment variable value from your system when you trigger any Cypress test.browserstack.json... "run_settings": { ... "system_env_vars": ["NPM_TOKEN", "ANY_OTHER_ENV_VARIABLE_THAT_YOU_WANT_TO_BE_AVAILABLE_AT_OS_LEVEL"] }After you configure the environment variable, the browserstack-cypress CLI will use this variable from your system and set the same in BrowserStack machines, and use them thereafter.
- In the
.npmrcfile, specify thenpmtoken for authentication.
.npmrc@myscope:registry=https://mycustomregistry.example.org:_authToken=${NPM_TOKEN}Check out NPM documentation for setting authentication for CI/CD runs to learn more.
npm dependency caching
Starting browserstack-cypress-cli version 1.11.0 and higher, BrowserStack will cache your npm dependencies to accelerate your overall build execution time.
BrowserStack would cache all your npm dependencies so that every time you run a build, npm install is not required which used to take up a major part of the total time of your build execution.
Caching dependencies is a default behavior for browserstack-cypress-cli v1.11.0 and higher. Due to this behavior, all your private packages (if any) would also be cached on our servers. If you want to stop BrowserStack from caching your npm dependencies, specify the following configuration option in your browserstack.json file but your build will end up taking much longer to complete.
{
"run_settings": {
...
"cache_dependencies": "false"
}
}
You need to ensure that you are using one of the latest browserstack-cypress CLI versions i.e. v1.11.0 (or above) to be able to see these enhancements. Run npm i -g browserstack-cypress-cli to ensure that the latest version is used.
We're sorry to hear that. Please share your feedback so we can do better
Contact our Support team for immediate help while we work on improving our docs.
We're continuously improving our docs. We'd love to know what you liked
- RESOURCES
We're sorry to hear that. Please share your feedback so we can do better
Contact our Support team for immediate help while we work on improving our docs.
We're continuously improving our docs. We'd love to know what you liked
Thank you for your valuable feedback!