@aesop-fables/triginta
Advanced tools
Comparing version 0.3.4 to 0.4.0
@@ -13,2 +13,3 @@ "use strict"; | ||
const params = { method, route, constructor: target }; | ||
console.log('wtf', params); | ||
Reflect.defineMetadata(exports.endpointMetadataKey, params, target); | ||
@@ -15,0 +16,0 @@ RouteRegistry_1.default.register(params); |
import { IServiceContainer, IServiceModule, Newable } from '@aesop-fables/containr'; | ||
import { APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2, Handler } from 'aws-lambda'; | ||
import { IHttpEndpoint } from './IHttpEndpoint'; | ||
import { IHttpEndpoint, IHttpEventHandler } from './IHttpEndpoint'; | ||
export declare type NonNoisyEvent = Omit<APIGatewayProxyEventV2, 'requestContext'>; | ||
export interface BootstrappedHttpLambdaContext { | ||
createHttpEventLambda<Output>(newable: Newable<IHttpEventHandler<Output>>): Handler<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>; | ||
createHttpLambda<Input, Output>(newable: Newable<IHttpEndpoint<Input, Output>>): Handler<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>; | ||
} | ||
export interface IHttpLambdaFactory { | ||
createHandler<Input, Output>(newable: Newable<IHttpEndpoint<Input, Output>>): Handler<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>; | ||
createHandler<Input, Output>(newable: Newable<IHttpEndpoint<Input, Output> | IHttpEventHandler<Output>>): Handler<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>; | ||
createEventHandler<Output>(newable: Newable<IHttpEventHandler<Output>>): Handler<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>; | ||
} | ||
export interface IHttpResponseGenerator { | ||
generateResponse(response?: any): Promise<APIGatewayProxyStructuredResultV2>; | ||
} | ||
export declare class HttpResponseGenerator implements IHttpResponseGenerator { | ||
generateResponse(response?: any): Promise<APIGatewayProxyStructuredResultV2>; | ||
} | ||
export declare class HttpLambdaFactory implements IHttpLambdaFactory { | ||
private readonly container; | ||
constructor(container: IServiceContainer); | ||
createHandler<Input, Output>(newable: Newable<IHttpEndpoint<Input, Output>>): Handler<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>; | ||
createEventHandler<Output>(newable: Newable<IHttpEventHandler<Output>>): Handler<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>; | ||
createHandler<Input, Output>(newable: Newable<IHttpEndpoint<Input, Output> | IHttpEventHandler<Output>>): Handler<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>; | ||
} | ||
@@ -16,0 +25,0 @@ export declare const useTrigintaHttp: IServiceModule; |
@@ -15,3 +15,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.HttpLambda = exports.useTrigintaHttp = exports.HttpLambdaFactory = void 0; | ||
exports.HttpLambda = exports.useTrigintaHttp = exports.HttpLambdaFactory = exports.HttpResponseGenerator = void 0; | ||
/* eslint-disable @typescript-eslint/ban-types */ | ||
@@ -24,2 +24,18 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
const HttpLambdaServices_1 = require("./HttpLambdaServices"); | ||
class HttpResponseGenerator { | ||
generateResponse(response) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
let proxyResponse = response; | ||
if (typeof (proxyResponse === null || proxyResponse === void 0 ? void 0 : proxyResponse.statusCode) === 'undefined') { | ||
// TODO -- Is 200 always correct here? | ||
proxyResponse = { | ||
statusCode: 200, | ||
body: response ? JSON.stringify(response) : undefined, | ||
}; | ||
} | ||
return proxyResponse; | ||
}); | ||
} | ||
} | ||
exports.HttpResponseGenerator = HttpResponseGenerator; | ||
class HttpLambdaFactory { | ||
@@ -29,19 +45,23 @@ constructor(container) { | ||
} | ||
createEventHandler(newable) { | ||
return this.createHandler(newable); | ||
} | ||
createHandler(newable) { | ||
const handler = (event) => __awaiter(this, void 0, void 0, function* () { | ||
const childContainer = this.container.createChildContainer('httpLambda'); | ||
// TODO -- Containr doens't have a way to inject itself YET so we'll just pull the dependency out of the container directly | ||
const responseGenerator = childContainer.get(HttpLambdaServices_1.HttpLambdaServices.HttpResponseGenerator); | ||
try { | ||
const endpoint = this.container.resolve(newable); | ||
const handler = this.container.resolve(newable); | ||
const { body: request } = event; | ||
const response = (yield endpoint.handle(request, event)); | ||
// TODO -- Break this out into a response writer | ||
let proxyResponse = response; | ||
if (typeof (proxyResponse === null || proxyResponse === void 0 ? void 0 : proxyResponse.statusCode) === 'undefined') { | ||
// TODO -- Is 200 always correct here? | ||
proxyResponse = { | ||
statusCode: 200, | ||
body: response ? JSON.stringify(response) : undefined, | ||
}; | ||
let response; | ||
if (request) { | ||
const endpoint = handler; | ||
response = (yield endpoint.handle(request, event)); | ||
} | ||
return proxyResponse; | ||
else { | ||
const eventHandler = handler; | ||
response = (yield eventHandler.handle(event)); | ||
} | ||
return responseGenerator.generateResponse(response); | ||
} | ||
@@ -72,2 +92,3 @@ finally { | ||
exports.useTrigintaHttp = (0, containr_1.createServiceModule)('triginta/http', (services) => { | ||
services.use(HttpLambdaServices_1.HttpLambdaServices.HttpResponseGenerator, HttpResponseGenerator); | ||
services.register(HttpLambdaServices_1.HttpLambdaServices.HttpLambdaFactory, (container) => new HttpLambdaFactory(container)); | ||
@@ -81,2 +102,6 @@ }); | ||
return { | ||
createHttpEventLambda(newable) { | ||
const factory = container.get(HttpLambdaServices_1.HttpLambdaServices.HttpLambdaFactory); | ||
return factory.createEventHandler(newable); | ||
}, | ||
createHttpLambda(newable) { | ||
@@ -83,0 +108,0 @@ const factory = container.get(HttpLambdaServices_1.HttpLambdaServices.HttpLambdaFactory); |
export declare const HttpLambdaServices: { | ||
HttpLambdaFactory: string; | ||
HttpResponseGenerator: string; | ||
}; |
@@ -6,2 +6,3 @@ "use strict"; | ||
HttpLambdaFactory: 'HttpLambdaFactory', | ||
HttpResponseGenerator: 'HttpResponseGenerator', | ||
}; |
@@ -1,3 +0,6 @@ | ||
export interface IHandler<Message, Event = any, Return = void> { | ||
export interface IEventHandler<Event = any, Return = void> { | ||
handle(event: Event): Promise<Return>; | ||
} | ||
export interface IMessageHandler<Message, Event = any, Return = void> { | ||
handle(message: Message, event: Event): Promise<Return>; | ||
} |
"use strict"; | ||
/* eslint-disable @typescript-eslint/no-explicit-any */ | ||
Object.defineProperty(exports, "__esModule", { value: true }); |
import { APIGatewayProxyEventV2 } from 'aws-lambda'; | ||
import { IHandler } from './IHandler'; | ||
export interface IHttpEndpoint<Input, Output> extends IHandler<Input, APIGatewayProxyEventV2, Output> { | ||
import { IEventHandler, IMessageHandler } from './IHandler'; | ||
export interface IHttpEventHandler<Output = void> extends IEventHandler<APIGatewayProxyEventV2, Output> { | ||
} | ||
export interface IHttpEndpoint<Input, Output> extends IMessageHandler<Input, APIGatewayProxyEventV2, Output> { | ||
} |
@@ -1,4 +0,3 @@ | ||
import 'reflect-metadata'; | ||
import { IHandler } from './IHandler'; | ||
import { IHttpEndpoint } from './IHttpEndpoint'; | ||
export * from './IHandler'; | ||
export * from './IHttpEndpoint'; | ||
export * from './Decorators'; | ||
@@ -11,2 +10,1 @@ export * from './HttpLambda'; | ||
export * from './TrigintaConfig'; | ||
export { IHandler, IHttpEndpoint }; |
@@ -21,5 +21,5 @@ "use strict"; | ||
exports.RouteRegistry = void 0; | ||
require("reflect-metadata"); | ||
__exportStar(require("./IHandler"), exports); | ||
__exportStar(require("./IHttpEndpoint"), exports); | ||
__exportStar(require("./Decorators"), exports); | ||
// export * from './Middleware'; | ||
__exportStar(require("./HttpLambda"), exports); | ||
@@ -26,0 +26,0 @@ __exportStar(require("./HttpLambdaServices"), exports); |
import { APIGatewayProxyEventPathParameters, APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2 } from 'aws-lambda'; | ||
import { IServiceContainer } from '@aesop-fables/containr'; | ||
import { IConfiguredRoute } from './IConfiguredRoute'; | ||
export interface InvocationContext { | ||
declare type InvocableEvent = Omit<APIGatewayProxyEventV2, 'body'> & { | ||
body: any; | ||
}; | ||
export interface InvocationContext extends Partial<InvocableEvent> { | ||
configuredRoute: IConfiguredRoute; | ||
container: IServiceContainer; | ||
body?: any; | ||
path: string; | ||
} | ||
@@ -15,1 +16,2 @@ export declare function parseRouteParams(route: string, path: string): APIGatewayProxyEventPathParameters; | ||
export declare function invokeHttpHandler<Output>(context: InvocationContext): Promise<APIGatewayProxyStructuredResultV2>; | ||
export {}; |
@@ -55,6 +55,7 @@ "use strict"; | ||
function parsePathParameters(context) { | ||
const { path } = context; | ||
var _a; | ||
const { rawPath } = context; | ||
let queryStringParameters = {}; | ||
if (path.indexOf('?') !== -1) { | ||
const values = path.split('?'); | ||
if ((rawPath === null || rawPath === void 0 ? void 0 : rawPath.indexOf('?')) !== -1) { | ||
const values = (_a = rawPath === null || rawPath === void 0 ? void 0 : rawPath.split('?')) !== null && _a !== void 0 ? _a : []; | ||
if (values.length > 1) { | ||
@@ -65,4 +66,4 @@ queryStringParameters = node_querystring_1.default.parse(values[1]); | ||
return { | ||
rawPath: path, | ||
pathParameters: parseRouteParams(context.configuredRoute.route, context.path), | ||
rawPath, | ||
pathParameters: parseRouteParams(context.configuredRoute.route, context.rawPath), | ||
queryStringParameters, | ||
@@ -72,17 +73,27 @@ }; | ||
exports.parsePathParameters = parsePathParameters; | ||
function stringOrJsonStringify(input) { | ||
if (typeof input === 'undefined') { | ||
return undefined; | ||
} | ||
if (typeof input === 'string') { | ||
return input; | ||
} | ||
return JSON.stringify(input); | ||
} | ||
const DEFAULT_HEADERS = { | ||
accept: '*/*', | ||
'accept-encoding': 'gzip, deflate, br', | ||
// 'content-length': '0', | ||
'content-type': 'application/json', | ||
host: '', | ||
'user-agent': 'triginta/1.0', | ||
'x-amzn-trace-id': 'Root=1-63e26f79-577a8db87d3b31fa4da65566', | ||
'x-forwarded-for': '127.0.0.1', | ||
'x-forwarded-port': '80', | ||
'x-forwarded-proto': 'http', | ||
}; | ||
function createApiGatewayEvent(context) { | ||
const { configuredRoute, path, body } = context; | ||
const { configuredRoute, rawPath, body, headers } = context; | ||
const routeKey = `${configuredRoute.method} ${configuredRoute.route}`; | ||
const event = Object.assign({ version: '2.0', routeKey, headers: { | ||
accept: '*/*', | ||
'accept-encoding': 'gzip, deflate, br', | ||
// 'content-length': '0', | ||
'content-type': 'application/json', | ||
host: '', | ||
'user-agent': 'triginta/1.0', | ||
'x-amzn-trace-id': 'Root=1-63e26f79-577a8db87d3b31fa4da65566', | ||
'x-forwarded-for': '127.0.0.1', | ||
'x-forwarded-port': '80', | ||
'x-forwarded-proto': 'http', | ||
}, requestContext: { | ||
const event = Object.assign({ version: '2.0', routeKey, headers: Object.assign(Object.assign({}, DEFAULT_HEADERS), headers), requestContext: { | ||
accountId: '888888888888', | ||
@@ -94,3 +105,3 @@ apiId: 'trigintaLocal', | ||
method: configuredRoute.method, | ||
path, | ||
path: rawPath !== null && rawPath !== void 0 ? rawPath : '', | ||
protocol: 'HTTP/1.1', | ||
@@ -105,3 +116,3 @@ sourceIp: '127.0.0.1', | ||
timeEpoch: Date.now(), | ||
}, body: body ? JSON.stringify(body) : undefined }, parsePathParameters(context)); | ||
}, body: stringOrJsonStringify(body) }, parsePathParameters(context)); | ||
return event; | ||
@@ -108,0 +119,0 @@ } |
{ | ||
"name": "@aesop-fables/triginta", | ||
"version": "0.3.4", | ||
"version": "0.4.0", | ||
"description": "A lightweight framework that wraps the basic infrastructure usages of AWS Lambda (SQS, Kinesis, etc.).", | ||
@@ -27,12 +27,15 @@ "type": "commonjs", | ||
"devDependencies": { | ||
"@aesop-fables/containr": "^0.1.5", | ||
"@aesop-fables/containr": "^0.2.3", | ||
"@middy/core": "^4.2.7", | ||
"@middy/http-error-handler": "^4.2.3", | ||
"@middy/http-json-body-parser": "^4.2.3", | ||
"@types/aws-lambda": "^8.10.109", | ||
"@types/jest": "^29.2.4", | ||
"@types/jest": "^29.5.0", | ||
"@types/node": "^18.11.11", | ||
"@typescript-eslint/eslint-plugin": "^5.45.1", | ||
"@typescript-eslint/parser": "5.52.0", | ||
"@typescript-eslint/parser": "5.55.0", | ||
"esbuild": "^0.17.8", | ||
"eslint": "8.34.0", | ||
"eslint-config-prettier": "^8.5.0", | ||
"eslint-plugin-jest": "27.1.6", | ||
"eslint-plugin-jest": "27.2.1", | ||
"eslint-plugin-prettier": "^4.2.1", | ||
@@ -42,3 +45,4 @@ "jest": "29.3.1", | ||
"prettier": "^2.8.1", | ||
"ts-jest": "29.0.1", | ||
"reflect-metadata": "^0.1.13", | ||
"ts-jest": "29.0.5", | ||
"typescript": "4.9.5" | ||
@@ -49,8 +53,8 @@ }, | ||
], | ||
"dependencies": { | ||
"@middy/core": "^4.2.3", | ||
"@middy/http-error-handler": "^4.2.3", | ||
"@middy/http-json-body-parser": "^4.2.3", | ||
"reflect-metadata": "^0.1.13", | ||
"xss": "^1.0.9" | ||
"peerDependencies": { | ||
"@aesop-fables/containr": "0.2.x", | ||
"@middy/core": "4.x", | ||
"@middy/http-error-handler": "4.x", | ||
"@middy/http-json-body-parser": "4.x", | ||
"reflect-metadata": "0.1.x" | ||
}, | ||
@@ -57,0 +61,0 @@ "repository": { |
# @aesop-fables/triginta | ||
`triginta` is a lightweight framework that wraps the basic infrastructure usages of AWS Lambda (SQS, Kinesis, etc.). For APIs, see our `API framework`. It aims | ||
to conventionalize logging, error handling, and X-Ray integration. | ||
`triginta` is a lightweight framework that wraps the basic infrastructure usages of AWS Lambda (SQS, Kinesis, etc.) and is entirely based on top of Middyjs. | ||
@@ -14,35 +13,13 @@ ## Installation | ||
## Supported Lambdas | ||
The following can be created via the `ILambdaFactory` interface: | ||
## Docs | ||
1. SQS Lambdas (`createSqsLambda`) | ||
2. S3 Lambdas (`createS3Lambda`) | ||
3. Kinesis Lambdas (`createKinesisLambda`) | ||
Docs are coming. In the meantime, we recommend you checkout the docs from middyjs and our example repo: | ||
https://github.com/aesop-fables/triginta-example | ||
## Known issues | ||
We're missing unit tests, logging, error handling, middleware support, and X-Ray integration. This will all come soon - I just wanted to get the basic structure published. | ||
## Example | ||
```typescript | ||
// index.ts | ||
interface MyQueuedMessage { | ||
message: string; | ||
} | ||
## Breaking Changes | ||
class MyLambda implements IHandler<MyQueuedMessage> { | ||
async handle(message: MyQueuedMessage): Promise<void> { | ||
console.log('HELLO, WORLD!'); | ||
console.log(JSON.stringify(message, null, 2)); | ||
} | ||
} | ||
### v0.4.0 | ||
// obviously you need to register all of your stuff | ||
const container = bootstrap(); | ||
// triginta doesn't depend on containr but it abstracts out the creation of your handler | ||
// so that you can easily plug it in (see the `factory` property) | ||
const lambdaFactory = container.get<ILambdaFactory>(); | ||
export const handler = lambdaFactory.createSqsLambda<MyLambda>({ | ||
factory: () => container.get<MyLambda>('lambda'), | ||
}); | ||
``` | ||
The `path` property of the `InvocationContext` (used in `invokeHttpHandler`) was renamed to `rawPath` to properly match the | ||
expected API Gateway Event. |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
25065
20
23
482
25
+ Added@aesop-fables/containr@0.2.5(transitive)
+ Added@ampproject/remapping@2.3.0(transitive)
+ Added@babel/code-frame@7.24.7(transitive)
+ Added@babel/compat-data@7.25.4(transitive)
+ Added@babel/core@7.25.2(transitive)
+ Added@babel/generator@7.25.6(transitive)
+ Added@babel/helper-compilation-targets@7.25.2(transitive)
+ Added@babel/helper-module-imports@7.24.7(transitive)
+ Added@babel/helper-module-transforms@7.25.2(transitive)
+ Added@babel/helper-plugin-utils@7.24.8(transitive)
+ Added@babel/helper-simple-access@7.24.7(transitive)
+ Added@babel/helper-string-parser@7.24.8(transitive)
+ Added@babel/helper-validator-identifier@7.24.7(transitive)
+ Added@babel/helper-validator-option@7.24.8(transitive)
+ Added@babel/helpers@7.25.6(transitive)
+ Added@babel/highlight@7.24.7(transitive)
+ Added@babel/parser@7.25.6(transitive)
+ Added@babel/plugin-syntax-async-generators@7.8.4(transitive)
+ Added@babel/plugin-syntax-bigint@7.8.3(transitive)
+ Added@babel/plugin-syntax-class-properties@7.12.13(transitive)
+ Added@babel/plugin-syntax-class-static-block@7.14.5(transitive)
+ Added@babel/plugin-syntax-import-attributes@7.25.6(transitive)
+ Added@babel/plugin-syntax-import-meta@7.10.4(transitive)
+ Added@babel/plugin-syntax-json-strings@7.8.3(transitive)
+ Added@babel/plugin-syntax-jsx@7.24.7(transitive)
+ Added@babel/plugin-syntax-logical-assignment-operators@7.10.4(transitive)
+ Added@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(transitive)
+ Added@babel/plugin-syntax-numeric-separator@7.10.4(transitive)
+ Added@babel/plugin-syntax-object-rest-spread@7.8.3(transitive)
+ Added@babel/plugin-syntax-optional-catch-binding@7.8.3(transitive)
+ Added@babel/plugin-syntax-optional-chaining@7.8.3(transitive)
+ Added@babel/plugin-syntax-private-property-in-object@7.14.5(transitive)
+ Added@babel/plugin-syntax-top-level-await@7.14.5(transitive)
+ Added@babel/plugin-syntax-typescript@7.25.4(transitive)
+ Added@babel/template@7.25.0(transitive)
+ Added@babel/traverse@7.25.6(transitive)
+ Added@babel/types@7.25.6(transitive)
+ Added@bcoe/v8-coverage@0.2.3(transitive)
+ Added@istanbuljs/load-nyc-config@1.1.0(transitive)
+ Added@istanbuljs/schema@0.1.3(transitive)
+ Added@jest/console@29.7.0(transitive)
+ Added@jest/core@29.7.0(transitive)
+ Added@jest/environment@29.7.0(transitive)
+ Added@jest/expect@29.7.0(transitive)
+ Added@jest/expect-utils@29.7.0(transitive)
+ Added@jest/fake-timers@29.7.0(transitive)
+ Added@jest/globals@29.7.0(transitive)
+ Added@jest/reporters@29.7.0(transitive)
+ Added@jest/schemas@29.6.3(transitive)
+ Added@jest/source-map@29.6.3(transitive)
+ Added@jest/test-result@29.7.0(transitive)
+ Added@jest/test-sequencer@29.7.0(transitive)
+ Added@jest/transform@29.7.0(transitive)
+ Added@jest/types@29.6.3(transitive)
+ Added@jridgewell/gen-mapping@0.3.5(transitive)
+ Added@jridgewell/resolve-uri@3.1.2(transitive)
+ Added@jridgewell/set-array@1.2.1(transitive)
+ Added@jridgewell/sourcemap-codec@1.5.0(transitive)
+ Added@jridgewell/trace-mapping@0.3.25(transitive)
+ Added@sinclair/typebox@0.27.8(transitive)
+ Added@sinonjs/commons@3.0.1(transitive)
+ Added@sinonjs/fake-timers@10.3.0(transitive)
+ Added@types/babel__core@7.20.5(transitive)
+ Added@types/babel__generator@7.6.8(transitive)
+ Added@types/babel__template@7.4.4(transitive)
+ Added@types/babel__traverse@7.20.6(transitive)
+ Added@types/graceful-fs@4.1.9(transitive)
+ Added@types/istanbul-lib-coverage@2.0.6(transitive)
+ Added@types/istanbul-lib-report@3.0.3(transitive)
+ Added@types/istanbul-reports@3.0.4(transitive)
+ Added@types/node@22.6.1(transitive)
+ Added@types/stack-utils@2.0.3(transitive)
+ Added@types/yargs@17.0.33(transitive)
+ Added@types/yargs-parser@21.0.3(transitive)
+ Addedansi-escapes@4.3.2(transitive)
+ Addedansi-regex@5.0.1(transitive)
+ Addedansi-styles@3.2.14.3.05.2.0(transitive)
+ Addedanymatch@3.1.3(transitive)
+ Addedargparse@1.0.10(transitive)
+ Addedbabel-jest@29.7.0(transitive)
+ Addedbabel-plugin-istanbul@6.1.1(transitive)
+ Addedbabel-plugin-jest-hoist@29.6.3(transitive)
+ Addedbabel-preset-current-node-syntax@1.1.0(transitive)
+ Addedbabel-preset-jest@29.6.3(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbraces@3.0.3(transitive)
+ Addedbrowserslist@4.23.3(transitive)
+ Addedbser@2.1.1(transitive)
+ Addedbuffer-from@1.1.2(transitive)
+ Addedcallsites@3.1.0(transitive)
+ Addedcamelcase@5.3.16.3.0(transitive)
+ Addedcaniuse-lite@1.0.30001663(transitive)
+ Addedchalk@2.4.24.1.2(transitive)
+ Addedchar-regex@1.0.2(transitive)
+ Addedci-info@3.9.0(transitive)
+ Addedcjs-module-lexer@1.4.1(transitive)
+ Addedcliui@8.0.1(transitive)
+ Addedco@4.6.0(transitive)
+ Addedcollect-v8-coverage@1.0.2(transitive)
+ Addedcolor-convert@1.9.32.0.1(transitive)
+ Addedcolor-name@1.1.31.1.4(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedconvert-source-map@2.0.0(transitive)
+ Addedcreate-jest@29.7.0(transitive)
+ Addedcross-spawn@7.0.3(transitive)
+ Addeddebug@4.3.7(transitive)
+ Addeddedent@1.5.3(transitive)
+ Addeddeepmerge@4.3.1(transitive)
+ Addeddetect-newline@3.1.0(transitive)
+ Addeddiff-sequences@29.6.3(transitive)
+ Addedelectron-to-chromium@1.5.27(transitive)
+ Addedemittery@0.13.1(transitive)
+ Addedemoji-regex@8.0.0(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addedescalade@3.2.0(transitive)
+ Addedescape-string-regexp@1.0.52.0.0(transitive)
+ Addedesprima@4.0.1(transitive)
+ Addedexeca@5.1.1(transitive)
+ Addedexit@0.1.2(transitive)
+ Addedexpect@29.7.0(transitive)
+ Addedfast-json-stable-stringify@2.1.0(transitive)
+ Addedfb-watchman@2.0.2(transitive)
+ Addedfill-range@7.1.1(transitive)
+ Addedfind-up@4.1.0(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfsevents@2.3.3(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedgensync@1.0.0-beta.2(transitive)
+ Addedget-caller-file@2.0.5(transitive)
+ Addedget-package-type@0.1.0(transitive)
+ Addedget-stream@6.0.1(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedglobals@11.12.0(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhas-flag@3.0.04.0.0(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedhtml-escaper@2.0.2(transitive)
+ Addedhuman-signals@2.1.0(transitive)
+ Addedimport-local@3.2.0(transitive)
+ Addedimurmurhash@0.1.4(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-core-module@2.15.1(transitive)
+ Addedis-fullwidth-code-point@3.0.0(transitive)
+ Addedis-generator-fn@2.1.0(transitive)
+ Addedis-number@7.0.0(transitive)
+ Addedis-stream@2.0.1(transitive)
+ Addedisexe@2.0.0(transitive)
+ Addedistanbul-lib-coverage@3.2.2(transitive)
+ Addedistanbul-lib-instrument@5.2.16.0.3(transitive)
+ Addedistanbul-lib-report@3.0.1(transitive)
+ Addedistanbul-lib-source-maps@4.0.1(transitive)
+ Addedistanbul-reports@3.1.7(transitive)
+ Addedjest@29.7.0(transitive)
+ Addedjest-changed-files@29.7.0(transitive)
+ Addedjest-circus@29.7.0(transitive)
+ Addedjest-cli@29.7.0(transitive)
+ Addedjest-config@29.7.0(transitive)
+ Addedjest-diff@29.7.0(transitive)
+ Addedjest-docblock@29.7.0(transitive)
+ Addedjest-each@29.7.0(transitive)
+ Addedjest-environment-node@29.7.0(transitive)
+ Addedjest-get-type@29.6.3(transitive)
+ Addedjest-haste-map@29.7.0(transitive)
+ Addedjest-leak-detector@29.7.0(transitive)
+ Addedjest-matcher-utils@29.7.0(transitive)
+ Addedjest-message-util@29.7.0(transitive)
+ Addedjest-mock@29.7.0(transitive)
+ Addedjest-mock-extended@3.0.7(transitive)
+ Addedjest-pnp-resolver@1.2.3(transitive)
+ Addedjest-regex-util@29.6.3(transitive)
+ Addedjest-resolve@29.7.0(transitive)
+ Addedjest-resolve-dependencies@29.7.0(transitive)
+ Addedjest-runner@29.7.0(transitive)
+ Addedjest-runtime@29.7.0(transitive)
+ Addedjest-snapshot@29.7.0(transitive)
+ Addedjest-util@29.7.0(transitive)
+ Addedjest-validate@29.7.0(transitive)
+ Addedjest-watcher@29.7.0(transitive)
+ Addedjest-worker@29.7.0(transitive)
+ Addedjs-tokens@4.0.0(transitive)
+ Addedjs-yaml@3.14.1(transitive)
+ Addedjsesc@2.5.2(transitive)
+ Addedjson-parse-even-better-errors@2.3.1(transitive)
+ Addedjson5@2.2.3(transitive)
+ Addedkleur@3.0.3(transitive)
+ Addedleven@3.1.0(transitive)
+ Addedlines-and-columns@1.2.4(transitive)
+ Addedlocate-path@5.0.0(transitive)
+ Addedlru-cache@5.1.1(transitive)
+ Addedmake-dir@4.0.0(transitive)
+ Addedmakeerror@1.0.12(transitive)
+ Addedmerge-stream@2.0.0(transitive)
+ Addedmicromatch@4.0.8(transitive)
+ Addedmimic-fn@2.1.0(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedms@2.1.3(transitive)
+ Addednatural-compare@1.4.0(transitive)
+ Addednode-int64@0.4.0(transitive)
+ Addednode-releases@2.0.18(transitive)
+ Addednormalize-path@3.0.0(transitive)
+ Addednpm-run-path@4.0.1(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedonetime@5.1.2(transitive)
+ Addedp-limit@2.3.03.1.0(transitive)
+ Addedp-locate@4.1.0(transitive)
+ Addedp-try@2.2.0(transitive)
+ Addedparse-json@5.2.0(transitive)
+ Addedpath-exists@4.0.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-key@3.1.1(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpicocolors@1.1.0(transitive)
+ Addedpicomatch@2.3.1(transitive)
+ Addedpirates@4.0.6(transitive)
+ Addedpkg-dir@4.2.0(transitive)
+ Addedpretty-format@29.7.0(transitive)
+ Addedprompts@2.4.2(transitive)
+ Addedpure-rand@6.1.0(transitive)
+ Addedreact-is@18.3.1(transitive)
+ Addedrequire-directory@2.1.1(transitive)
+ Addedresolve@1.22.8(transitive)
+ Addedresolve-cwd@3.0.0(transitive)
+ Addedresolve-from@5.0.0(transitive)
+ Addedresolve.exports@2.0.2(transitive)
+ Addedsemver@6.3.17.6.3(transitive)
+ Addedshebang-command@2.0.0(transitive)
+ Addedshebang-regex@3.0.0(transitive)
+ Addedsignal-exit@3.0.7(transitive)
+ Addedsisteransi@1.0.5(transitive)
+ Addedslash@3.0.0(transitive)
+ Addedsource-map@0.6.1(transitive)
+ Addedsource-map-support@0.5.13(transitive)
+ Addedsprintf-js@1.0.3(transitive)
+ Addedstack-utils@2.0.6(transitive)
+ Addedstring-length@4.0.2(transitive)
+ Addedstring-width@4.2.3(transitive)
+ Addedstrip-ansi@6.0.1(transitive)
+ Addedstrip-bom@4.0.0(transitive)
+ Addedstrip-final-newline@2.0.0(transitive)
+ Addedstrip-json-comments@3.1.1(transitive)
+ Addedsupports-color@5.5.07.2.08.1.1(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedtest-exclude@6.0.0(transitive)
+ Addedtmpl@1.0.5(transitive)
+ Addedto-fast-properties@2.0.0(transitive)
+ Addedto-regex-range@5.0.1(transitive)
+ Addedts-essentials@10.0.2(transitive)
+ Addedtype-detect@4.0.8(transitive)
+ Addedtype-fest@0.21.3(transitive)
+ Addedtypescript@5.6.2(transitive)
+ Addedundici-types@6.19.8(transitive)
+ Addedupdate-browserslist-db@1.1.0(transitive)
+ Addedv8-to-istanbul@9.3.0(transitive)
+ Addedwalker@1.0.8(transitive)
+ Addedwhich@2.0.2(transitive)
+ Addedwrap-ansi@7.0.0(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedwrite-file-atomic@4.0.2(transitive)
+ Addedy18n@5.0.8(transitive)
+ Addedyallist@3.1.1(transitive)
+ Addedyargs@17.7.2(transitive)
+ Addedyargs-parser@21.1.1(transitive)
+ Addedyocto-queue@0.1.0(transitive)
- Removed@middy/core@^4.2.3
- Removed@middy/http-error-handler@^4.2.3
- Removed@middy/http-json-body-parser@^4.2.3
- Removedreflect-metadata@^0.1.13
- Removedxss@^1.0.9
- Removedcommander@2.20.3(transitive)
- Removedcssfilter@0.0.10(transitive)
- Removedxss@1.0.15(transitive)