Skip to content

Commit

Permalink
Initial TypeScript setup
Browse files Browse the repository at this point in the history
  • Loading branch information
kimjoar committed Apr 27, 2017
1 parent 36ccbc1 commit bfb40ab
Show file tree
Hide file tree
Showing 64 changed files with 2,702 additions and 5 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -35,3 +35,4 @@ selenium
*.out
ui_framework/doc_site/build/*.js*
yarn.lock
.vscode/
19 changes: 18 additions & 1 deletion package.json
Expand Up @@ -63,7 +63,9 @@
"mocha": "mocha",
"mocha:debug": "mocha --debug-brk",
"sterilize": "grunt sterilize",
"uiFramework:start": "grunt uiFramework:start"
"uiFramework:start": "grunt uiFramework:start",
"ts:build": "tsc",
"ts:start": "tsc --watch"
},
"repository": {
"type": "git",
Expand Down Expand Up @@ -124,6 +126,7 @@
"expiry-js": "0.1.7",
"exports-loader": "0.6.2",
"expose-loader": "0.7.0",
"express": "4.15.2",
"extract-text-webpack-plugin": "0.8.2",
"file-loader": "0.8.4",
"flot-charts": "0.8.3",
Expand Down Expand Up @@ -184,29 +187,41 @@
"rimraf": "2.4.3",
"rison-node": "1.0.0",
"rjs-repack-loader": "1.0.6",
"rxjs": "5.3.0",
"script-loader": "0.6.1",
"semver": "5.1.0",
"style-loader": "0.12.3",
"tar": "2.2.0",
"tinygradient": "0.3.0",
"trunc-html": "1.0.2",
"trunc-text": "1.0.2",
"type-detect": "4.0.0",
"ui-select": "0.19.6",
"url-loader": "0.5.6",
"validate-npm-package-name": "2.2.2",
"vision": "4.1.0",
"webpack": "github:elastic/webpack#fix/query-params-for-aliased-loaders",
"whatwg-fetch": "0.9.0",
"wreck": "6.2.0",
"yargs": "7.0.2",
"yauzl": "2.7.0"
},
"devDependencies": {
"@elastic/eslint-config-kibana": "0.5.0",
"@spalger/babel-presets": "0.3.2",
"@types/chalk": "0.4.31",
"@types/express": "4.0.35",
"@types/jest": "19.2.2",
"@types/js-yaml": "3.5.29",
"@types/lodash": "3.10.1",
"@types/node": "6.0.68",
"@types/sinon": "1.16.36",
"@types/yargs": "6.6.0",
"angular-mocks": "1.4.7",
"auto-release-sinon": "1.0.3",
"babel-eslint": "6.1.2",
"chai": "3.5.0",
"chalk": "1.1.3",
"chance": "1.0.6",
"cheerio": "0.22.0",
"chokidar": "1.6.0",
Expand Down Expand Up @@ -275,6 +290,8 @@
"source-map-support": "0.2.10",
"supertest": "1.2.0",
"supertest-as-promised": "2.0.2",
"ts-jest": "19.0.13",
"typescript": "2.2.2",
"webpack-dev-server": "1.14.1"
},
"engines": {
Expand Down
55 changes: 55 additions & 0 deletions platform/README.md
@@ -0,0 +1,55 @@
# New platform

## Dev setup

```
npm run ts:start
```

This builds the code into `./ts-tmp/` for now.

(It will most likely show a couple type problems while building, but the files will still be built.)

## VSCode

If you want to see what it looks like with fantastic editor support.

```
$ cat ~/dev/elastic/kibana/.vscode/settings.json
// Place your settings in this file to overwrite default and user settings.
{
"typescript.tsdk": "./node_modules/typescript/lib",
"typescript.referencesCodeLens.enabled": true
}
```

## Running code

(Make sure to build the code first, e.g. `npm run ts:build` or `npm run ts:start`)

Just starts a server:

```
node scripts/platform.js
```

If you update `config/kibana.yml` to e.g. contain `pid.file: ./kibana.pid`
you'll also see it write the PID file. (You can do this while running and just
send a SIGHUP.)

With failure:

```
node scripts/platform.js -c ./config/kibana.dev.yml --port "test"
```

## Running tests

Run Jest:

```
node scripts/jest.js
```

(add `--watch` for re-running on change)

81 changes: 81 additions & 0 deletions platform/app/__tests__/index.test.ts
@@ -0,0 +1,81 @@
const configService = {
start: jest.fn(),
stop: jest.fn(),
reloadConfig: jest.fn(),
getConfig: jest.fn(() => [])
};

const ConfigService = jest.fn(() => configService);

const server = {
start: jest.fn(),
stop: jest.fn()
};
const Server = jest.fn(() => server);

const loggerService = {
upgrade: jest.fn(),
stop: jest.fn()
};

const logger = {
get: jest.fn().mockReturnValue({
info: jest.fn(),
error: jest.fn()
})
};

jest.mock('../../config', () => ({ ConfigService }));
jest.mock('../../server', () => ({ Server }));
jest.mock('../../logger', () => ({ logger, loggerService }));

import { App } from '../';
import { Env } from '../../env';

test('starts services on "start"', () => {
const env = new Env('.');
const argv = { foo: 'bar' };

const app = new App(argv, env);

expect(configService.start).toHaveBeenCalledTimes(0);
expect(loggerService.upgrade).toHaveBeenCalledTimes(0);
expect(server.start).toHaveBeenCalledTimes(0);

app.start();

expect(configService.start).toHaveBeenCalledTimes(1);
expect(loggerService.upgrade).toHaveBeenCalledTimes(1);
expect(server.start).toHaveBeenCalledTimes(1);
});

test('reloads config', () => {
const env = new Env('.');
const argv = { foo: 'bar' };

const app = new App(argv, env);

expect(configService.reloadConfig).toHaveBeenCalledTimes(0);

app.reloadConfig();

expect(configService.reloadConfig).toHaveBeenCalledTimes(1);
});

test('stops services on "shutdown"', () => {
const env = new Env('.');
const argv = { foo: 'bar' };

const app = new App(argv, env);
app.start();

expect(configService.stop).toHaveBeenCalledTimes(0);
expect(loggerService.stop).toHaveBeenCalledTimes(0);
expect(server.stop).toHaveBeenCalledTimes(0);

app.shutdown();

expect(configService.stop).toHaveBeenCalledTimes(1);
expect(loggerService.stop).toHaveBeenCalledTimes(1);
expect(server.stop).toHaveBeenCalledTimes(1);
});
55 changes: 55 additions & 0 deletions platform/app/index.ts
@@ -0,0 +1,55 @@
import { BehaviorSubject } from 'rxjs';

import { Server } from '../server';
import { Env } from '../env';
import { ConfigService } from '../config';
import { loggerService, logger, LoggerConfig } from '../logger';

const log = logger.get('app');

// Top-level entry point to kick off the app

export class App {
configService: ConfigService;
server?: Server;

constructor(
argv: {[key: string]: any},
private readonly env: Env
) {
this.configService = new ConfigService(argv, env);
}

start() {
this.configService.start();

// In general we should try to do as _little_ as possible before we
// configure the logger, so beware of adding features before we kick it
// off below.

const config$ = this.configService.getConfig();

const loggingConfig$ = config$
.map(config => new LoggerConfig(config.atPath('logging')));

loggerService.upgrade(loggingConfig$);

log.info('starting the server');

this.server = new Server(this.env, config$);
this.server.start();
}

reloadConfig() {
this.configService.reloadConfig();
}

shutdown() {
log.info('commencing shutdown sequence :boom:');
if (this.server !== undefined) {
this.server.stop();
}
this.configService.stop();
loggerService.stop();
}
}

0 comments on commit bfb40ab

Please sign in to comment.