diff --git a/package.json b/package.json index 0a01fa7f..8c6891f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "@netlify/functions", "main": "./src/main.js", + "types": "./src/main.d.ts", "version": "0.3.1", "description": "JavaScript utilities for Netlify Functions", "files": [ diff --git a/src/function/context.ts b/src/function/context.ts new file mode 100644 index 00000000..2a9897be --- /dev/null +++ b/src/function/context.ts @@ -0,0 +1,24 @@ +// From https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html. +export interface Context { + callbackWaitsForEmptyEventLoop: boolean + functionName: string + functionVersion: string + invokedFunctionArn: string + memoryLimitInMB: string + awsRequestId: string + logGroupName: string + logStreamName: string + identity?: { [key: string]: any } + clientContext?: { [key: string]: any } + + getRemainingTimeInMillis(): number + + /** @deprecated Use handler callback or promise result */ + done(error?: Error, result?: any): void + /** @deprecated Use handler callback with first argument or reject a promise result */ + fail(error: Error | string): void + /** @deprecated Use handler callback with second argument or resolve a promise result */ + succeed(messageOrObject: any): void + /** @deprecated Use handler callback or promise result */ + succeed(message: string, object: any): void +} diff --git a/src/function/event.ts b/src/function/event.ts new file mode 100644 index 00000000..366ab06d --- /dev/null +++ b/src/function/event.ts @@ -0,0 +1,32 @@ +export interface Event { + rawUrl: string + rawQuery: string + path: string + httpMethod: string + headers: EventHeaders + multiValueHeaders: EventMultiValueHeaders + queryStringParameters: EventQueryStringParameters | null + multiValueQueryStringParameters: EventMultiValueQueryStringParameters | null + body: string | null + isBase64Encoded: boolean +} + +interface EventHeaders { + [name: string]: string | undefined +} + +interface EventMultiValueHeaders { + [name: string]: string[] | undefined +} + +interface EventPathParameters { + [name: string]: string | undefined +} + +interface EventQueryStringParameters { + [name: string]: string | undefined +} + +interface EventMultiValueQueryStringParameters { + [name: string]: string[] | undefined +} diff --git a/src/function/handler.ts b/src/function/handler.ts new file mode 100644 index 00000000..01485ffd --- /dev/null +++ b/src/function/handler.ts @@ -0,0 +1,11 @@ +import type { Context } from './context' +import type { Event } from './event' +import type { Response } from './response' + +export interface HandlerCallback { + (error: any, response: Response): void +} + +export interface Handler { + (event: Event, context: Context, callback: HandlerCallback): void | Response | Promise +} diff --git a/src/function/index.ts b/src/function/index.ts new file mode 100644 index 00000000..d69ebc9f --- /dev/null +++ b/src/function/index.ts @@ -0,0 +1,6 @@ +import type { Context } from './context' +import type { Event } from './event' +import type { Handler, HandlerCallback } from './handler' +import { Response } from './response' + +export type { Context as HandlerContext, Event as HandlerEvent, Handler, HandlerCallback, Response as HandlerResponse } diff --git a/src/function/response.ts b/src/function/response.ts new file mode 100644 index 00000000..d6f2fb11 --- /dev/null +++ b/src/function/response.ts @@ -0,0 +1,11 @@ +export interface Response { + statusCode: number + headers?: { + [header: string]: boolean | number | string + } + multiValueHeaders?: { + [header: string]: Array + } + body: string + isBase64Encoded?: boolean +} diff --git a/src/main.d.ts b/src/main.d.ts new file mode 100644 index 00000000..d14af30e --- /dev/null +++ b/src/main.d.ts @@ -0,0 +1 @@ +export * from './function'