Using serverless
serverless install --url https://github.com/mrdck/serverless-typescript-template --name serverless-applicationUsing git clone
git clone https://github.com/mrdck/serverless-typescript-template serverless-application
cd serverless-application
yarnThis template comes with serverless-offline package for running serverless application against local setup.
yarn startFollowing template leverages testing on Jest framework with serverless-plugin-test-helper for running tests against serverless handlers.
yarn testCode below shows example of test for validating health endpoint
describe('handler', () => {
  test('returns 200 HTTP', async () => {
    const handler = health(new ApiGatewayEvent(), context, jest.fn())
    await expect(handler).resolves.toMatchObject({
      body:       ReasonPhrases.OK,
      statusCode: StatusCodes.OK,
    })
  })
})ESLint is used as linter with ready configuration
yarn lintIn order to change ESLint rules please edit .eslintrc.yml file
yarn deploy├── package.json
├── README.md
├── serverless.yml
├── src
│   ├── common.ts
│   ├── foo.ts
│   ├── health.ts
│   └── middleware.ts
├── tests
│   ├── common.test.ts
│   ├── foo.test.ts
│   └── health.test.ts
├── tsconfig.json
└── yarn.lock
Following template leverage Dependency Injection on inversify package that introduces Inversion of Control container.
In src/common/container there is container component that serve purpose of Root Composite that hooks and instantiate all dependencies with container.
This approach allow easy access on handler level
// container with dependencies is available in context
export async function handler(_: APIGatewayProxyEvent, { container }: Context): Promise<APIGatewayProxyResult> {
  // get dependency bound to container
  const config = container.get<Config>(Config)
  if (config.foo) {
    // some foo logic
  }
  return response(StatusCodes.OK, ReasonPhrases.OK)
}
// handler needs to be decorated with middleware otherwise container is not bound
export const health = middleware(handler)MIT