import type { AwsLiteClient } from "@aws-lite/client" import type { GetConnectionResponse } from "@aws-lite/apigatewaymanagementapi-types"; import type { PublishResponse } from "@aws-lite/sns-types" import type { SendMessageResponse } from "@aws-lite/sqs-types" import type { Context } from "aws-lambda"; import { expectType, expectAssignable, expectNotAssignable } from "tsd"; import arc from "../"; import type { HttpHandler, HttpAsyncHandler } from "../" import type { HttpMethods, HttpRequest, HttpResponse } from "./http"; // SERVICES const servicesResult = await arc.services(); expectType>(servicesResult); // EVENTS const eventsPublishArg = { name: "test", payload: { foo: "bar" } }; const eventsPublishResult = await arc.events.publish(eventsPublishArg); expectType(eventsPublishResult); // QUEUES const queuesPublishArg = { name: "test", payload: { foo: "bar" } }; const queuesPublishResult = await arc.queues.publish(queuesPublishArg); expectType(queuesPublishResult); // HTTP const middleware: HttpHandler = (req, res, next) => { expectType(req); expectType<(p: HttpResponse | Error) => void>(res); expectType<() => void>(next); // doing nothing is valid middleware next(); }; const asyncMiddleware: HttpAsyncHandler = async (req, ctx) => { expectType(req); expectType(ctx); // doing nothing is valid middleware await (new Promise((resolve) => resolve('foo'))); } // default callback pattern arc.http(function (req, res) { expectType(req); expectType(req.isBase64Encoded); expectType<(p: HttpResponse | Error) => void>(res); const responseValue: HttpResponse = { json: { foo: "bar" } }; expectAssignable | undefined>(responseValue.session); expectNotAssignable(responseValue.status); return res(responseValue); }); // with middleware arc.http(middleware, function (req, res) { return res({ json: { foo: "bar" } }); }); // async pattern arc.http(async function (req, ctx) { expectType(req); expectType(ctx); const response: HttpResponse = { html: "

types

" }; return response; } as HttpAsyncHandler); // with async middleware arc.http(asyncMiddleware, async function (req, ctx) { return { text: "types" }; }); // legacy async arc.http.async(asyncMiddleware, async function (req, ctx) { expectType(req); expectType(req.path); expectType(ctx); const response: HttpResponse = { html: "

types

" }; expectAssignable(response.status); expectNotAssignable(response.session); return response; }); const sampleRequest = { httpMethod: "POST" as HttpMethods, method: "POST" as HttpMethods, path: "/", resource: "", pathParameters: { foo: "bar" }, params: { foo: "bar" }, queryStringParameters: { bar: "baz" }, query: { bar: "baz" }, headers: { accept: "any" }, body: "undefined", rawBody: "undefined", isBase64Encoded: false, version: "42", }; expectType>(arc.http.helpers.bodyParser(sampleRequest)); expectType(arc.http.helpers.interpolate(sampleRequest)); expectType(arc.http.helpers.url("/foobar-baz")); // STATIC expectType(arc.static("/my-image.png")); arc.static("/", { stagePath: false }); // TABLES const dbClient = await arc.tables() expectType(dbClient._client) expectType(dbClient.name('widgets')) expectType>(dbClient.reflect()) const myTable = dbClient.foobar const id42 = await myTable.get({ id: 42 }) await myTable.update({ Key: { id: 42 }, UpdateExpression: 'ADD radness :inc', ExpressionAttributeValues: { ':inc': 1 }, }) await myTable.put({ id: 42, put: true }) await myTable.delete({ id: 42 }) await myTable.query({ IndexName: 'fooByBar', KeyConditionExpression: 'bar = :bar', ExpressionAttributeValues: { ':bar': 'baz' }, }) await myTable.scan({ FilterExpression: 'radness > :ninethousand', ExpressionAttributeValues: { ':ninethousand': 9000 }, }) await myTable.scanAll({ FilterExpression: 'radness > :ninethousand', ExpressionAttributeValues: { ':ninethousand': 9000 }, }) // WS expectType(await arc.ws._api()); expectType(await arc.ws.send({ id: "foo", payload: { bar: "baz" } })); expectType(await arc.ws.close({ id: "foo" })); expectType( await arc.ws.info({ id: "foo" }), );