lambda-reactor 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/{dist/dispatch.js → dispatch.js} +4 -7
  2. package/dispatch.js.map +10 -0
  3. package/logger.js +19 -0
  4. package/logger.js.map +10 -0
  5. package/package.json +4 -7
  6. package/dist/dispatch.js.map +0 -10
  7. package/dist/logger.js +0 -21
  8. package/dist/logger.js.map +0 -10
  9. /package/{dist/build-handlers.d.ts → build-handlers.d.ts} +0 -0
  10. /package/{dist/build-handlers.js → build-handlers.js} +0 -0
  11. /package/{dist/build-handlers.js.map → build-handlers.js.map} +0 -0
  12. /package/{dist/dispatch.d.ts → dispatch.d.ts} +0 -0
  13. /package/{dist/env.d.ts → env.d.ts} +0 -0
  14. /package/{dist/env.js → env.js} +0 -0
  15. /package/{dist/env.js.map → env.js.map} +0 -0
  16. /package/{dist/handler.d.ts → handler.d.ts} +0 -0
  17. /package/{dist/handler.js → handler.js} +0 -0
  18. /package/{dist/handler.js.map → handler.js.map} +0 -0
  19. /package/{dist/logger.d.ts → logger.d.ts} +0 -0
  20. /package/{dist/method.d.ts → method.d.ts} +0 -0
  21. /package/{dist/method.js → method.js} +0 -0
  22. /package/{dist/method.js.map → method.js.map} +0 -0
  23. /package/{dist/middleware.d.ts → middleware.d.ts} +0 -0
  24. /package/{dist/middleware.js → middleware.js} +0 -0
  25. /package/{dist/middleware.js.map → middleware.js.map} +0 -0
  26. /package/{dist/response.d.ts → response.d.ts} +0 -0
  27. /package/{dist/response.js → response.js} +0 -0
  28. /package/{dist/response.js.map → response.js.map} +0 -0
  29. /package/{dist/route-handler.d.ts → route-handler.d.ts} +0 -0
  30. /package/{dist/route-handler.js → route-handler.js} +0 -0
  31. /package/{dist/route-handler.js.map → route-handler.js.map} +0 -0
  32. /package/{dist/router-class.d.ts → router-class.d.ts} +0 -0
  33. /package/{dist/router-class.js → router-class.js} +0 -0
  34. /package/{dist/router-class.js.map → router-class.js.map} +0 -0
  35. /package/{dist/router.d.ts → router.d.ts} +0 -0
  36. /package/{dist/router.js → router.js} +0 -0
  37. /package/{dist/router.js.map → router.js.map} +0 -0
