# BrightAuthor Next Generation (BANG)
## BrightAuthorNG Data Model

This project contains the data model for BrightAuthor projects implemented on top of Redux.

#### General dependencies
* Node.js 6.x (supports ES6)
    * We have minor dependencies so far in code, otherwise this is used for compiling, running tests, etc.
* Redux, Reselect
* Typescript
* Typings (Typescript definition manager for libraries)
* TsUnit for simple unit testing

#### About Typescript
* This project is currently using version 2.0 of Typescript, which was released on Sept. 6, 2016. The latest version of Webstorm still bundles version 1.8 - see setup instructions below to point Webstorm at the newer compiler.
    * I am using the new _readonly_ keyword which requires version 2.0.

### General Development Prep
* If you get errors when using 'npm install' or 'npm link', see <https://docs.npmjs.com/getting-started/fixing-npm-permissions>
* You still might have to use sudo to install global packages
* Install node.js (Latest version recommended - currently 6.6.0. Electron uses 6.3.0 as of last check.)
* Install the 'typings' package:
    > npm install -g typings
* Typescript: the stand-alone version must be installed and used. If you have already installed it, install again to get version 2.0.
    > npm install - g typescript
    
### Project Prep
* Before doing anything to prepare this project, make sure that the directory you have opened in WebStorm is the baDataModel directory - not the base directory of the repo, which is the master directory for other related projects.
    * The baDataModel directory will then become the "content root" of the WebStorm project - all additional paths are calculated relative to that.
* Install node_modules (this will create or update node-modules directory)
    > npm install
* Link globally installed Typescript compiler for current project
    > npm link typescript
* Retrieve library typings (this will create or update typings directory)
    > typings install
* Extra prepare step to compile the Typescript tsUnit files
    > npm run prepare

### WebStorm Setup
* Open WebStorm Preferences
    * On page: Directories
        * Make sure the top line in the Directory list - the "content root" -  is \<repo_base\>/baDataModel. If it isn't, you probably started in the wrong directory.
    * On page: Languages and Frameworks, select Javascript
        * Select ECMAScript 6 as Javascript language version
    * On page: Languages and Frameworks, expand Javascript node, select Libraries
        * The Redux library is installed by npm, and the typings file should have loaded the library declarations already
        * You should see redux-DefinitelyTyped in the Libraries list - enable it.
        * The library for ECMAScript 6 should also bechecked.
    * On page: Languages and Frameworks, select TypeScript
        * If the Typescript version is less than 2.0, you need to point to version 2 of the compiler that you have installed globally.
            * Click the edit button next to Typescript version
            * Browse to the directory containing the typescriptServices.js files. On macOS, this is probably _/usr/local/lib/node_modules/typescript/lib_.
            * Set this as the custom directory and click ok.
        * Make sure "Enable TypeScript Compiler" and "Track Changes" is  checked (this enables the watcher for immediate transpilation.)
        * Make sure "Resolve objects using tsconfig.json is checked.

* Testing
    * Testing is based on the tsUnit package - see https://github.com/Steve-Fenton/tsUnit
        * The advantage of tsUnit is that it is Typescript, it is simple, and it can be easily debugged and traced.
    * I am currently directly running my various test files, all located in the 'tests' directory, directly from the terminal window.
        * For example, to run the Sign Tests, type:
            > node temp/tests/baDmSignTests.js
        * We are running out of the temp directory because that is where the transpiled javascript is
    * Current configuration of this is very rudimentary. This will get more formalized, but it works fine for development. Eventually we will have a single master test suite entry file.
        
* Set up debug configuration
    * You can debug with the tests as well, placing breakpoints in the Typescript code.
    * From Run menu, select "Edit Configurations..."
    * Click on the '+' at upper left to add a debug configuration.
    * Select Node.js as configuration type. Node.js Debug details page will open.
    * Type a friendly name into the Name box (e.g., 'BaDm Test')
    * In the working directory field, select the full path on your machine to the ../BANextGen/baDataModel/temp/tests
    * In the Javascript file field, type the name of the file you want to debug.
    * Click OK.

* Build and Test
    * No separate build step is necessary currently - the WebStorm Typescript watcher handles it.
    * Run test file directly from terminal window as described above (or add scripts to package.json and run with npm.)
    * Start debugging by clicking on green bug icon at top right of WebStorm menu.

