@gahojin-inc/middy-http-body-parser 2026.5.1 → 2026.7.0

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.
package/dist/index.d.ts CHANGED
@@ -1,21 +1,23 @@
1
- import { default as middy } from '@middy/core';
2
- import { ALBEvent, APIGatewayEvent, APIGatewayProxyEventV2 } from 'aws-lambda';
1
+ import middy from "@middy/core";
2
+ import { ALBEvent, APIGatewayEvent, APIGatewayProxyEventV2 } from "aws-lambda";
3
+ //#region src/index.d.ts
3
4
  type BodyParseFn<TResult = any> = (body: string, rawBody: string) => TResult;
4
5
  type BodyParser<TResult = any> = {
5
- contentType: RegExp;
6
- parse: BodyParseFn<TResult>;
7
- invalidMessage: string;
6
+ contentType: RegExp;
7
+ parse: BodyParseFn<TResult>;
8
+ invalidMessage: string;
8
9
  } & ({
9
- errorWhenUndefined: true;
10
+ errorWhenUndefined: true;
10
11
  } | {
11
- errorWhenUndefined: false;
12
- responseWhenUndefined: any;
12
+ errorWhenUndefined: false;
13
+ responseWhenUndefined: any;
13
14
  });
14
15
  type Options = {
15
- parsers: BodyParser[];
16
- disableContentTypeError: boolean;
16
+ parsers: BodyParser[];
17
+ disableContentTypeError: boolean;
17
18
  };
18
19
  type RequestEvent = APIGatewayEvent | APIGatewayProxyEventV2 | ALBEvent;
19
20
  declare const parser: (options?: Partial<Options>) => middy.MiddlewareObj<RequestEvent>;
20
- export default parser;
21
- export type { BodyParser };
21
+ //#endregion
22
+ export { type BodyParser, parser as default };
23
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -2,11 +2,11 @@ import jsonParser from "./parser/json.js";
2
2
  import urlencodeParser from "./parser/urlencode.js";
3
3
  import { createError } from "@middy/util";
4
4
  //#region src/index.ts