@@ -16,8 +16,7 @@ async function dispatch(route, event, context) {
16
16
  if (route.bodySchema) {
17
17
  const parsed = route.bodySchema.safeParse(body);
18
18
  if (!parsed.success) {
19
- return Response.text(400, z.treeifyError(parsed.error).errors.join(`
20
- `)).toAPIGatewayProxyResult();
19
+ return Response.text(400, z.prettifyError(parsed.error)).toAPIGatewayProxyResult();
21
20
  }
22
21
  body = parsed.data;
23
22
  }
@@ -33,8 +32,7 @@ async function dispatch(route, event, context) {
33
32
  const parsed = route.outputSchema.safeParse(result.body);
34
33
  if (!parsed.success) {
35
34
  logError(parsed.error);
36
- return Response.text(500, z.treeifyError(parsed.error).errors.join(`
37
- `)).toAPIGatewayProxyResult();
35
+ return Response.text(500, z.prettifyError(parsed.error)).toAPIGatewayProxyResult();
38
36
  }
39
37
  result.body = parsed.data;
40
38
  }
@@ -44,8 +42,7 @@ async function dispatch(route, event, context) {
44
42
  const parsed = route.outputSchema.safeParse(result);
45
43
  if (!parsed.success) {
46
44
  logError(parsed.error);
47
- return Response.text(500, z.treeifyError(parsed.error).errors.join(`
48
- `)).toAPIGatewayProxyResult();
45
+ return Response.text(500, z.prettifyError(parsed.error)).toAPIGatewayProxyResult();
49
46
  }
50
47
  return applyMiddlewares(Response.json(200, parsed.data).toAPIGatewayProxyResult(), route);
51
48
  }
@@ -55,4 +52,4 @@ export {
55
52
  dispatch
56
53
  };
57
54
 
58
- //# debugId=618322748EAF9B8C64756E2164756E21
55
+ //# debugId=78A10223DAEDFFB964756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dispatch.ts"],
4
+ "sourcesContent": [
5
+ "import {logError} from \"#src/logger\"\nimport {RouteHandler} from \"#src/method\"\nimport {Response} from \"#src/response\"\nimport type {APIGatewayProxyEvent, Context} from \"aws-lambda\"\nimport {z} from \"zod\"\n\nimport {applyMiddlewares} from \"./middleware\"\n\n/**\n * Executes a single {@link RouteHandler} for an incoming Lambda proxy event.\n *\n * Processing order:\n * 1. Parse `event.body` as JSON when possible.\n * 2. Validate the body against `route.bodySchema` (Zod); return `400` on\n * failure.\n * 3. Invoke `route.callback` with the validated body, event, and context.\n * 4. If the callback returns a {@link Response}, optionally validate its body\n * against `route.outputSchema`; return `500` on failure.\n * 5. If the callback returns a plain value, wrap it in a `200 JSON` response,\n * optionally validating against `route.outputSchema`.\n * 6. Apply all middlewares left-to-right before returning.\n *\n * @param route - The route handler to execute.\n * @param event - Raw API Gateway proxy event.\n * @param context - Lambda execution context.\n */\nexport async function dispatch(\n route: RouteHandler,\n event: APIGatewayProxyEvent,\n context: Context,\n) {\n let body\n try {\n body = event.body ? JSON.parse(event.body) : undefined\n } catch (error) {\n if (error instanceof Error) {\n return Response.text(400, error.message).toAPIGatewayProxyResult()\n }\n throw error\n }\n if (route.bodySchema) {\n const parsed = route.bodySchema.safeParse(body)\n if (!parsed.success) {\n return Response.text(\n 400,\n z.prettifyError(parsed.error),\n ).toAPIGatewayProxyResult()\n }\n body = parsed.data\n }\n if (!route.callback) {\n const err = new Error(\"Route has no handler defined\")\n logError(err)\n return Response.text(500, err.message).toAPIGatewayProxyResult()\n }\n const cb = route.callback as (props: {\n body: unknown\n event: APIGatewayProxyEvent\n context: Context\n }) => Promise<unknown>\n const result = await cb({body, event, context})\n if (result instanceof Response) {\n if (route.outputSchema) {\n const parsed = route.outputSchema.safeParse(result.body)\n if (!parsed.success) {\n logError(parsed.error)\n return Response.text(\n 500,\n z.prettifyError(parsed.error),\n ).toAPIGatewayProxyResult()\n }\n result.body = parsed.data\n }\n return applyMiddlewares(result.toAPIGatewayProxyResult(), route)\n }\n if (route.outputSchema) {\n const parsed = route.outputSchema.safeParse(result)\n if (!parsed.success) {\n logError(parsed.error)\n return Response.text(\n 500,\n z.prettifyError(parsed.error),\n ).toAPIGatewayProxyResult()\n }\n return applyMiddlewares(\n Response.json(200, parsed.data).toAPIGatewayProxyResult(),\n route,\n )\n }\n return applyMiddlewares(Response.json(200, result).toAPIGatewayProxyResult(), route)\n}\n"
6
+ ],
7
+ "mappings": ";AAAA;AAEA;AAEA;AAEA;AAoBA,eAAsB,QAAQ,CAC1B,OACA,OACA,SACF;AAAA,EACE,IAAI;AAAA,EACJ,IAAI;AAAA,IACA,OAAO,MAAM,OAAO,KAAK,MAAM,MAAM,IAAI,IAAI;AAAA,IAC/C,OAAO,OAAO;AAAA,IACZ,IAAI,iBAAiB,OAAO;AAAA,MACxB,OAAO,SAAS,KAAK,KAAK,MAAM,OAAO,EAAE,wBAAwB;AAAA,IACrE;AAAA,IACA,MAAM;AAAA;AAAA,EAEV,IAAI,MAAM,YAAY;AAAA,IAClB,MAAM,SAAS,MAAM,WAAW,UAAU,IAAI;AAAA,IAC9C,IAAI,CAAC,OAAO,SAAS;AAAA,MACjB,OAAO,SAAS,KACZ,KACA,EAAE,cAAc,OAAO,KAAK,CAChC,EAAE,wBAAwB;AAAA,IAC9B;AAAA,IACA,OAAO,OAAO;AAAA,EAClB;AAAA,EACA,IAAI,CAAC,MAAM,UAAU;AAAA,IACjB,MAAM,MAAM,IAAI,MAAM,8BAA8B;AAAA,IACpD,SAAS,GAAG;AAAA,IACZ,OAAO,SAAS,KAAK,KAAK,IAAI,OAAO,EAAE,wBAAwB;AAAA,EACnE;AAAA,EACA,MAAM,KAAK,MAAM;AAAA,EAKjB,MAAM,SAAS,MAAM,GAAG,EAAC,MAAM,OAAO,QAAO,CAAC;AAAA,EAC9C,IAAI,kBAAkB,UAAU;AAAA,IAC5B,IAAI,MAAM,cAAc;AAAA,MACpB,MAAM,SAAS,MAAM,aAAa,UAAU,OAAO,IAAI;AAAA,MACvD,IAAI,CAAC,OAAO,SAAS;AAAA,QACjB,SAAS,OAAO,KAAK;AAAA,QACrB,OAAO,SAAS,KACZ,KACA,EAAE,cAAc,OAAO,KAAK,CAChC,EAAE,wBAAwB;AAAA,MAC9B;AAAA,MACA,OAAO,OAAO,OAAO;AAAA,IACzB;AAAA,IACA,OAAO,iBAAiB,OAAO,wBAAwB,GAAG,KAAK;AAAA,EACnE;AAAA,EACA,IAAI,MAAM,cAAc;AAAA,IACpB,MAAM,SAAS,MAAM,aAAa,UAAU,MAAM;AAAA,IAClD,IAAI,CAAC,OAAO,SAAS;AAAA,MACjB,SAAS,OAAO,KAAK;AAAA,MACrB,OAAO,SAAS,KACZ,KACA,EAAE,cAAc,OAAO,KAAK,CAChC,EAAE,wBAAwB;AAAA,IAC9B;AAAA,IACA,OAAO,iBACH,SAAS,KAAK,KAAK,OAAO,IAAI,EAAE,wBAAwB,GACxD,KACJ;AAAA,EACJ;AAAA,EACA,OAAO,iBAAiB,SAAS,KAAK,KAAK,MAAM,EAAE,wBAAwB,GAAG,KAAK;AAAA;",
8
+ "debugId": "78A10223DAEDFFB964756E2164756E21",
9
+ "names": []
10
+ }
package/logger.js ADDED
@@ -0,0 +1,19 @@
1
+ // src/logger.ts
2
+ import * as z from "zod";
3
+ function formatError(error) {
4
+ let detail = error.message;
5
+ if (error instanceof z.ZodError) {
6
+ detail = z.prettifyError(error);
7
+ }
8
+ return `${error.name}: ${detail}${error.stack ? `
9
+ ${error.stack.slice(error.name.length + error.message.length + 3)}` : ""}`;
10
+ }
11
+ function logError(error) {
12
+ console.error(formatError(error));
13
+ }
14
+ export {
15
+ logError,
16
+ formatError
17
+ };
18
+
19
+ //# debugId=6F7BB1E979E2A41664756E2164756E21
package/logger.js.map ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/logger.ts"],
4
+ "sourcesContent": [
5
+ "import * as z from \"zod\"\n\n/**\n * Formats an `Error` into a human-readable string that includes the error\n * name, message, an optional Zod validation detail block, and the stack\n * trace when available.\n */\nexport function formatError(error: Error): string {\n let detail = error.message\n if (error instanceof z.ZodError) {\n detail = z.prettifyError(error)\n }\n return `${error.name}: ${detail}${error.stack ? `\\n${error.stack.slice(error.name.length + error.message.length + 3)}` : \"\"}`\n}\n\n/** Writes a formatted error to `stderr` via `console.error`. */\nexport function logError(error: Error): void {\n console.error(formatError(error))\n}\n"
6
+ ],
7
+ "mappings": ";AAAA;AAOO,SAAS,WAAW,CAAC,OAAsB;AAAA,EAC9C,IAAI,SAAS,MAAM;AAAA,EACnB,IAAI,iBAAmB,YAAU;AAAA,IAC7B,SAAW,gBAAc,KAAK;AAAA,EAClC;AAAA,EACA,OAAO,GAAG,MAAM,SAAS,SAAS,MAAM,QAAQ;AAAA,EAAK,MAAM,MAAM,MAAM,MAAM,KAAK,SAAS,MAAM,QAAQ,SAAS,CAAC,MAAM;AAAA;AAItH,SAAS,QAAQ,CAAC,OAAoB;AAAA,EACzC,QAAQ,MAAM,YAAY,KAAK,CAAC;AAAA;",
8
+ "debugId": "6F7BB1E979E2A41664756E2164756E21",
9
+ "names": []
10
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lambda-reactor",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "scripts": {
5
5
  "prepare": "lefthook install",
