@bool-ts/core 2.3.7 → 2.3.8

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.
@@ -1 +1,4 @@
1
1
  export declare const inferStatusText: (httpCode: number) => string;
2
+ type TCallable = <T>(...args: T[]) => unknown;
3
+ export declare const hasCallSignature: (value: any) => value is TCallable;
4
+ export {};
package/package.json CHANGED
@@ -44,5 +44,5 @@
44
44
  "test:socket": "bun --hot run __test/client/socket.ts"
45
45
  },
46
46
  "types": "./dist/index.d.ts",
47
- "version": "2.3.7"
48
- }
47
+ "version": "2.3.8"
48
+ }
@@ -12,40 +12,53 @@ import {
12
12
  responseHeadersArgsKey,
13
13
  routeModelArgsKey
14
14
  } from "../constants/keys";
15
+ import type { IContext } from "../interfaces";
15
16
 
16
17
  export type TArgumentsMetadata<TValidationSchema = unknown> =
17
18
  | {
18
19
  index: number;
19
20
  type: typeof requestHeadersArgsKey;
20
- validationSchema?: TValidationSchema;
21
+ validationSchema?:
22
+ | TValidationSchema
23
+ | ((context: IContext) => Promise<TValidationSchema> | TValidationSchema);
21
24
  }
22
25
  | {
23
26
  index: number;
24
27
  type: typeof requestHeaderArgsKey;
25
28
  key: string;
26
- validationSchema?: TValidationSchema;
29
+ validationSchema?:
30
+ | TValidationSchema
31
+ | ((context: IContext) => Promise<TValidationSchema> | TValidationSchema);
27
32
  }
28
33
  | {
29
34
  index: number;
30
35
  type: typeof requestBodyArgsKey;
31
- validationSchema?: TValidationSchema;
36
+ validationSchema?:
37
+ | TValidationSchema
38
+ | ((context: IContext) => Promise<TValidationSchema> | TValidationSchema);
32
39
  parser?: "arrayBuffer" | "blob" | "formData" | "json" | "text";
33
40
  }
34
41
  | {
35
42
  index: number;
36
43
  type: typeof paramsArgsKey;
37
- validationSchema?: TValidationSchema;
44
+ validationSchema?:
45
+ | TValidationSchema
46
+ | ((context: IContext) => Promise<TValidationSchema> | TValidationSchema);
38
47
  }
39
48
  | {
40
49
  index: number;
41
50
  type: typeof paramArgsKey;
42
51
  key: string;
43
- validationSchema?: TValidationSchema;
52
+ validationSchema?:
53
+ | TValidationSchema
54
+ | ((context: IContext) => Promise<TValidationSchema> | TValidationSchema);
44
55
  }
45
56
  | {
46
57
  index: number;
47
58
  type: typeof queryArgsKey;
48
- validationSchema?: TValidationSchema;
59
+ validationSchema?:
60
+ | TValidationSchema
61
+ | ((context: IContext) => Promise<TValidationSchema> | TValidationSchema);
49
62
  }
