# Building an application

The page provides instructions for building an application so it can be deployed to production.

## Requirements

Your application must be committed to a Git repository before you can build the application. The application’s build script creates version strings based on your HEAD branch’s commit count, hash, and branch descriptor.

## Building an application

To build an application, follow the steps below:

1. Commit any pending changes in your application to Git. The example commands below commit all modified and untracked files:

   ```
   $ git add --all
   $ git commit -m "<message>"
   ```
2. From the root directory of your application, run the command below to build the application:

   ```
   $ yarn run build
   ```

The build task writes a JavaScript bundle and a Java web application archive (WAR) file under your application’s `build` directory:

```plantuml
@startsalt
scale 1.25
{
{T
 + <color:goldenrod><&folder></color> build   
 ++ <color:goldenrod><&folder></color> dist
 +++ <color:goldenrod><&folder></color> static
 ++++ <color:cornflowerblue><&file></color> bundle-dev.js
 +++ <color:cornflowerblue><&file></color> index.html
 ++ <color:goldenrod><&folder></color> exported-wars
 +++ <color:cornflowerblue><&file></color> **MyApp.war**
}
}
@endsalt
```

The WAR file is an archived version of the contents of the `build/dist` directory and can be deployed to a Java application server.

## Troubleshooting build issues

This section describes common issues you may encounter when running `yarn run build` or `yarn start`.

### Alias &lt;name> not registered

```
WARN [aliases-plugin] <time>: Alias "<name>" not registered.
```

This warning is generated when your application references a Caplin Trader alias but has not declared in the file `~/src/config/aliases.js` which package provides the alias.

**Aliases**

A Caplin Trader alias is a stand-in for a class name that is resolved to a specific class at build time. The mapping of aliases to implementations is configured in your application’s `~/src/config/aliases.js` file.

By using aliases to refer to shared data services such as the Permissioning Service, Caplin Trader makes it easy to substitute different implementations of data services when building for development, test, and production environments.

While some Caplin Trader 5 packages continue to use aliases, Caplin Trader 5’s compatibility with Node.js opens up alternative options for providing shared data services in your own application code, such as AngularJS’s dependency injection, and Redux’s store and middleware.

To resolve a missing alias warning, determine which Caplin package defines the alias, and copy the definition of the alias to your application’s `~/src/config/aliases.js` file.

For example, consider the code below which requires the Caplin Trader service `caplin.event-service`:

```javascript
const eventService = require("service!caplin.event-service");
```

The identifier `caplin.event-service` is an alias, and unless a implementation for the alias is declared in the application’s `src/config/aliases.js` file, `yarn run build` and `yarn start` will generate the following warning:

**Example warning**

```
WARN [aliases-plugin] 02:46:30: Alias "caplin.event-service" not registered.
```

To resolve the missing alias registration in the example above, follow the steps below:

1. Use the `grep` command to search your application’s `node_modules` directory for the Caplin package that defines the missing alias:

   ```console
   $ grep -R --include=aliasProviders.js 'caplin\.event-service' node_modules
   node_modules/ct-services/aliasProviders.js:  "caplin.event-service": function() {
   ```

   The output from the command reveals that the `ct-services` package defines the `caplin.event-service` alias.

   **💡 TIP**\
   On Microsoft Windows, the `grep` command is available in [Cygwin](https://www.cygwin.com/) and the Bash shell of [Git for Windows](https://gitforwindows.org/).
2. Copy the alias definition for `caplin.event-service` from `node_modules/ct-services/aliasProviders.js` to the object exported by your  application’s `src/config/aliases.js` file:

   **File: node_modules/ct-services/aliasProviders.js**

   ```js
   module.exports = {
     "caplin.log-store-service": function() {
       return require("ct-core/log/LogStoreService");
     },
     "caplin.event-service": function() {
       return require("ct-core/event/EventHub");
     },
     "caplin.config-service": function() {
       return require("./providers/CaplinConfigService");
     },
     "caplin.user-prompt-service": function() {
       return require("./providers/BrowserUserPromptService");
     }
   };
   ```

   **File: src/config/aliases.js**

   ```js
   module.exports = {
     "caplin.event-service": function() {
       return require("ct-core/event/EventHub");
     }
   };
   ```
