@forklaunch/express 1.2.37 → 1.2.38

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/lib/index.js CHANGED
@@ -1905,14 +1905,66 @@ var import_common2 = require("@forklaunch/common");
1905
1905
  var import_http = require("@forklaunch/core/http");
1906
1906
  var import_busboy = __toESM(require("busboy"));
1907
1907
  var import_express = __toESM(require("express"));
1908
+ var DEFAULT_CONTENT_TYPES = {
1909
+ json: "application/json",
1910
+ text: "text/plain",
1911
+ urlEncoded: "application/x-www-form-urlencoded",
1912
+ file: "application/octet-stream",
1913
+ multipart: "multipart/form-data"
1914
+ };
1908
1915
  function contentParse(options2) {
1909
- const jsonParser = import_express.default.json(options2?.json);
1910
- const urlencodedParser = import_express.default.urlencoded({
1911
- extended: true,
1912
- ...options2?.urlencoded
1913
- });
1914
- const textParser = import_express.default.text(options2?.text);
1915
- const rawParser = import_express.default.raw(options2?.raw);
1916
+ let resolvedOptions;
1917
+ const parserCache = /* @__PURE__ */ new Map();
1918
+ const captureRawBody = (base) => {
1919
+ const userVerify = base?.verify;
1920
+ return (req, res, buf, encoding) => {
1921
+ userVerify?.(req, res, buf, encoding);
1922
+ req._rawBody = buf;
1923
+ };
1924
+ };
1925
+ const buildParser = (parserType, contentTypeOverride) => {
1926
+ const typeOverride = contentTypeOverride ? { type: contentTypeOverride } : {};
1927
+ switch (parserType) {
1928
+ case "json":
1929
+ return import_express.default.json({
1930
+ ...resolvedOptions?.json,
1931
+ verify: captureRawBody(resolvedOptions?.json),
1932
+ ...typeOverride
1933
+ });
1934
+ case "urlEncoded":
1935
+ return import_express.default.urlencoded({
1936
+ extended: true,
1937
+ ...resolvedOptions?.urlencoded,
1938
+ verify: captureRawBody(resolvedOptions?.urlencoded),
1939
+ ...typeOverride
1940
+ });
1941
+ case "text":
1942
+ return import_express.default.text({
1943
+ ...resolvedOptions?.text,
1944
+ verify: captureRawBody(resolvedOptions?.text),
1945
+ ...typeOverride
1946
+ });
1947
+ case "file":
1948
+ return import_express.default.raw({
1949
+ ...resolvedOptions?.raw,
1950
+ verify: captureRawBody(resolvedOptions?.raw),
1951
+ ...typeOverride
1952
+ });
1953
+ default:
1954
+ (0, import_common2.isNever)(parserType);
1955
+ throw new Error("Unsupported parser type: " + parserType);
1956
+ }
1957
+ };
1958
+ const parserFor = (parserType, contentType) => {
1959
+ const contentTypeOverride = contentType !== DEFAULT_CONTENT_TYPES[parserType] ? contentType : void 0;
1960
+ const cacheKey = `${parserType}:${contentTypeOverride ?? ""}`;
1961
+ let parser = parserCache.get(cacheKey);
1962
+ if (!parser) {
1963
+ parser = buildParser(parserType, contentTypeOverride);
1964
+ parserCache.set(cacheKey, parser);
1965
+ }
1966
+ return parser;
1967
+ };
1916
1968
  return async (req, res, next) => {
1917
1969
  try {
1918
1970
  const coercedRequest = req;
@@ -1929,24 +1981,39 @@ function contentParse(options2) {
1929
1981
  if (!discriminatedBody) {
1930
1982
  return next();
1931
1983
  }
1984
+ if (!resolvedOptions) {
1985
+ const globalOptions = coercedRequest._globalOptions?.();
1986
+ resolvedOptions = {
1987
+ busboy: globalOptions?.busboy ?? options2?.busboy,
1988
+ text: globalOptions?.text ?? options2?.text,
1989
+ json: globalOptions?.json ?? options2?.json,
1990
+ urlencoded: globalOptions?.urlencoded ?? options2?.urlencoded,
1991
+ raw: globalOptions?.raw ?? options2?.raw
1992
+ };
1993
+ }
1932
1994
  switch (discriminatedBody.parserType) {
1933
1995
  case "json":
1934
- return jsonParser(req, res, next);
1935
1996
  case "urlEncoded":
1936
- return urlencodedParser(req, res, next);
1937
1997
  case "text":
1938
- return textParser(req, res, next);
1998
+ return parserFor(
1999
+ discriminatedBody.parserType,
2000
+ discriminatedBody.contentType
2001
+ )(req, res, next);
1939
2002
  case "file":
1940
- return rawParser(req, res, async (err) => {
1941
- if (err) {
1942
- return next(err);
2003
+ return parserFor("file", discriminatedBody.contentType)(
2004
+ req,
2005
+ res,
2006
+ async (err) => {
2007
+ if (err) {
2008
+ return next(err);
2009
+ }
2010
+ next();
1943
2011
  }
1944
- next();
1945
- });
2012
+ );
1946
2013
  case "multipart": {
1947
2014
  const bb = (0, import_busboy.default)({
1948
2015
  headers: req.headers,
1949
- ...options2?.busboy
2016
+ ...resolvedOptions?.busboy
1950
2017
  });
1951
2018
  const body = {};
1952
2019
  bb.on("file", (fieldname, file) => {
package/lib/index.mjs CHANGED
@@ -1879,14 +1879,66 @@ import { isNever } from "@forklaunch/common";
1879
1879
  import { discriminateBody } from "@forklaunch/core/http";
1880
1880
  import Busboy from "busboy";
1881
1881
  import express from "express";
1882
+ var DEFAULT_CONTENT_TYPES = {
1883
+ json: "application/json",
1884
+ text: "text/plain",
1885
+ urlEncoded: "application/x-www-form-urlencoded",
1886
+ file: "application/octet-stream",
1887
+ multipart: "multipart/form-data"
1888
+ };
1882
1889
  function contentParse(options2) {
1883
- const jsonParser = express.json(options2?.json);
1884
- const urlencodedParser = express.urlencoded({
1885
- extended: true,
1886
- ...options2?.urlencoded
1887
- });
1888
- const textParser = express.text(options2?.text);
1889
- const rawParser = express.raw(options2?.raw);
1890
+ let resolvedOptions;
1891
+ const parserCache = /* @__PURE__ */ new Map();
1892
+ const captureRawBody = (base) => {
1893
+ const userVerify = base?.verify;
1894
+ return (req, res, buf, encoding) => {
1895
+ userVerify?.(req, res, buf, encoding);
1896
+ req._rawBody = buf;
1897
+ };
1898
+ };
1899
+ const buildParser = (parserType, contentTypeOverride) => {
1900
+ const typeOverride = contentTypeOverride ? { type: contentTypeOverride } : {};
1901
+ switch (parserType) {
1902
+ case "json":
1903
+ return express.json({
1904
+ ...resolvedOptions?.json,
1905
+ verify: captureRawBody(resolvedOptions?.json),
1906
+ ...typeOverride
1907
+ });
1908
+ case "urlEncoded":
1909
+ return express.urlencoded({
1910
+ extended: true,
1911
+ ...resolvedOptions?.urlencoded,
1912
+ verify: captureRawBody(resolvedOptions?.urlencoded),
1913
+ ...typeOverride
1914
+ });
1915
+ case "text":
1916
+ return express.text({
1917
+ ...resolvedOptions?.text,
1918
+ verify: captureRawBody(resolvedOptions?.text),
1919
+ ...typeOverride
1920
+ });
1921
+ case "file":
1922
+ return express.raw({
1923
+ ...resolvedOptions?.raw,
1924
+ verify: captureRawBody(resolvedOptions?.raw),
1925
+ ...typeOverride
1926
+ });
1927
+ default:
1928
+ isNever(parserType);
1929
+ throw new Error("Unsupported parser type: " + parserType);
1930
+ }
1931
+ };
1932
+ const parserFor = (parserType, contentType) => {
1933
+ const contentTypeOverride = contentType !== DEFAULT_CONTENT_TYPES[parserType] ? contentType : void 0;
1934
+ const cacheKey = `${parserType}:${contentTypeOverride ?? ""}`;
1935
+ let parser = parserCache.get(cacheKey);
1936
+ if (!parser) {
1937
+ parser = buildParser(parserType, contentTypeOverride);
1938
+ parserCache.set(cacheKey, parser);
1939
+ }
1940
+ return parser;
1941
+ };
1890
1942
  return async (req, res, next) => {
1891
1943
  try {
1892
1944
  const coercedRequest = req;
@@ -1903,24 +1955,39 @@ function contentParse(options2) {
1903
1955
  if (!discriminatedBody) {
1904
1956
  return next();
1905
1957
  }
1958
+ if (!resolvedOptions) {
1959
+ const globalOptions = coercedRequest._globalOptions?.();
1960
+ resolvedOptions = {
1961
+ busboy: globalOptions?.busboy ?? options2?.busboy,
1962
+ text: globalOptions?.text ?? options2?.text,
1963
+ json: globalOptions?.json ?? options2?.json,
1964
+ urlencoded: globalOptions?.urlencoded ?? options2?.urlencoded,
1965
+ raw: globalOptions?.raw ?? options2?.raw
1966
+ };
1967
+ }
1906
1968
  switch (discriminatedBody.parserType) {
1907
1969
  case "json":
1908
- return jsonParser(req, res, next);
1909
1970
  case "urlEncoded":
1910
- return urlencodedParser(req, res, next);
1911
1971
  case "text":
1912
- return textParser(req, res, next);
1972
+ return parserFor(
1973
+ discriminatedBody.parserType,
1974
+ discriminatedBody.contentType
1975
+ )(req, res, next);
1913
1976
  case "file":
1914
- return rawParser(req, res, async (err) => {
1915
- if (err) {
1916
- return next(err);
1977
+ return parserFor("file", discriminatedBody.contentType)(
1978
+ req,
1979
+ res,
1980
+ async (err) => {
1981
+ if (err) {
1982
+ return next(err);
1983
+ }
1984
+ next();
1917
1985
  }
1918
- next();
1919
- });
1986
+ );
1920
1987
  case "multipart": {
1921
1988
  const bb = Busboy({
1922
1989
  headers: req.headers,
1923
- ...options2?.busboy
1990
+ ...resolvedOptions?.busboy
1924
1991
  });
1925
1992
  const body = {};
1926
1993
  bb.on("file", (fieldname, file) => {
@@ -2,12 +2,13 @@ import { AnySchemaValidator } from '@forklaunch/validator';
2
2
  import { Options, OptionsJson, OptionsText, OptionsUrlencoded } from 'body-parser';
3
3
  import { BusboyConfig } from 'busboy';
4
4
  import { NextFunction, Request, Response } from 'express';
5
- declare function contentParse<SV extends AnySchemaValidator>(options?: {
5
+ type ContentParseOptions = {
6
6
  busboy?: BusboyConfig;
7
7
  text?: OptionsText;
8
8
  json?: OptionsJson;
9
9
  urlencoded?: OptionsUrlencoded;
10
10
  raw?: Options;
11
- }): (req: Request, res: Response, next: NextFunction) => Promise<void>;
11
+ };
12
+ declare function contentParse<SV extends AnySchemaValidator>(options?: ContentParseOptions): (req: Request, res: Response, next: NextFunction) => Promise<unknown>;
12
13
  export { contentParse };
13
14
  //# sourceMappingURL=content.parse.middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.parse.middleware.d.ts","sourceRoot":"","sources":["../../../src/middleware/content.parse.middleware.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,OAAO,EACP,WAAW,EACX,WAAW,EACX,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMnE,iBAAS,YAAY,CAAC,EAAE,SAAS,kBAAkB,EAAE,OAAO,CAAC,EAAE;IAC7D,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,SASoB,OAAO,OAAO,QAAQ,QAAQ,YAAY,mBAoF9D;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"content.parse.middleware.d.ts","sourceRoot":"","sources":["../../../src/middleware/content.parse.middleware.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,OAAO,EACP,WAAW,EACX,WAAW,EACX,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAgB,EAAE,YAAY,EAAE,OAAO,EAAkB,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMnF,KAAK,mBAAmB,GAAG;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAuBF,iBAAS,YAAY,CAAC,EAAE,SAAS,kBAAkB,EACjD,OAAO,CAAC,EAAE,mBAAmB,SAyEV,OAAO,OAAO,QAAQ,QAAQ,YAAY,sBAqG9D;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forklaunch/express",
3
- "version": "1.2.37",
3
+ "version": "1.2.38",
4
4
  "description": "Forklaunch framework for express.",
5
5
  "homepage": "https://github.com/forklaunch/forklaunch-js#readme",
6
6
  "bugs": {
@@ -41,7 +41,7 @@
41
41
  "range-parser": "^1.3.0",
42
42
  "swagger-ui-express": "^5.0.1",
43
43
  "@forklaunch/common": "^1.2.22",
44
- "@forklaunch/core": "^1.5.9",
44
+ "@forklaunch/core": "^1.5.11",
45
45
  "@forklaunch/validator": "^1.2.23"
46
46
  },
47
47
  "devDependencies": {