50
63
  | {
51
64
  index: number;
@@ -10,6 +10,7 @@ import type {
10
10
  } from "../decorators";
11
11
  import type { THttpMethods } from "../http";
12
12
  import type {
13
+ IContext,
13
14
  IController,
14
15
  ICustomValidator,
15
16
  IGuard,
@@ -75,7 +76,7 @@ import {
75
76
  HttpServerError,
76
77
  jsonErrorInfer
77
78
  } from "../http";
78
- import { ansiText, inferStatusText, isWebSocketUpgrade } from "../utils";
79
+ import { ansiText, hasCallSignature, inferStatusText, isWebSocketUpgrade } from "../utils";
79
80
  import { Context } from "./context";
80
81
  import { HttpRouter } from "./httpRouter";
81
82
  import { HttpRouterGroup } from "./httpRouterGroup";
@@ -1659,24 +1660,37 @@ export class Application<TRootClass extends Object = Object> {
1659
1660
  * @returns
1660
1661
  */
1661
1662
  async #argumentsResolver<TValidationSchema = unknown>({
1663
+ context,
1662
1664
  data,
1663
1665
  validationSchema,
1664
1666
  argumentIndex,
1665
1667
  funcName
1666
1668
  }: {
1669
+ context: IContext;
1667
1670
  data: unknown;
1668
- validationSchema: TValidationSchema;
1671
+ validationSchema:
1672
+ | TValidationSchema
1673
+ | ((context: IContext) => TValidationSchema | Promise<TValidationSchema>);
1669
1674
  argumentIndex: number;
1670
1675
  funcName: string | symbol;
1671
1676
  }) {
1672
- if (!this.#customValidator) {
1677
+ if (
1678
+ !this.#customValidator ||
1679
+ !validationSchema ||
1680
+ Object.getOwnPropertyDescriptor(validationSchema, "prototype")
1681
+ ) {
1673
1682
  return data;
1674
1683
  }
1675
1684
 
1676
1685
  try {
1686
+ const inferValidationSchema =
1687
+ typeof validationSchema === "function" && hasCallSignature(validationSchema)
1688
+ ? await validationSchema(context)
1689
+ : validationSchema;
1690
+
1677
1691
  const validation = await this.#customValidator.validate(
1678
1692
  data,
1679
- validationSchema,
1693
+ inferValidationSchema,
1680
1694
  argumentIndex,
1681
1695
  funcName
1682
1696
  );
@@ -1913,6 +1927,7 @@ export class Application<TRootClass extends Object = Object> {
1913
1927
  args[argMetadata.index] = !argMetadata.validationSchema
1914
1928
  ? await request?.[argMetadata.parser || "json"]()
1915
1929
  : await this.#argumentsResolver({
1930
+ context: context,
1916
1931
  data: await request?.[argMetadata.parser || "json"](),
1917
1932
  validationSchema: argMetadata.validationSchema,
1918
1933
  argumentIndex: argMetadata.index,
@@ -1923,6 +1938,7 @@ export class Application<TRootClass extends Object = Object> {
1923
1938
  args[argMetadata.index] = !argMetadata.validationSchema
1924
1939
  ? requestHeaders
1925
1940
  : await this.#argumentsResolver({
1941
+ context: context,
1926
1942
  data: requestHeaders?.toJSON(),
1927
1943
  validationSchema: argMetadata.validationSchema,
1928
1944
  argumentIndex: argMetadata.index,
@@ -1933,6 +1949,7 @@ export class Application<TRootClass extends Object = Object> {
1933
1949
  args[argMetadata.index] = !argMetadata.validationSchema
1934
1950
  ? requestHeaders?.get(argMetadata.key) || undefined
1935
1951
  : await this.#argumentsResolver({
1952
+ context: context,
1936
1953
  data: requestHeaders?.get(argMetadata.key) || undefined,
1937
1954
  validationSchema: argMetadata.validationSchema,
1938
1955
  argumentIndex: argMetadata.index,
@@ -1943,6 +1960,7 @@ export class Application<TRootClass extends Object = Object> {
1943
1960
  args[argMetadata.index] = !argMetadata.validationSchema
1944
1961
  ? parameters?.[argMetadata.key] || undefined
1945
1962
  : await this.#argumentsResolver({
1963
+ context: context,
1946
1964
  data: parameters?.[argMetadata.key] || undefined,
1947
1965
  validationSchema: argMetadata.validationSchema,
1948
1966
  argumentIndex: argMetadata.index,
@@ -1962,6 +1980,7 @@ export class Application<TRootClass extends Object = Object> {
1962
1980
  args[argMetadata.index] = !argMetadata.validationSchema
1963
1981
  ? context.get(argMetadata.type, contextOptions)
1964
1982
  : await this.#argumentsResolver({
1983
+ context: context,
1965
1984
  data: context.get(argMetadata.type, contextOptions),
1966
1985
  validationSchema: argMetadata.validationSchema,
1967
1986
  argumentIndex: argMetadata.index,
@@ -1991,6 +2010,7 @@ export class Application<TRootClass extends Object = Object> {
1991
2010
  args[argMetadata.index] = !argMetadata.validationSchema
1992
2011
  ? await request?.[argMetadata.parser || "json"]()
1993
2012
  : await this.#argumentsResolver({
2013
+ context: context,
1994
2014
  data: await request?.[argMetadata.parser || "json"](),
1995
2015
  validationSchema: argMetadata.validationSchema,
1996
2016
  argumentIndex: argMetadata.index,
@@ -2006,6 +2026,7 @@ export class Application<TRootClass extends Object = Object> {
2006
2026
  args[argMetadata.index] = !argMetadata.validationSchema
2007
2027
  ? requestHeaders
2008
2028
  : await this.#argumentsResolver({
2029
+ context: context,
2009
2030
  data: requestHeaders?.toJSON(),
2010
2031
  validationSchema: argMetadata.validationSchema,
2011
2032
  argumentIndex: argMetadata.index,
@@ -2019,6 +2040,7 @@ export class Application<TRootClass extends Object = Object> {
2019
2040
  args[argMetadata.index] = !argMetadata.validationSchema
2020
2041
  ? requestHeaders?.get(argMetadata.key) || undefined
2021
2042
  : await this.#argumentsResolver({
2043
+ context: context,
2022
2044
  data: requestHeaders?.get(argMetadata.key) || undefined,
2023
2045
  validationSchema: argMetadata.validationSchema,
2024
2046
  argumentIndex: argMetadata.index,
@@ -2029,6 +2051,7 @@ export class Application<TRootClass extends Object = Object> {
2029
2051
  args[argMetadata.index] = !argMetadata.validationSchema
2030
2052
  ? parameters?.[argMetadata.key] || undefined
2031
2053
  : await this.#argumentsResolver({
2054
+ context: context,
2032
2055
  data: parameters?.[argMetadata.key],
2033
2056
  validationSchema: argMetadata.validationSchema,
2034
2057
  argumentIndex: argMetadata.index,
@@ -2045,6 +2068,7 @@ export class Application<TRootClass extends Object = Object> {
2045
2068
  args[argMetadata.index] = !argMetadata.validationSchema
2046
2069
  ? context.get(argMetadata.type)
2047
2070
  : await this.#argumentsResolver({
2071
+ context: context,
2048
2072
  data: context.get(argMetadata.type),
2049
2073
  validationSchema: argMetadata.validationSchema,
2050
2074
  argumentIndex: argMetadata.index,
@@ -2089,6 +2113,7 @@ export class Application<TRootClass extends Object = Object> {
2089
2113
  args[argMetadata.index] = !argMetadata.validationSchema
2090
2114
  ? await request?.[argMetadata.parser || "json"]()
2091
2115
  : await this.#argumentsResolver({
2116
+ context: context,
2092
2117
  data: await request?.[argMetadata.parser || "json"](),
2093
2118
  validationSchema: argMetadata.validationSchema,
2094
2119
  argumentIndex: argMetadata.index,
@@ -2104,6 +2129,7 @@ export class Application<TRootClass extends Object = Object> {
2104
2129
  args[argMetadata.index] = !argMetadata.validationSchema
2105
2130
  ? requestHeaders
2106
2131
  : await this.#argumentsResolver({
2132
+ context: context,
2107
2133
  data: requestHeaders?.toJSON(),
2108
2134
  validationSchema: argMetadata.validationSchema,
2109
2135
  argumentIndex: argMetadata.index,
@@ -2114,6 +2140,7 @@ export class Application<TRootClass extends Object = Object> {
2114
2140
  args[argMetadata.index] = !argMetadata.validationSchema
2115
2141
  ? requestHeaders?.get(argMetadata.key) || undefined
2116
2142
  : await this.#argumentsResolver({
2143
+ context: context,
2117
2144
  data: requestHeaders?.get(argMetadata.key) || undefined,
2118
2145
  validationSchema: argMetadata.validationSchema,
2119
2146
  argumentIndex: argMetadata.index,
@@ -2127,6 +2154,7 @@ export class Application<TRootClass extends Object = Object> {
2127
2154
  args[argMetadata.index] = !argMetadata.validationSchema
2128
2155
  ? parameters?.[argMetadata.key] || undefined
2129
2156
  : await this.#argumentsResolver({
2157
+ context: context,
2130
2158
  data: parameters?.[argMetadata.key] || undefined,
2131
2159
  validationSchema: argMetadata.validationSchema,
2132
2160
  argumentIndex: argMetadata.index,
@@ -2143,6 +2171,7 @@ export class Application<TRootClass extends Object = Object> {
2143
2171
  args[argMetadata.index] = !argMetadata.validationSchema
2144
2172
  ? context.get(argMetadata.type)
2145
2173
  : await this.#argumentsResolver({
2174
+ context: context,
2146
2175
  data: context.get(argMetadata.type),
2147
2176
  validationSchema: argMetadata.validationSchema,
2148
2177
  argumentIndex: argMetadata.index,
@@ -2180,6 +2209,7 @@ export class Application<TRootClass extends Object = Object> {
2180
2209
  controllerActionArguments[argMetadata.index] = !argMetadata.validationSchema
2181
2210
  ? await request?.[argMetadata.parser || "json"]()
2182
2211
  : await this.#argumentsResolver({
2212
+ context: context,
2183
2213
  data: await request?.[argMetadata.parser || "json"](),
2184
2214
  validationSchema: argMetadata.validationSchema,
2185
2215
  argumentIndex: argMetadata.index,
@@ -2195,6 +2225,7 @@ export class Application<TRootClass extends Object = Object> {
2195
2225
  controllerActionArguments[argMetadata.index] = !argMetadata.validationSchema
2196
2226
  ? requestHeaders
2197
2227
  : await this.#argumentsResolver({
2228
+ context: context,
2198
2229
  data: requestHeaders?.toJSON(),
2199
2230
  validationSchema: argMetadata.validationSchema,
2200
2231
  argumentIndex: argMetadata.index,
@@ -2205,6 +2236,7 @@ export class Application<TRootClass extends Object = Object> {
2205
2236
  controllerActionArguments[argMetadata.index] = !argMetadata.validationSchema
2206
2237
  ? requestHeaders?.get(argMetadata.key) || undefined
2207
2238
  : await this.#argumentsResolver({
2239
+ context: context,
2208
2240
  data: requestHeaders?.get(argMetadata.key) || undefined,
2209
2241
  validationSchema: argMetadata.validationSchema,
2210
2242
  argumentIndex: argMetadata.index,
@@ -2218,6 +2250,7 @@ export class Application<TRootClass extends Object = Object> {
2218
2250
  controllerActionArguments[argMetadata.index] = !argMetadata.validationSchema
2219
2251
  ? parameters?.[argMetadata.key] || undefined
2220
2252
  : await this.#argumentsResolver({
2253
+ context: context,
2221
2254
  data: parameters?.[argMetadata.key] || undefined,
2222
2255
  validationSchema: argMetadata.validationSchema,
2223
2256
  argumentIndex: argMetadata.index,
@@ -2234,6 +2267,7 @@ export class Application<TRootClass extends Object = Object> {
2234
2267
  controllerActionArguments[argMetadata.index] = !argMetadata.validationSchema
2235
2268
  ? context.get(argMetadata.type)
2236
2269
  : await this.#argumentsResolver({
2270
+ context: context,
2237
2271
  data: context.get(argMetadata.type),
2238
2272
  validationSchema: argMetadata.validationSchema,
2239
2273
  argumentIndex: argMetadata.index,
@@ -11,3 +11,15 @@ export const inferStatusText = (httpCode: number): string => {
11
11
 
12
12
  return "Unknown error";
13
13
  };
14
+
15
+ type TCallable = <T>(...args: T[]) => unknown;
16
+
17
+ export const hasCallSignature = (value: any): value is TCallable => {
18
+ return (
19
+ typeof value === "function" &&
20
+ !(
21
+ value.prototype &&
22
+ Object.getOwnPropertyDescriptor(value, "prototype")?.writable === false
23
+ )
24
+ );
25
+ };