6
6
  "check": "tsgo",
@@ -8,19 +8,16 @@
8
8
  "format": "prettier -uwu .",
9
9
  "test": "vitest",
10
10
  "build": "rm -rf dist && tsgo -p tsconfig.build.json && bun build --target=node --external='*' --splitting --sourcemap=external --keep-names --root=src --outdir=dist src/*.ts",
11
- "prepublishOnly": "bun run build"
11
+ "publish": "bun run build && cd dist && cp ../package.json . && npm publish"
12
12
  },
13
13
  "type": "module",
14
14
  "imports": {
15
15
  "#src/*": "./src/*.ts"
16
16
  },
17
- "files": [
18
- "dist"
19
- ],
20
17
  "exports": {
21
18
  "./*": {
22
- "types": "./dist/*.d.ts",
23
- "default": "./dist/*.js"
19
+ "types": "./*.d.ts",
20
+ "default": "./*.js"
24
21
  }
25
22
  },
26
23
  "devDependencies": {
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/dispatch.ts"],
4
- "sourcesContent": [
5
- "import {logError} from \"#src/logger\"\nimport {RouteHandler} from \"#src/method\"\nimport {Response} from \"#src/response\"\nimport type {APIGatewayProxyEvent, Context} from \"aws-lambda\"\nimport {z} from \"zod\"\n\nimport {applyMiddlewares} from \"./middleware\"\n\n/**\n * Executes a single {@link RouteHandler} for an incoming Lambda proxy event.\n *\n * Processing order:\n * 1. Parse `event.body` as JSON when possible.\n * 2. Validate the body against `route.bodySchema` (Zod); return `400` on\n * failure.\n * 3. Invoke `route.callback` with the validated body, event, and context.\n * 4. If the callback returns a {@link Response}, optionally validate its body\n * against `route.outputSchema`; return `500` on failure.\n * 5. If the callback returns a plain value, wrap it in a `200 JSON` response,\n * optionally validating against `route.outputSchema`.\n * 6. Apply all middlewares left-to-right before returning.\n *\n * @param route - The route handler to execute.\n * @param event - Raw API Gateway proxy event.\n * @param context - Lambda execution context.\n */\nexport async function dispatch(\n route: RouteHandler,\n event: APIGatewayProxyEvent,\n context: Context,\n) {\n let body\n try {\n body = event.body ? JSON.parse(event.body) : undefined\n } catch (error) {\n if (error instanceof Error) {\n return Response.text(400, error.message).toAPIGatewayProxyResult()\n }\n throw error\n }\n if (route.bodySchema) {\n const parsed = route.bodySchema.safeParse(body)\n if (!parsed.success) {\n return Response.text(\n 400,\n z.treeifyError(parsed.error).errors.join(\"\\n\"),\n ).toAPIGatewayProxyResult()\n }\n body = parsed.data\n }\n if (!route.callback) {\n const err = new Error(\"Route has no handler defined\")\n logError(err)\n return Response.text(500, err.message).toAPIGatewayProxyResult()\n }\n const cb = route.callback as (props: {\n body: unknown\n event: APIGatewayProxyEvent\n context: Context\n }) => Promise<unknown>\n const result = await cb({body, event, context})\n if (result instanceof Response) {\n if (route.outputSchema) {\n const parsed = route.outputSchema.safeParse(result.body)\n if (!parsed.success) {\n logError(parsed.error)\n return Response.text(\n 500,\n z.treeifyError(parsed.error).errors.join(\"\\n\"),\n ).toAPIGatewayProxyResult()\n }\n result.body = parsed.data\n }\n return applyMiddlewares(result.toAPIGatewayProxyResult(), route)\n }\n if (route.outputSchema) {\n const parsed = route.outputSchema.safeParse(result)\n if (!parsed.success) {\n logError(parsed.error)\n return Response.text(\n 500,\n z.treeifyError(parsed.error).errors.join(\"\\n\"),\n ).toAPIGatewayProxyResult()\n }\n return applyMiddlewares(\n Response.json(200, parsed.data).toAPIGatewayProxyResult(),\n route,\n )\n }\n return applyMiddlewares(Response.json(200, result).toAPIGatewayProxyResult(), route)\n}\n"
6
- ],
7
- "mappings": ";AAAA;AAEA;AAEA;AAEA;AAoBA,eAAsB,QAAQ,CAC1B,OACA,OACA,SACF;AAAA,EACE,IAAI;AAAA,EACJ,IAAI;AAAA,IACA,OAAO,MAAM,OAAO,KAAK,MAAM,MAAM,IAAI,IAAI;AAAA,IAC/C,OAAO,OAAO;AAAA,IACZ,IAAI,iBAAiB,OAAO;AAAA,MACxB,OAAO,SAAS,KAAK,KAAK,MAAM,OAAO,EAAE,wBAAwB;AAAA,IACrE;AAAA,IACA,MAAM;AAAA;AAAA,EAEV,IAAI,MAAM,YAAY;AAAA,IAClB,MAAM,SAAS,MAAM,WAAW,UAAU,IAAI;AAAA,IAC9C,IAAI,CAAC,OAAO,SAAS;AAAA,MACjB,OAAO,SAAS,KACZ,KACA,EAAE,aAAa,OAAO,KAAK,EAAE,OAAO,KAAK;AAAA,CAAI,CACjD,EAAE,wBAAwB;AAAA,IAC9B;AAAA,IACA,OAAO,OAAO;AAAA,EAClB;AAAA,EACA,IAAI,CAAC,MAAM,UAAU;AAAA,IACjB,MAAM,MAAM,IAAI,MAAM,8BAA8B;AAAA,IACpD,SAAS,GAAG;AAAA,IACZ,OAAO,SAAS,KAAK,KAAK,IAAI,OAAO,EAAE,wBAAwB;AAAA,EACnE;AAAA,EACA,MAAM,KAAK,MAAM;AAAA,EAKjB,MAAM,SAAS,MAAM,GAAG,EAAC,MAAM,OAAO,QAAO,CAAC;AAAA,EAC9C,IAAI,kBAAkB,UAAU;AAAA,IAC5B,IAAI,MAAM,cAAc;AAAA,MACpB,MAAM,SAAS,MAAM,aAAa,UAAU,OAAO,IAAI;AAAA,MACvD,IAAI,CAAC,OAAO,SAAS;AAAA,QACjB,SAAS,OAAO,KAAK;AAAA,QACrB,OAAO,SAAS,KACZ,KACA,EAAE,aAAa,OAAO,KAAK,EAAE,OAAO,KAAK;AAAA,CAAI,CACjD,EAAE,wBAAwB;AAAA,MAC9B;AAAA,MACA,OAAO,OAAO,OAAO;AAAA,IACzB;AAAA,IACA,OAAO,iBAAiB,OAAO,wBAAwB,GAAG,KAAK;AAAA,EACnE;AAAA,EACA,IAAI,MAAM,cAAc;AAAA,IACpB,MAAM,SAAS,MAAM,aAAa,UAAU,MAAM;AAAA,IAClD,IAAI,CAAC,OAAO,SAAS;AAAA,MACjB,SAAS,OAAO,KAAK;AAAA,MACrB,OAAO,SAAS,KACZ,KACA,EAAE,aAAa,OAAO,KAAK,EAAE,OAAO,KAAK;AAAA,CAAI,CACjD,EAAE,wBAAwB;AAAA,IAC9B;AAAA,IACA,OAAO,iBACH,SAAS,KAAK,KAAK,OAAO,IAAI,EAAE,wBAAwB,GACxD,KACJ;AAAA,EACJ;AAAA,EACA,OAAO,iBAAiB,SAAS,KAAK,KAAK,MAAM,EAAE,wBAAwB,GAAG,KAAK;AAAA;",
8
- "debugId": "618322748EAF9B8C64756E2164756E21",
9
- "names": []
10
- }
package/dist/logger.js DELETED
@@ -1,21 +0,0 @@
1
- // src/logger.ts
2
- import * as z from "zod";
3
- function formatError(error) {
4
- let detail;
5
- if (error instanceof z.ZodError) {
6
- detail = z.treeifyError(error).errors.join(`
7
- `);
8
- }
9
- return `${error.name}: ${error.message}${detail ? `
10
- ${detail}` : ""}${error.stack ? `
11
- ${error.stack}` : ""}`;
12
- }
13
- function logError(error) {
14
- console.error(formatError(error));
15
- }
16
- export {
17
- logError,
18
- formatError
19
- };
20
-
21
- //# debugId=FB33B340A398C49564756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/logger.ts"],
4
- "sourcesContent": [
5
- "import * as z from \"zod\"\n\n/**\n * Formats an `Error` into a human-readable string that includes the error\n * name, message, an optional Zod validation detail block, and the stack\n * trace when available.\n */\nexport function formatError(error: Error): string {\n let detail\n if (error instanceof z.ZodError) {\n detail = z.treeifyError(error).errors.join(\"\\n\")\n }\n return `${error.name}: ${error.message}${detail ? `\\n${detail}` : \"\"}${error.stack ? `\\n${error.stack}` : \"\"}`\n}\n\n/** Writes a formatted error to `stderr` via `console.error`. */\nexport function logError(error: Error): void {\n console.error(formatError(error))\n}\n"
6
- ],
7
- "mappings": ";AAAA;AAOO,SAAS,WAAW,CAAC,OAAsB;AAAA,EAC9C,IAAI;AAAA,EACJ,IAAI,iBAAmB,YAAU;AAAA,IAC7B,SAAW,eAAa,KAAK,EAAE,OAAO,KAAK;AAAA,CAAI;AAAA,EACnD;AAAA,EACA,OAAO,GAAG,MAAM,SAAS,MAAM,UAAU,SAAS;AAAA,EAAK,WAAW,KAAK,MAAM,QAAQ;AAAA,EAAK,MAAM,UAAU;AAAA;AAIvG,SAAS,QAAQ,CAAC,OAAoB;AAAA,EACzC,QAAQ,MAAM,YAAY,KAAK,CAAC;AAAA;",
8
- "debugId": "FB33B340A398C49564756E2164756E21",
9
- "names": []
10
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes