Skip to content

Commit

Permalink
Add a mechanism to configure environment variables.
Browse files Browse the repository at this point in the history
  • Loading branch information
atarix83 committed Jan 20, 2017
1 parent c31a0c9 commit 5ada934
Show file tree
Hide file tree
Showing 7 changed files with 134 additions and 34 deletions.
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
/tsd_typings/
npm-debug.log

/config/environment.common.json
/config/environment.prod.json
/config/environment.dev.json

/coverage

/dist/

.idea
Expand Down
87 changes: 53 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Then go to [http://localhost:3000](http://localhost:3000) in your browser
* [Introduction to the technology](#introduction-to-the-technology)
* [Requirements](#requirements)
* [Installing](#installing)
* [Configuring](#Configuring)
* [Running the app](#running-the-app)
* [Running in production mode](#running-in-production-mode)
* [Cleaning](#cleaning)
Expand All @@ -57,6 +58,20 @@ If you have [`nvm`](https://github.com/creationix/nvm#install-script) or [`nvm-w
* `npm run global` to install the required global dependencies
* `npm install` to install the local dependencies

## Configuring
Templates for environmental and shareable configuration files are located in `config/` folder in json format.

To configure application settings:
* Create a new `environment.common.json` file in `config/` folder using `environment.common.default.json` as template;
* Create a new `environment.dev.json` file in `config/` folder using `environment.default.json` as template;
* Create a new `environment.prod.json` file in `config/` folder using `environment.default.json` as template;

Note: JSON standard does not allow comments so remove them whether you are copying from templates.

To use setting parameters in your component:
```bash
import { GlobalConfig } from "../config";
```
## Running the app
After you have installed all dependencies you can now run the app. Run `npm run watch:dev` to start a local server which will watch for changes, rebuild the code, and reload the server for you. You can visit it at `http://localhost:3000`.
Expand Down Expand Up @@ -153,40 +168,44 @@ See [the guide on the wiki](https://wiki.duraspace.org/display/DSPACE/DSpace+7+-
## File Structure
```
dspace-angular
├── README.md * This document
├── app.json * Application manifest file
├── e2e * Folder for e2e test files
├── karma.conf.js * Unit Test configuration file
├── nodemon.json * Nodemon (https://nodemon.io/) configuration
├── package.json * This file describes the npm package for this project, its dependencies, scripts, etc.
├── protractor.conf.js * E2E tests configuration file
├── resources * Folder for static resources
│   ├── i18n * Folder for i18n translations
│   └── images * Folder for images
├── rollup-client.js * Rollup (http://rollupjs.org/) configuration for the client
├── rollup-server.js * Rollup (http://rollupjs.org/) configuration for the server
├── src * The source of the application
│   ├── app * The location of the app module, and root of the application shared by client and server
│   ├── backend * Folder containing a mock of the REST API, hosted by the express server
│   ├── browser.module.ts * The root module for the client
│   ├── client.aot.ts * The bootstrap file for the client, in production
│   ├── client.ts * The bootstrap file for the client, during development
│   ├── index-aot.html * The index.html file, for production
│   ├── index.html * The index.html file, for development
│   ├── node.module.ts * The root module for the server
│   ├── server.aot.ts * The express (http://expressjs.com/) config and bootstrap file for the server, in production
│   ├── server.routes.ts * The routes file for the server
│   ├── server.ts * The express (http://expressjs.com/) config and bootstrap file for the server, during development
│   ├── styles * Folder containing global styles.
│   │   ├── main.scss * Global scss file
│   │   └── variables.scss * Global sass variables file
│   └── typings.d.ts * File that allows you to add custom typings for libraries without TypeScript support
├── tsconfig.aot.json * TypeScript config for production builds
├── tsconfig.json * TypeScript config for development build
├── tslint.json * TSLint (https://palantir.github.io/tslint/) configuration
├── webpack.config.ts * Webpack (https://webpack.github.io/) config for development builds
├── webpack.test.config.ts * Webpack (https://webpack.github.io/) config for testing
└── webpack.prod.config.ts * Webpack (https://webpack.github.io/) config for production builds
├── README.md * This document
├── app.json * Application manifest file
├── config * Folder for configuration files
│   ├── environment.common.default.json * Template for general configuration file
│   └── environment.default.json * Template for the dev and prod configuration files
├── e2e * Folder for e2e test files
├── karma.conf.js * Unit Test configuration file
├── nodemon.json * Nodemon (https://nodemon.io/) configuration
├── package.json * This file describes the npm package for this project, its dependencies, scripts, etc.
├── protractor.conf.js * E2E tests configuration file
├── resources * Folder for static resources
│   ├── i18n * Folder for i18n translations
│   └── images * Folder for images
├── rollup-client.js * Rollup (http://rollupjs.org/) configuration for the client
├── rollup-server.js * Rollup (http://rollupjs.org/) configuration for the server
├── src * The source of the application
│   ├── app * The location of the app module, and root of the application shared by client and server
│   ├── backend * Folder containing a mock of the REST API, hosted by the express server
│   ├── browser.module.ts * The root module for the client
│   ├── client.aot.ts * The bootstrap file for the client, in production
│   ├── client.ts * The bootstrap file for the client, during development
│   ├── config.ts * File that loads common and environment settings and makes available to app components
│   ├── index-aot.html * The index.html file, for production
│   ├── index.html * The index.html file, for development
│   ├── node.module.ts * The root module for the server
│   ├── server.aot.ts * The express (http://expressjs.com/) config and bootstrap file for the server, in production
│   ├── server.routes.ts * The routes file for the server
│   ├── server.ts * The express (http://expressjs.com/) config and bootstrap file for the server, during development
│   ├── styles * Folder containing global styles.
│   │   ├── main.scss * Global scss file
│   │   └── variables.scss * Global sass variables file
│   └── typings.d.ts * File that allows you to add custom typings for libraries without TypeScript support
├── tsconfig.aot.json * TypeScript config for production builds
├── tsconfig.json * TypeScript config for development build
├── tslint.json * TSLint (https://palantir.github.io/tslint/) configuration
├── webpack.config.ts * Webpack (https://webpack.github.io/) config for development builds
├── webpack.test.config.ts * Webpack (https://webpack.github.io/) config for testing
└── webpack.prod.config.ts * Webpack (https://webpack.github.io/) config for production builds
```
## 3rd Party Library Installation
Expand Down
3 changes: 3 additions & 0 deletions config/environment.common.default.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"title": ""
}
26 changes: 26 additions & 0 deletions config/environment.default.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"production": false,
// Location of REST API
"rest": {
// By default, we are currently using a local proxy running on port 5050.
// This is necessary because our actual REST API doesn't provide CORS headers yet!
// The actual REST API path is in the 'proxy' settings below.
// NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript
"nameSpace": "",
"baseURL": ""
},
// REST Location that we are proxying (see src/proxy.ts)
// (Since we are using a proxy at this time, the actual REST API goes here)
"proxy": {
"nameSpace": "",
"baseURL": ""
// E.g. to use demo.dspace.org REST API, use the below values *instead*
//nameSpace: '/rest',
//baseURL: 'https://demo.dspace.org'
},
// Path and Port in use for this Angular2 UI
"ui": {
"nameSpace": "",
"baseURL": ""
}
}
3 changes: 3 additions & 0 deletions src/app/app.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
<main>
<p>{{ 'example.with.data' | translate:data }}</p>
<p>{{ example }}</p>
<p><b>{{ title }}</b></p>
<h2 *ngIf="!env" style="color:green">development</h2>
<h2 *ngIf="env" style="color:red">production</h2>
<router-outlet></router-outlet>
</main>
</div>
9 changes: 9 additions & 0 deletions src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { TranslateService } from "ng2-translate";
import { HostWindowState } from "./shared/host-window.reducer";
import { Store } from "@ngrx/store";
import { HostWindowActions } from "./shared/host-window.actions";
import { GlobalConfig } from "../config";

@Component({
changeDetection: ChangeDetectionStrategy.Default,
Expand All @@ -27,6 +28,13 @@ export class AppComponent implements OnDestroy, OnInit {
recipient: 'World'
};

title: string = GlobalConfig.title;
env: string = GlobalConfig.production;

styles = {
color: 'red'
};

constructor(
private translate: TranslateService,
private store: Store<HostWindowState>
Expand All @@ -51,6 +59,7 @@ export class AppComponent implements OnDestroy, OnInit {

@HostListener('window:resize', ['$event'])
private onResize(event): void {
console.log(GlobalConfig.rest.baseURL);
this.store.dispatch(
HostWindowActions.resize(event.target.innerWidth, event.target.innerHeight)
);
Expand Down
34 changes: 34 additions & 0 deletions src/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Look in ./config folder for config

const path = require('path');

let configContext = require.context("../config", false, /json$/);
let EnvConfig : any = {};
let EnvConfigFile : string;
let CommonConfig : any = {};

try {
CommonConfig = configContext('./environment.common.json');
} catch (e) {
throw new Error(`Cannot find file "${path.resolve('config', './environment.common.json')}"`);
}

switch (process.env.NODE_ENV) {
case 'prod':
case 'production':
EnvConfigFile = './environment.prod.json';
break;
case 'dev':
case 'development':
default:
EnvConfigFile = './environment.dev.json';
}
try {
EnvConfig = configContext(EnvConfigFile);
} catch (e) {
throw new Error(`Cannot find file "${path.resolve('config', EnvConfigFile)}"`);
}

const GlobalConfig = Object.assign(CommonConfig, EnvConfig);

export {GlobalConfig}

0 comments on commit 5ada934

Please sign in to comment.