5
- var defaultOptions = {
5
+ const defaultOptions = {
6
6
  parsers: [jsonParser, urlencodeParser],
7
7
  disableContentTypeError: false
8
8
  };
9
- var parser = (options = {}) => {
9
+ const parser = (options = {}) => {
10
10
  const { parsers, disableContentTypeError } = {
11
11
  ...defaultOptions,
12
12
  ...options
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import type middy from '@middy/core'\nimport { createError } from '@middy/util'\nimport type { ALBEvent, APIGatewayEvent, APIGatewayProxyEventV2 } from 'aws-lambda'\nimport jsonParser from './parser/json.js'\nimport urlencodeParser from './parser/urlencode.js'\n\ntype BodyParseFn<TResult = any> = (body: string, rawBody: string) => TResult\n\ntype BodyParser<TResult = any> = {\n contentType: RegExp\n parse: BodyParseFn<TResult>\n invalidMessage: string\n} & (\n | {\n errorWhenUndefined: true\n }\n | {\n errorWhenUndefined: false\n responseWhenUndefined: any\n }\n)\n\ntype Options = {\n parsers: BodyParser[]\n disableContentTypeError: boolean\n}\n\ntype RequestEvent = APIGatewayEvent | APIGatewayProxyEventV2 | ALBEvent\n\nconst defaultOptions: Options = {\n parsers: [jsonParser, urlencodeParser],\n disableContentTypeError: false,\n}\n\nconst parser = (options: Partial<Options> = {}): middy.MiddlewareObj<RequestEvent> => {\n const opts: Options = { ...defaultOptions, ...options }\n const { parsers, disableContentTypeError } = opts\n\n const beforeFn: middy.MiddlewareFn<RequestEvent> = (request) => {\n const { headers, body } = request.event\n const contentType = headers?.['content-type'] ?? headers?.['Content-Type']\n\n const parser = parsers.find((parser) => {\n return contentType && parser.contentType.test(contentType)\n })\n if (!parser) {\n if (disableContentTypeError) {\n return\n }\n throw createError(415, 'Unsupported Media Type', {\n cause: { package: '@gahojin-inc/middy-http-body-parser', data: contentType },\n })\n }\n\n if (typeof body === 'undefined' || body === null) {\n if (parser.errorWhenUndefined === true) {\n throw createError(415, parser.invalidMessage, {\n cause: { package: '@gahojin-inc/middy-http-body-parser', data: body },\n })\n }\n request.event.body = parser.responseWhenUndefined\n return\n }\n\n try {\n const data = request.event.isBase64Encoded ? Buffer.from(body, 'base64').toString() : body\n\n request.event.body = parser.parse(data, body)\n } catch (err) {\n // UnprocessableEntity\n throw createError(415, parser.invalidMessage, {\n cause: { package: '@gahojin-inc/middy-http-body-parser', data: body, message: err instanceof Error ? err.message : err?.toString() },\n })\n }\n }\n\n return {\n before: beforeFn,\n }\n}\n\nexport default parser\nexport type { BodyParser }\n"],"mappings":";;;;AA6BA,IAAM,iBAA0B;CAC9B,SAAS,CAAC,YAAY,gBAAgB;CACtC,yBAAyB;CAC1B;AAED,IAAM,UAAU,UAA4B,EAAE,KAAwC;CAEpF,MAAM,EAAE,SAAS,4BAA4B;EADrB,GAAG;EAAgB,GAAG;EACD;CAE7C,MAAM,YAA8C,YAAY;EAC9D,MAAM,EAAE,SAAS,SAAS,QAAQ;EAClC,MAAM,cAAc,UAAU,mBAAmB,UAAU;EAE3D,MAAM,SAAS,QAAQ,MAAM,WAAW;AACtC,UAAO,eAAe,OAAO,YAAY,KAAK,YAAY;IAC1D;AACF,MAAI,CAAC,QAAQ;AACX,OAAI,wBACF;AAEF,SAAM,YAAY,KAAK,0BAA0B,EAC/C,OAAO;IAAE,SAAS;IAAuC,MAAM;IAAa,EAC7E,CAAC;;AAGJ,MAAI,OAAO,SAAS,eAAe,SAAS,MAAM;AAChD,OAAI,OAAO,uBAAuB,KAChC,OAAM,YAAY,KAAK,OAAO,gBAAgB,EAC5C,OAAO;IAAE,SAAS;IAAuC,MAAM;IAAM,EACtE,CAAC;AAEJ,WAAQ,MAAM,OAAO,OAAO;AAC5B;;AAGF,MAAI;GACF,MAAM,OAAO,QAAQ,MAAM,kBAAkB,OAAO,KAAK,MAAM,SAAS,CAAC,UAAU,GAAG;AAEtF,WAAQ,MAAM,OAAO,OAAO,MAAM,MAAM,KAAK;WACtC,KAAK;AAEZ,SAAM,YAAY,KAAK,OAAO,gBAAgB,EAC5C,OAAO;IAAE,SAAS;IAAuC,MAAM;IAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,KAAK,UAAU;IAAE,EACrI,CAAC;;;AAIN,QAAO,EACL,QAAQ,UACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import type middy from '@middy/core'\nimport { createError } from '@middy/util'\nimport type { ALBEvent, APIGatewayEvent, APIGatewayProxyEventV2 } from 'aws-lambda'\nimport jsonParser from './parser/json.js'\nimport urlencodeParser from './parser/urlencode.js'\n\ntype BodyParseFn<TResult = any> = (body: string, rawBody: string) => TResult\n\ntype BodyParser<TResult = any> = {\n contentType: RegExp\n parse: BodyParseFn<TResult>\n invalidMessage: string\n} & (\n | {\n errorWhenUndefined: true\n }\n | {\n errorWhenUndefined: false\n responseWhenUndefined: any\n }\n)\n\ntype Options = {\n parsers: BodyParser[]\n disableContentTypeError: boolean\n}\n\ntype RequestEvent = APIGatewayEvent | APIGatewayProxyEventV2 | ALBEvent\n\nconst defaultOptions: Options = {\n parsers: [jsonParser, urlencodeParser],\n disableContentTypeError: false,\n}\n\nconst parser = (options: Partial<Options> = {}): middy.MiddlewareObj<RequestEvent> => {\n const opts: Options = { ...defaultOptions, ...options }\n const { parsers, disableContentTypeError } = opts\n\n const beforeFn: middy.MiddlewareFn<RequestEvent> = (request) => {\n const { headers, body } = request.event\n const contentType = headers?.['content-type'] ?? headers?.['Content-Type']\n\n const parser = parsers.find((parser) => {\n return contentType && parser.contentType.test(contentType)\n })\n if (!parser) {\n if (disableContentTypeError) {\n return\n }\n throw createError(415, 'Unsupported Media Type', {\n cause: { package: '@gahojin-inc/middy-http-body-parser', data: contentType },\n })\n }\n\n if (typeof body === 'undefined' || body === null) {\n if (parser.errorWhenUndefined === true) {\n throw createError(415, parser.invalidMessage, {\n cause: { package: '@gahojin-inc/middy-http-body-parser', data: body },\n })\n }\n request.event.body = parser.responseWhenUndefined\n return\n }\n\n try {\n const data = request.event.isBase64Encoded ? Buffer.from(body, 'base64').toString() : body\n\n request.event.body = parser.parse(data, body)\n } catch (err) {\n // UnprocessableEntity\n throw createError(415, parser.invalidMessage, {\n cause: { package: '@gahojin-inc/middy-http-body-parser', data: body, message: err instanceof Error ? err.message : err?.toString() },\n })\n }\n }\n\n return {\n before: beforeFn,\n }\n}\n\nexport default parser\nexport type { BodyParser }\n"],"mappings":";;;;AA6BA,MAAM,iBAA0B;CAC9B,SAAS,CAAC,YAAY,eAAe;CACrC,yBAAyB;AAC3B;AAEA,MAAM,UAAU,UAA4B,CAAC,MAAyC;CAEpF,MAAM,EAAE,SAAS,4BAA4B;EADrB,GAAG;EAAgB,GAAG;CACE;CAEhD,MAAM,YAA8C,YAAY;EAC9D,MAAM,EAAE,SAAS,SAAS,QAAQ;EAClC,MAAM,cAAc,UAAU,mBAAmB,UAAU;EAE3D,MAAM,SAAS,QAAQ,MAAM,WAAW;GACtC,OAAO,eAAe,OAAO,YAAY,KAAK,WAAW;EAC3D,CAAC;EACD,IAAI,CAAC,QAAQ;GACX,IAAI,yBACF;GAEF,MAAM,YAAY,KAAK,0BAA0B,EAC/C,OAAO;IAAE,SAAS;IAAuC,MAAM;GAAY,EAC7E,CAAC;EACH;EAEA,IAAI,OAAO,SAAS,eAAe,SAAS,MAAM;GAChD,IAAI,OAAO,uBAAuB,MAChC,MAAM,YAAY,KAAK,OAAO,gBAAgB,EAC5C,OAAO;IAAE,SAAS;IAAuC,MAAM;GAAK,EACtE,CAAC;GAEH,QAAQ,MAAM,OAAO,OAAO;GAC5B;EACF;EAEA,IAAI;GACF,MAAM,OAAO,QAAQ,MAAM,kBAAkB,OAAO,KAAK,MAAM,QAAQ,CAAC,CAAC,SAAS,IAAI;GAEtF,QAAQ,MAAM,OAAO,OAAO,MAAM,MAAM,IAAI;EAC9C,SAAS,KAAK;GAEZ,MAAM,YAAY,KAAK,OAAO,gBAAgB,EAC5C,OAAO;IAAE,SAAS;IAAuC,MAAM;IAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,KAAK,SAAS;GAAE,EACrI,CAAC;EACH;CACF;CAEA,OAAO,EACL,QAAQ,SACV;AACF"}
@@ -1,3 +1,6 @@
1
- import { BodyParser } from '../index.js';
1
+ import { BodyParser } from "../index.js";
2
+ //#region src/parser/json.d.ts
2
3
  declare const jsonParser: BodyParser;
3
- export default jsonParser;
4
+ //#endregion
5
+ export { jsonParser as default };
6
+ //# sourceMappingURL=json.d.ts.map
@@ -1,5 +1,5 @@
1
1
  //#region src/parser/json.ts
2
- var jsonParser = {
2
+ const jsonParser = {
3
3
  contentType: /^application\/(.+\+)?json($|;.+)/,
4
4
  parse: (body) => {
5
5
  return JSON.parse(body);
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","names":[],"sources":["../../src/parser/json.ts"],"sourcesContent":["import type { BodyParser } from '../index.js'\n\nconst invalidMessage = 'Invalid or malformed JSON was provided'\n\nconst jsonParser: BodyParser = {\n contentType: /^application\\/(.+\\+)?json($|;.+)/,\n parse: (body) => {\n return JSON.parse(body)\n },\n invalidMessage,\n errorWhenUndefined: true,\n}\n\nexport default jsonParser\n"],"mappings":";AAIA,IAAM,aAAyB;CAC7B,aAAa;CACb,QAAQ,SAAS;AACf,SAAO,KAAK,MAAM,KAAK;;CAEzB,gBAAA;CACA,oBAAoB;CACrB"}
1
+ {"version":3,"file":"json.js","names":[],"sources":["../../src/parser/json.ts"],"sourcesContent":["import type { BodyParser } from '../index.js'\n\nconst invalidMessage = 'Invalid or malformed JSON was provided'\n\nconst jsonParser: BodyParser = {\n contentType: /^application\\/(.+\\+)?json($|;.+)/,\n parse: (body) => {\n return JSON.parse(body)\n },\n invalidMessage,\n errorWhenUndefined: true,\n}\n\nexport default jsonParser\n"],"mappings":";AAIA,MAAM,aAAyB;CAC7B,aAAa;CACb,QAAQ,SAAS;EACf,OAAO,KAAK,MAAM,IAAI;CACxB;CACA,gBAAA;CACA,oBAAoB;AACtB"}
@@ -1,3 +1,6 @@
1
- import { BodyParser } from '../index.js';
1
+ import { BodyParser } from "../index.js";
2
+ //#region src/parser/urlencode.d.ts
2
3
  declare const urlencodeParser: BodyParser;
3
- export default urlencodeParser;
4
+ //#endregion
5
+ export { urlencodeParser as default };
6
+ //# sourceMappingURL=urlencode.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import querystring from "node:querystring";
2
2
  //#region src/parser/urlencode.ts
3
- var invalidMessage = "Invalid or malformed URL encoded form was provided";
4
- var urlencodeParser = {
3
+ const invalidMessage = "Invalid or malformed URL encoded form was provided";
4
+ const urlencodeParser = {
5
5
  contentType: /^application\/x-www-form-urlencoded(;.*)?$/,
6
6
  parse: (body) => {
7
7
  const ret = Object.assign({}, querystring.parse(body));
@@ -1 +1 @@
1
- {"version":3,"file":"urlencode.js","names":[],"sources":["../../src/parser/urlencode.ts"],"sourcesContent":["import querystring from 'node:querystring'\nimport type { BodyParser } from '../index.js'\n\nconst invalidMessage = 'Invalid or malformed URL encoded form was provided'\nconst urlencodeParser: BodyParser = {\n contentType: /^application\\/x-www-form-urlencoded(;.*)?$/,\n parse: (body) => {\n const ret = Object.assign({}, querystring.parse(body))\n if (ret?.[body] === '') {\n throw new Error(invalidMessage)\n }\n return ret\n },\n invalidMessage,\n errorWhenUndefined: false,\n responseWhenUndefined: {},\n}\n\nexport default urlencodeParser\n"],"mappings":";;AAGA,IAAM,iBAAiB;AACvB,IAAM,kBAA8B;CAClC,aAAa;CACb,QAAQ,SAAS;EACf,MAAM,MAAM,OAAO,OAAO,EAAE,EAAE,YAAY,MAAM,KAAK,CAAC;AACtD,MAAI,MAAM,UAAU,GAClB,OAAM,IAAI,MAAM,eAAe;AAEjC,SAAO;;CAET;CACA,oBAAoB;CACpB,uBAAuB,EAAE;CAC1B"}
1
+ {"version":3,"file":"urlencode.js","names":[],"sources":["../../src/parser/urlencode.ts"],"sourcesContent":["import querystring from 'node:querystring'\nimport type { BodyParser } from '../index.js'\n\nconst invalidMessage = 'Invalid or malformed URL encoded form was provided'\nconst urlencodeParser: BodyParser = {\n contentType: /^application\\/x-www-form-urlencoded(;.*)?$/,\n parse: (body) => {\n const ret = Object.assign({}, querystring.parse(body))\n if (ret?.[body] === '') {\n throw new Error(invalidMessage)\n }\n return ret\n },\n invalidMessage,\n errorWhenUndefined: false,\n responseWhenUndefined: {},\n}\n\nexport default urlencodeParser\n"],"mappings":";;AAGA,MAAM,iBAAiB;AACvB,MAAM,kBAA8B;CAClC,aAAa;CACb,QAAQ,SAAS;EACf,MAAM,MAAM,OAAO,OAAO,CAAC,GAAG,YAAY,MAAM,IAAI,CAAC;EACrD,IAAI,MAAM,UAAU,IAClB,MAAM,IAAI,MAAM,cAAc;EAEhC,OAAO;CACT;CACA;CACA,oBAAoB;CACpB,uBAAuB,CAAC;AAC1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gahojin-inc/middy-http-body-parser",
3
- "version": "2026.5.1",
3
+ "version": "2026.7.0",
4
4
  "description": "Middy HTTP body parser",
5
5
  "author": "GAHOJIN, Inc.",
6
6
  "license": "Apache-2.0",
@@ -48,10 +48,10 @@
48
48
  }
49
49
  },
50
50
  "devDependencies": {
51
- "@gahojin-inc/aws-lambda-mock-context": "2026.4.0",
52
- "@middy/core": "7.4.0",
53
- "@middy/util": "7.4.0",
54
- "@types/aws-lambda": "8.10.161"
51
+ "@gahojin-inc/aws-lambda-mock-context": "2026.5.1",
52
+ "@middy/core": "7.7.0",
53
+ "@middy/util": "7.7.0",
54
+ "@types/aws-lambda": "8.10.162"
55
55
  },
56
56
  "peerDependencies": {
57
57
  "@middy/core": "^5 || ^6 || ^7",
@@ -59,11 +59,10 @@
59
59
  "@types/aws-lambda": "^8"
60
60
  },
61
61
  "scripts": {
62
- "build": "vite build",
62
+ "build": "rolldown -c",
63
63
  "lint": "biome check --write .",
64
64
  "lint:ci": "biome ci .",
65
65
  "check": "tsc --noEmit",
66
- "check:packagejson": "attw --pack --profile esm-only .",
67
66
  "test": "vitest --watch",
68
67
  "test:unit": "vitest --passWithNoTests --run --coverage"
69
68
  }