Skip to content

Commit

Permalink
Successful testing of the reboot.
Browse files Browse the repository at this point in the history
  • Loading branch information
julienblinnv committed Jun 6, 2018
1 parent 67e1e6f commit 34a1dbf
Show file tree
Hide file tree
Showing 27 changed files with 2,074 additions and 2,088 deletions.
3,914 changes: 1,957 additions & 1,957 deletions package-lock.json

Large diffs are not rendered by default.

28 changes: 1 addition & 27 deletions src/builder.ts → src/core/builder.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { isAPIGatewayProxyResult, ServicesWithParseBody, ServicesWithParseParameters } from "@middlewares/proxy";
import { notFoundError } from "@src/errors";
import { ok } from "@src/responses";
import * as awsLambda from "aws-lambda";
import { isAPIGatewayProxyResult, ServicesWithParseBody, ServicesWithParseParameters } from "../middlewares/proxy";

export interface LambdaArg<TEvent, TServices> {
event: TEvent;
Expand Down Expand Up @@ -58,27 +56,3 @@ export class LambdaBuildImpl implements LambdaBuilder {
}

export const lambda = (): LambdaBuilder => new LambdaBuildImpl();

export type ProxyFunc<TServices> =
(
lambda: { event: awsLambda.APIGatewayProxyEvent, context: awsLambda.Context },
services: TServices & ServicesWithParseBody & ServicesWithParseParameters) => Promise<any>;

export const proxy = <TServices = any>(func: ProxyFunc<TServices>)
: LambdaExecution<awsLambda.APIGatewayProxyEvent, TServices> => {
return async (arg: LambdaArg<awsLambda.APIGatewayProxyEvent, TServices>) => {
const result = await func(
{ context: arg.context, event: arg.event },
arg.services as TServices & ServicesWithParseBody & ServicesWithParseParameters);

if (result && isAPIGatewayProxyResult(result)) {
return result;
}

if (result) {
return ok(result);
} else {
throw notFoundError(arg.event.path);
}
};
};
File renamed without changes.
File renamed without changes.
9 changes: 9 additions & 0 deletions src/core/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export * from "./builder";
export * from "./container";
export * from "./errors";
export * from "./json-schema";
export * from "./responses";
export * from "./utils";
export * from "./validator";
import * as StatusCodes from "http-status-codes";
export const HttpStatusCodes = StatusCodes;
File renamed without changes.
File renamed without changes.
File renamed without changes.
4 changes: 2 additions & 2 deletions src/validator.ts → src/core/validator.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ErrorData } from "@src/errors";
import { JSONSchema } from "@src/json-schema";
import * as Ajv from "ajv";
import { ErrorData } from "./errors";
import { JSONSchema } from "./json-schema";

const ajv = new Ajv({
allErrors: true,
Expand Down
12 changes: 3 additions & 9 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
export * from "./builder";
export * from "./errors";
export * from "./container";
export * from "./json-schema";
export * from "./responses";
export * from "./utils";
export * from "./validator";
import * as StatusCodes from "http-status-codes";
export const HttpStatusCodes = StatusCodes;
export * from "./core";
export * from "./middlewares";
export * from "./services";
6 changes: 3 additions & 3 deletions src/middlewares/container.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { LambdaArg, LambdaExecution, Middleware } from "@src/builder";
import { RootContainer } from "@src/container";
import { supportDestructuring } from "@src/utils";
import { LambdaArg, LambdaExecution, Middleware } from "../core/builder";
import { RootContainer } from "../core/container";
import { supportDestructuring } from "../core/utils";

export type ContainerInitialization<TEvent, TServices> =
(arg: LambdaArg<TEvent, TServices>) => RootContainer<TServices>;
Expand Down
74 changes: 56 additions & 18 deletions src/middlewares/proxy.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { LambdaArg, LambdaExecution, Middleware } from "@src/builder";
import { badRequestError, internalServerError, isStatusCodeProvider } from "@src/errors";
import { memoize, safeJSONStringify } from "@src/utils";
import * as awsLambda from "aws-lambda";
import { parse as parseQS } from "querystring";
import { LambdaArg, LambdaExecution, Middleware } from "../core/builder";
import { badRequestError, internalServerError, isStatusCodeProvider, notFoundError } from "../core/errors";
import { ok } from "../core/responses";
import { memoize, safeJSONStringify } from "../core/utils";

/**
* Determine if result is an APIGatewayProxyResult.
Expand Down Expand Up @@ -115,7 +116,7 @@ export const serializeBodyAsJSON =
export const PARSE_BODY_METHOD = "parseBody";

export interface ServicesWithParseBody {
[PARSE_BODY_METHOD](): any;
[PARSE_BODY_METHOD]<T>(): T;
}

/**
Expand Down Expand Up @@ -172,15 +173,13 @@ export const parseBodyAsFORM = (reviver?: (key: any, value: any) => any, parseMe
export const PARSE_PARAMETERS_METHOD = "parseParameters";

export interface ServicesWithParseParameters {
[PARSE_PARAMETERS_METHOD](): any;
[PARSE_PARAMETERS_METHOD]<T>(): T;
}

const decodeFromSource = (source: { [name: string]: string }, params: any) => {
for (const prop in source) {
if (source.hasOwnProperty(prop)) {
params[prop] = decodeURIComponent(source[prop]);
}
}
Object.keys(source).forEach((prop) => {
params[prop] = decodeURIComponent(source[prop]);
});
};

/**
Expand All @@ -194,19 +193,58 @@ export const parseParameters = (parseMethod = PARSE_PARAMETERS_METHOD)
next: LambdaExecution<awsLambda.APIGatewayProxyEvent, any>): Promise<any> => {

arg.services[parseMethod] = memoize(() => {
const params: any = {};
try {
const params: any = {};

if (arg.event && arg.event.pathParameters) {
decodeFromSource(arg.event.pathParameters, params);
}
if (arg.event && arg.event.pathParameters) {
decodeFromSource(arg.event.pathParameters, params);
}

if (arg.event && arg.event.queryStringParameters) {
decodeFromSource(arg.event.queryStringParameters, params);
}
if (arg.event && arg.event.queryStringParameters) {
decodeFromSource(arg.event.queryStringParameters, params);
}

return params;
return params;
} catch (error) {
console.error(error);
}
});

return next(arg);
};
};

export type ProxyFunc<TServices> =
(
lambda: { event: awsLambda.APIGatewayProxyEvent, context: awsLambda.Context },
services: TServices & ServicesWithParseBody & ServicesWithParseParameters) => Promise<any>;

export const proxy = <TServices = any>(func: ProxyFunc<TServices>)
: LambdaExecution<awsLambda.APIGatewayProxyEvent, TServices> => {
return async (arg: LambdaArg<awsLambda.APIGatewayProxyEvent, TServices>) => {
const result = await func(
{ context: arg.context, event: arg.event },
arg.services as TServices & ServicesWithParseBody & ServicesWithParseParameters);

if (result && isAPIGatewayProxyResult(result)) {
return result;
}

if (result) {
return ok(result);
} else {
throw notFoundError(arg.event.path);
}
};
};

/**
* Returns the following suite of middlewares:
* serializeBodyAsJSON, httpErrors, parseBodyAsJSON, parseParameters
*/
export const defaultProxyMiddlewares = () => [
serializeBodyAsJSON(),
httpErrors(),
parseBodyAsJSON(),
parseParameters(),
];
10 changes: 5 additions & 5 deletions src/middlewares/validation.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { LambdaArg, LambdaExecution, Middleware } from "@src/builder";
import { validationError } from "@src/errors";
import { JSONSchema } from "@src/json-schema";
import { ServicesWithParseBody, ServicesWithParseParameters } from "@src/middlewares";
import { validate } from "@src/validator";
import * as awsLambda from "aws-lambda";
import { LambdaArg, LambdaExecution, Middleware } from "../core/builder";
import { validationError } from "../core/errors";
import { JSONSchema } from "../core/json-schema";
import { validate } from "../core/validator";
import { ServicesWithParseBody, ServicesWithParseParameters } from "./proxy";

/**
* This middleware validates the event using JSON Schema.
Expand Down
1 change: 0 additions & 1 deletion test/mocha.opts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
-r ts-node/register
-r source-map-support/register
-r tsconfig-paths/register
test/**/*-test.ts
17 changes: 0 additions & 17 deletions test/tsconfig.json

This file was deleted.

2 changes: 1 addition & 1 deletion test/unit/builder-test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { lambda } from "@src/builder";
import { expect } from "chai";
import { describe, it } from "mocha";
import { lambda } from "../../src/core/builder";
import { createLambdaContext } from "./lambda-helper-test";

describe("builder", () => {
Expand Down
2 changes: 1 addition & 1 deletion test/unit/container-test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createContainerFactory } from "@src/container";
import { expect } from "chai";
import { describe, it } from "mocha";
import { createContainerFactory } from "../../src/core/container";

interface IA {}

Expand Down
2 changes: 1 addition & 1 deletion test/unit/errors-test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { dependencyErrorProxy, internalServerError } from "@src/errors";
import { expect } from "chai";
import { describe, it } from "mocha";
import { dependencyErrorProxy, internalServerError } from "../../src/core/errors";

describe("dependencyErrorProxy", () => {

Expand Down
2 changes: 1 addition & 1 deletion test/unit/lambda-helper-test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { randomStr } from "@src/utils";
import { Context } from "aws-lambda";
import { randomStr } from "../../src/core/utils";

export const createLambdaContext = (): Context => ({
awsRequestId: randomStr(),
Expand Down
10 changes: 5 additions & 5 deletions test/unit/middlewares/container-test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { container } from "@middlewares/container";
import { lambda } from "@src/builder";
import { createContainerFactory } from "@src/container";
import { randomStr } from "@src/utils";
import { createLambdaContext } from "@test/lambda-helper-test";
import { expect } from "chai";
import { describe, it } from "mocha";
import { lambda } from "../../../src/core/builder";
import { createContainerFactory } from "../../../src/core/container";
import { randomStr } from "../../../src/core/utils";
import { container } from "../../../src/middlewares/container";
import { createLambdaContext } from "../lambda-helper-test";

describe("container middleware", () => {

Expand Down
20 changes: 10 additions & 10 deletions test/unit/middlewares/proxy-test.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import {
cors, httpErrors, parseBodyAsFORM, parseBodyAsJSON,
parseParameters, responseHeaders, serializeBodyAsJSON,
ServicesWithParseBody, ServicesWithParseParameters } from "@middlewares/proxy";
import { lambda } from "@src/builder";
import { createContainerFactory } from "@src/container";
import { notFoundError } from "@src/errors";
import { ok } from "@src/responses";
import { randomStr } from "@src/utils";
import { createLambdaContext } from "@test/lambda-helper-test";
import { APIGatewayProxyResult } from "aws-lambda";
import { expect } from "chai";
import * as HttpStatusCodes from "http-status-codes";
import { describe, it } from "mocha";
import { lambda } from "../../../src/core/builder";
import { createContainerFactory } from "../../../src/core/container";
import { notFoundError } from "../../../src/core/errors";
import { ok } from "../../../src/core/responses";
import { randomStr } from "../../../src/core/utils";
import {
cors, httpErrors, parseBodyAsFORM, parseBodyAsJSON,
parseParameters, responseHeaders, serializeBodyAsJSON,
ServicesWithParseBody, ServicesWithParseParameters } from "../../../src/middlewares/proxy";
import { createLambdaContext } from "../lambda-helper-test";

describe("responseHeaders middleware", () => {

Expand Down
13 changes: 7 additions & 6 deletions test/unit/middlewares/validation-test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { validateBody, validateEvent } from "@middlewares/validation";
import { lambda } from "@src/builder";
import { JSONSchema } from "@src/json-schema";
import { parseBodyAsJSON, parseParameters, validateParameters } from "@src/middlewares";
import { randomStr } from "@src/utils";
import { createLambdaContext } from "@test/lambda-helper-test";
import { expect } from "chai";
import { lambda } from "../../../src/core/builder";
import { JSONSchema } from "../../../src/core/json-schema";
import { randomStr } from "../../../src/core/utils";
import { parseBodyAsJSON, parseParameters } from "../../../src/middlewares/proxy";
import { validateParameters } from "../../../src/middlewares/validation";
import { validateBody, validateEvent } from "../../../src/middlewares/validation";
import { createLambdaContext } from "../lambda-helper-test";

describe("validateEvent middleware", () => {

Expand Down
6 changes: 4 additions & 2 deletions test/unit/services/http-client-test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { HttpClientConfig, HttpClientError, httpClientFactory, mockHttpClientFactory } from "@services/http-client";
import { randomStr } from "@src/utils";
import { expect } from "chai";
import * as HttpStatusCodes from "http-status-codes";
import { describe, it } from "mocha";
import { randomStr } from "../../../src/core/utils";
import {
HttpClientConfig, HttpClientError, httpClientFactory,
mockHttpClientFactory } from "../../../src/services/http-client";

describe("httpClientFactory", () => {

Expand Down
2 changes: 1 addition & 1 deletion test/unit/services/key-value-repository-test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { InMemoryKeyValueRepository } from "@services/key-value-repository";
import { expect } from "chai";
import { describe, it } from "mocha";
import { InMemoryKeyValueRepository } from "../../../src/services/key-value-repository";

describe("InMemoryKeyValueRepository", () => {

Expand Down
6 changes: 3 additions & 3 deletions test/unit/utils-test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {
convertHrtimeToMs, createConfidentialityReplacer,
DEFAULT_CONFIDENTIALITY_REPLACE_BY, memoize, randomStr, safeJSONStringify } from "@src/utils";
import { expect } from "chai";
import { describe, it } from "mocha";
import {
convertHrtimeToMs, createConfidentialityReplacer,
DEFAULT_CONFIDENTIALITY_REPLACE_BY, memoize, randomStr, safeJSONStringify } from "../../src/core/utils";

describe("convertHrtimeToMs", () => {

Expand Down
9 changes: 1 addition & 8 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,7 @@
"moduleResolution": "node",
"sourceMap": true,
"declaration": true,
"noImplicitAny": false,
"baseUrl": "./",
"paths": {
"@middlewares/*": ["./src/middlewares/*"],
"@services/*": ["./src/services/*"],
"@src/*": ["./src/*"],
"@test/*": ["./test/unit/*"]
}
"noImplicitAny": false
},
"exclude": [
"./test"
Expand Down
Loading

0 comments on commit 34a1dbf

Please sign in to comment.