npm package: @kingdarboja/serverless-plugin-typescript
Description: Serverless plugin for zero-config Typescript support
Author: Prisma Labs
Latest version: 1.4.1

# serverless-plugin-typescript

Serverless plugin for zero-config Typescript support

[![sls][sls-image]][sls-url]
[![npm][npm-image]][npm-url]
[![build][build-image]][build-url]

[sls-image]: http://public.serverless.com/badges/v3.svg
[sls-url]: http://www.serverless.com
[npm-image]: https://badge.fury.io/js/%40kingdarboja%2Fserverless-plugin-typescript.svg
[npm-url]: https://www.npmjs.com/package/@kingdarboja/serverless-plugin-typescript
[build-image]: https://img.shields.io/github/workflow/status/KingDarBoja/serverless-plugin-typescript/CI
[build-url]: https://github.com/KingDarBoja/serverless-plugin-typescript/actions?query=workflow%3ACI

## **Important**

### *This is a fork from official [serverless-plugin-typescript]*

All credit goes to Prisma Labs Team for development of this awesome plugin.

[serverless-plugin-typescript]: https://github.com/prisma-labs/serverless-plugin-typescript

## Features

* Zero-config: Works out of the box without the need to install any other compiler or plugins
* Supports ES2015 syntax + features (`export`, `import`, `async`, `await`, `Promise`, ...)
* Supports `sls package`, `sls deploy` and `sls deploy function`
* Supports `sls invoke local` + `--watch` mode
* Integrates nicely with [`serverless-offline`](https://github.com/dherault/serverless-offline)

## Install

```sh
yarn add --dev @kingdarboja/serverless-plugin-typescript typescript
# or
npm install -D @kingdarboja/serverless-plugin-typescript typescript
```

Add the following plugin to your `serverless.yml`:

```yaml
plugins:
  - '@kingdarboja/serverless-plugin-typescript'
```

## Configure

See [example folder](example) for a minimal example.

### `tsconfig.json`

The default `tsconfig.json` file used by the plugin looks like this:

```json
{
  "compilerOptions": {
    "preserveConstEnums": true,
    "strictNullChecks": true,
    "sourceMap": true,
    "allowJs": true,
    "target": "es5",
    "outDir": ".build",
    "moduleResolution": "node",
    "lib": ["es2015"],
    "rootDir": "./"
  }
}
```

> Note 1: The `outDir` and `rootDir` options cannot be overwritten.

> Note 2: Don't confuse the [`tsconfig.json`](tsconfig.json) in this repository with the one mentioned above.

### Custom Typescript Configuration

This plugin will use your local `tsconfig.json` if it exists. You can configure a path to a custom Typescript configuration inside your `serverless.yml` using:

    ...
    plugins:
      - serverless-plugin-typescript
    custom:
      typeScript:
        tsconfigFilePath: ./tsconfig.build.json
    ...    


### Including extra files

All files from `package/include` will be included in the final build file. See [Exclude/Include](https://serverless.com/framework/docs/providers/aws/guide/packaging#exclude--include)


## Usage

### Google Cloud Functions

When using with Google Cloud Functions via the [serverless-google-cloudfunctions](https://github.com/serverless/serverless-google-cloudfunctions)
plugin, you simply have to provide a `main` field in your `package.json`:

```js
{
  // ...
  "main": "handler.js",
  // ..
}
```

And this plugin will automatically compile your typescript correctly. Note
that the field must refer to the compiled file name, namely, ending with a `.js`
extension.

If a `main` field was not found, then this plugin will use `index.js`. Before
compilation begins, it will check to see that the file indicated exists with a
`.ts` extension before actually trying to compile it.

### Automatic compilation

The normal Serverless deploy procedure will automatically compile with Typescript:

- Create the Serverless project with `serverless create -t aws-nodejs`
- Install Serverless Typescript as above
- Deploy with `serverless deploy`

### Usage with serverless-offline

The plugin integrates very well with [serverless-offline](https://github.com/dherault/serverless-offline) to
simulate AWS Lambda and AWS API Gateway locally.

Add the plugins to your `serverless.yml` file and make sure that `'@kingdarboja/serverless-plugin-typescript'`
precedes `serverless-offline` as the order is important:
```yaml
  plugins:
    ...
    - '@kingdarboja/serverless-plugin-typescript'
    ...
    - serverless-offline
    ...
```

Run `serverless offline` or `serverless offline start` to start the Lambda/API simulation.

In comparison to `serverless offline`, the `start` command will fire an `init` and a `end` lifecycle hook which is needed for `serverless-offline` and e.g. `serverless-dynamodb-local` to switch off resources (see below)

#### serverless-dynamodb-local

Configure your service the same as mentioned above, but additionally add the `serverless-dynamodb-local`
plugin as follows:
```yaml
  plugins:
    - '@kingdarboja/serverless-plugin-typescript'
    - serverless-dynamodb-local
    - serverless-offline
```

Run `serverless offline start`.

#### Other useful options

You can reduce the clutter generated by `serverless-offline` with `--dontPrintOutput` and
disable timeouts with `--noTimeout`.

### Run a function locally

To run your compiled functions locally you can:

```bash
$ serverless invoke local --function <function-name>
```

Options are:

- `--function` or `-f` (required) is the name of the function to run
- `--watch` - recompile and run a function locally on source changes
- `--path` or `-p` (optional) path to JSON or YAML file holding input data
- `--data` or `-d` (optional) input data

### Enabling source-maps

You can easily enable support for source-maps (making stacktraces easier to read) by installing and using the following plugin:

```sh
yarn add --dev source-map-support
```

```ts
// inside of your function
import 'source-map-support/register'
```

If you are using webpack (most likely). Add `devtool: 'source-map'` to `webpack.config.js`:
```js
module.exports = {
  .... snip ....
  devtool: 'source-map',
  .... snip ....

}
```