@duplojs/http 0.1.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.
Files changed (238) hide show
  1. package/README.md +2 -0
  2. package/dist/core/builders/checker.cjs +20 -0
  3. package/dist/core/builders/checker.d.ts +17 -0
  4. package/dist/core/builders/checker.mjs +17 -0
  5. package/dist/core/builders/index.d.ts +4 -0
  6. package/dist/core/builders/preflight/builder.cjs +15 -0
  7. package/dist/core/builders/preflight/builder.d.ts +17 -0
  8. package/dist/core/builders/preflight/builder.mjs +12 -0
  9. package/dist/core/builders/preflight/index.d.ts +3 -0
  10. package/dist/core/builders/preflight/process.cjs +22 -0
  11. package/dist/core/builders/preflight/process.d.ts +22 -0
  12. package/dist/core/builders/preflight/process.mjs +20 -0
  13. package/dist/core/builders/preflight/route.cjs +23 -0
  14. package/dist/core/builders/preflight/route.d.ts +21 -0
  15. package/dist/core/builders/preflight/route.mjs +21 -0
  16. package/dist/core/builders/process/builder.cjs +17 -0
  17. package/dist/core/builders/process/builder.d.ts +18 -0
  18. package/dist/core/builders/process/builder.mjs +14 -0
  19. package/dist/core/builders/process/checker.cjs +23 -0
  20. package/dist/core/builders/process/checker.d.ts +34 -0
  21. package/dist/core/builders/process/checker.mjs +21 -0
  22. package/dist/core/builders/process/cut.cjs +22 -0
  23. package/dist/core/builders/process/cut.d.ts +19 -0
  24. package/dist/core/builders/process/cut.mjs +20 -0
  25. package/dist/core/builders/process/export.cjs +6 -0
  26. package/dist/core/builders/process/export.d.ts +12 -0
  27. package/dist/core/builders/process/export.mjs +4 -0
  28. package/dist/core/builders/process/extract.cjs +22 -0
  29. package/dist/core/builders/process/extract.d.ts +25 -0
  30. package/dist/core/builders/process/extract.mjs +20 -0
  31. package/dist/core/builders/process/index.d.ts +7 -0
  32. package/dist/core/builders/process/presetChecker.cjs +22 -0
  33. package/dist/core/builders/process/presetChecker.d.ts +23 -0
  34. package/dist/core/builders/process/presetChecker.mjs +20 -0
  35. package/dist/core/builders/process/process.cjs +22 -0
  36. package/dist/core/builders/process/process.d.ts +22 -0
  37. package/dist/core/builders/process/process.mjs +20 -0
  38. package/dist/core/builders/route/builder.cjs +18 -0
  39. package/dist/core/builders/route/builder.d.ts +16 -0
  40. package/dist/core/builders/route/builder.mjs +15 -0
  41. package/dist/core/builders/route/checker.cjs +23 -0
  42. package/dist/core/builders/route/checker.d.ts +34 -0
  43. package/dist/core/builders/route/checker.mjs +21 -0
  44. package/dist/core/builders/route/cut.cjs +22 -0
  45. package/dist/core/builders/route/cut.d.ts +19 -0
  46. package/dist/core/builders/route/cut.mjs +20 -0
  47. package/dist/core/builders/route/extract.cjs +22 -0
  48. package/dist/core/builders/route/extract.d.ts +25 -0
  49. package/dist/core/builders/route/extract.mjs +20 -0
  50. package/dist/core/builders/route/handler.cjs +28 -0
  51. package/dist/core/builders/route/handler.d.ts +19 -0
  52. package/dist/core/builders/route/handler.mjs +26 -0
  53. package/dist/core/builders/route/index.d.ts +8 -0
  54. package/dist/core/builders/route/presetChecker.cjs +22 -0
  55. package/dist/core/builders/route/presetChecker.d.ts +23 -0
  56. package/dist/core/builders/route/presetChecker.mjs +20 -0
  57. package/dist/core/builders/route/process.cjs +22 -0
  58. package/dist/core/builders/route/process.d.ts +23 -0
  59. package/dist/core/builders/route/process.mjs +20 -0
  60. package/dist/core/builders/route/store.cjs +19 -0
  61. package/dist/core/builders/route/store.d.ts +13 -0
  62. package/dist/core/builders/route/store.mjs +17 -0
  63. package/dist/core/checker.cjs +14 -0
  64. package/dist/core/checker.d.ts +22 -0
  65. package/dist/core/checker.mjs +10 -0
  66. package/dist/core/floor.d.ts +1 -0
  67. package/dist/core/functionsBuilders/index.d.ts +2 -0
  68. package/dist/core/functionsBuilders/route/build.cjs +40 -0
  69. package/dist/core/functionsBuilders/route/build.d.ts +8 -0
  70. package/dist/core/functionsBuilders/route/build.mjs +38 -0
  71. package/dist/core/functionsBuilders/route/create.cjs +11 -0
  72. package/dist/core/functionsBuilders/route/create.d.ts +16 -0
  73. package/dist/core/functionsBuilders/route/create.mjs +9 -0
  74. package/dist/core/functionsBuilders/route/default.cjs +143 -0
  75. package/dist/core/functionsBuilders/route/default.d.ts +1 -0
  76. package/dist/core/functionsBuilders/route/default.mjs +141 -0
  77. package/dist/core/functionsBuilders/route/hook.cjs +69 -0
  78. package/dist/core/functionsBuilders/route/hook.d.ts +7 -0
  79. package/dist/core/functionsBuilders/route/hook.mjs +62 -0
  80. package/dist/core/functionsBuilders/route/index.d.ts +4 -0
  81. package/dist/core/functionsBuilders/steps/build.cjs +24 -0
  82. package/dist/core/functionsBuilders/steps/build.d.ts +8 -0
  83. package/dist/core/functionsBuilders/steps/build.mjs +22 -0
  84. package/dist/core/functionsBuilders/steps/create.cjs +11 -0
  85. package/dist/core/functionsBuilders/steps/create.d.ts +20 -0
  86. package/dist/core/functionsBuilders/steps/create.mjs +9 -0
  87. package/dist/core/functionsBuilders/steps/defaults/checkerStep.cjs +73 -0
  88. package/dist/core/functionsBuilders/steps/defaults/checkerStep.d.ts +1 -0
  89. package/dist/core/functionsBuilders/steps/defaults/checkerStep.mjs +71 -0
  90. package/dist/core/functionsBuilders/steps/defaults/cutStep.cjs +58 -0
  91. package/dist/core/functionsBuilders/steps/defaults/cutStep.d.ts +1 -0
  92. package/dist/core/functionsBuilders/steps/defaults/cutStep.mjs +56 -0
  93. package/dist/core/functionsBuilders/steps/defaults/extractStep.cjs +57 -0
  94. package/dist/core/functionsBuilders/steps/defaults/extractStep.d.ts +1 -0
  95. package/dist/core/functionsBuilders/steps/defaults/extractStep.mjs +55 -0
  96. package/dist/core/functionsBuilders/steps/defaults/handlerStep.cjs +41 -0
  97. package/dist/core/functionsBuilders/steps/defaults/handlerStep.d.ts +1 -0
  98. package/dist/core/functionsBuilders/steps/defaults/handlerStep.mjs +39 -0
  99. package/dist/core/functionsBuilders/steps/defaults/index.d.ts +5 -0
  100. package/dist/core/functionsBuilders/steps/defaults/processStep.cjs +65 -0
  101. package/dist/core/functionsBuilders/steps/defaults/processStep.d.ts +4 -0
  102. package/dist/core/functionsBuilders/steps/defaults/processStep.mjs +62 -0
  103. package/dist/core/functionsBuilders/steps/index.d.ts +3 -0
  104. package/dist/core/hub/defaultExtractContract.cjs +8 -0
  105. package/dist/core/hub/defaultExtractContract.d.ts +6 -0
  106. package/dist/core/hub/defaultExtractContract.mjs +6 -0
  107. package/dist/core/hub/defaultNotfoundHandler.cjs +20 -0
  108. package/dist/core/hub/defaultNotfoundHandler.d.ts +10 -0
  109. package/dist/core/hub/defaultNotfoundHandler.mjs +18 -0
  110. package/dist/core/hub/hooks.cjs +38 -0
  111. package/dist/core/hub/hooks.d.ts +33 -0
  112. package/dist/core/hub/hooks.mjs +30 -0
  113. package/dist/core/hub/index.cjs +157 -0
  114. package/dist/core/hub/index.d.ts +58 -0
  115. package/dist/core/hub/index.mjs +145 -0
  116. package/dist/core/index.cjs +141 -0
  117. package/dist/core/index.d.ts +15 -0
  118. package/dist/core/index.mjs +57 -0
  119. package/dist/core/kind.cjs +9 -0
  120. package/dist/core/kind.d.ts +6 -0
  121. package/dist/core/kind.mjs +7 -0
  122. package/dist/core/presetChecker.cjs +39 -0
  123. package/dist/core/presetChecker.d.ts +38 -0
  124. package/dist/core/presetChecker.mjs +36 -0
  125. package/dist/core/process/index.cjs +12 -0
  126. package/dist/core/process/index.d.ts +31 -0
  127. package/dist/core/process/index.mjs +9 -0
  128. package/dist/core/process/types/index.d.ts +1 -0
  129. package/dist/core/request.cjs +34 -0
  130. package/dist/core/request.d.ts +40 -0
  131. package/dist/core/request.mjs +32 -0
  132. package/dist/core/response/contract.cjs +91 -0
  133. package/dist/core/response/contract.d.ts +291 -0
  134. package/dist/core/response/contract.mjs +91 -0
  135. package/dist/core/response/index.cjs +45 -0
  136. package/dist/core/response/index.d.ts +21 -0
  137. package/dist/core/response/index.mjs +39 -0
  138. package/dist/core/route/hooks/index.cjs +21 -0
  139. package/dist/core/route/hooks/index.d.ts +61 -0
  140. package/dist/core/route/hooks/index.mjs +16 -0
  141. package/dist/core/route/hooks/response.cjs +23 -0
  142. package/dist/core/route/hooks/response.d.ts +13 -0
  143. package/dist/core/route/hooks/response.mjs +21 -0
  144. package/dist/core/route/index.cjs +16 -0
  145. package/dist/core/route/index.d.ts +25 -0
  146. package/dist/core/route/index.mjs +10 -0
  147. package/dist/core/route/types/buildedRoute.d.ts +2 -0
  148. package/dist/core/route/types/index.d.ts +1 -0
  149. package/dist/core/router/buildError.cjs +14 -0
  150. package/dist/core/router/buildError.d.ts +9 -0
  151. package/dist/core/router/buildError.mjs +12 -0
  152. package/dist/core/router/decodeUrl.cjs +47 -0
  153. package/dist/core/router/decodeUrl.d.ts +7 -0
  154. package/dist/core/router/decodeUrl.mjs +43 -0
  155. package/dist/core/router/index.cjs +108 -0
  156. package/dist/core/router/index.d.ts +7 -0
  157. package/dist/core/router/index.mjs +102 -0
  158. package/dist/core/router/pathToRegExp.cjs +9 -0
  159. package/dist/core/router/pathToRegExp.d.ts +2 -0
  160. package/dist/core/router/pathToRegExp.mjs +7 -0
  161. package/dist/core/router/types/buildedRouter.d.ts +12 -0
  162. package/dist/core/router/types/index.d.ts +1 -0
  163. package/dist/core/steps/checker.cjs +13 -0
  164. package/dist/core/steps/checker.d.ts +19 -0
  165. package/dist/core/steps/checker.mjs +10 -0
  166. package/dist/core/steps/cut.cjs +15 -0
  167. package/dist/core/steps/cut.d.ts +22 -0
  168. package/dist/core/steps/cut.mjs +11 -0
  169. package/dist/core/steps/extract.cjs +13 -0
  170. package/dist/core/steps/extract.d.ts +18 -0
  171. package/dist/core/steps/extract.mjs +10 -0
  172. package/dist/core/steps/handler.cjs +13 -0
  173. package/dist/core/steps/handler.d.ts +19 -0
  174. package/dist/core/steps/handler.mjs +10 -0
  175. package/dist/core/steps/identifier.cjs +7 -0
  176. package/dist/core/steps/identifier.d.ts +5 -0
  177. package/dist/core/steps/identifier.mjs +5 -0
  178. package/dist/core/steps/index.d.ts +9 -0
  179. package/dist/core/steps/kind.cjs +7 -0
  180. package/dist/core/steps/kind.d.ts +3 -0
  181. package/dist/core/steps/kind.mjs +5 -0
  182. package/dist/core/steps/presetChecker.cjs +13 -0
  183. package/dist/core/steps/presetChecker.d.ts +14 -0
  184. package/dist/core/steps/presetChecker.mjs +10 -0
  185. package/dist/core/steps/process.cjs +13 -0
  186. package/dist/core/steps/process.d.ts +14 -0
  187. package/dist/core/steps/process.mjs +10 -0
  188. package/dist/core/steps/types/buildedStep.d.ts +5 -0
  189. package/dist/core/steps/types/index.d.ts +3 -0
  190. package/dist/core/steps/types/stepFunctionParams.d.ts +12 -0
  191. package/dist/core/steps/types/steps.d.ts +11 -0
  192. package/dist/core/stringIdentifier.cjs +7 -0
  193. package/dist/core/stringIdentifier.d.ts +1 -0
  194. package/dist/core/stringIdentifier.mjs +5 -0
  195. package/dist/core/types/environment.d.ts +4 -0
  196. package/dist/core/types/index.d.ts +1 -0
  197. package/dist/interfaces/bun/index.cjs +16 -0
  198. package/dist/interfaces/bun/index.d.ts +2 -0
  199. package/dist/interfaces/bun/index.mjs +10 -0
  200. package/dist/interfaces/bun/kind.cjs +9 -0
  201. package/dist/interfaces/bun/kind.d.ts +6 -0
  202. package/dist/interfaces/bun/kind.mjs +7 -0
  203. package/dist/interfaces/bun/types/index.d.ts +1 -0
  204. package/dist/interfaces/bun/types/request.d.ts +21 -0
  205. package/dist/interfaces/deno/index.cjs +7 -0
  206. package/dist/interfaces/deno/index.d.ts +2 -0
  207. package/dist/interfaces/deno/index.mjs +1 -0
  208. package/dist/interfaces/deno/kind.cjs +9 -0
  209. package/dist/interfaces/deno/kind.d.ts +6 -0
  210. package/dist/interfaces/deno/kind.mjs +7 -0
  211. package/dist/interfaces/deno/types/index.d.ts +1 -0
  212. package/dist/interfaces/deno/types/request.d.ts +21 -0
  213. package/dist/interfaces/node/createHttpServer.cjs +65 -0
  214. package/dist/interfaces/node/createHttpServer.d.ts +23 -0
  215. package/dist/interfaces/node/createHttpServer.mjs +63 -0
  216. package/dist/interfaces/node/error/bodyParseUnknownError.cjs +16 -0
  217. package/dist/interfaces/node/error/bodyParseUnknownError.d.ts +9 -0
  218. package/dist/interfaces/node/error/bodyParseUnknownError.mjs +14 -0
  219. package/dist/interfaces/node/error/bodyParseWrongChunkReceived.cjs +14 -0
  220. package/dist/interfaces/node/error/bodyParseWrongChunkReceived.d.ts +8 -0
  221. package/dist/interfaces/node/error/bodyParseWrongChunkReceived.mjs +12 -0
  222. package/dist/interfaces/node/error/bodySizeExceedsLimitError.cjs +14 -0
  223. package/dist/interfaces/node/error/bodySizeExceedsLimitError.d.ts +9 -0
  224. package/dist/interfaces/node/error/bodySizeExceedsLimitError.mjs +12 -0
  225. package/dist/interfaces/node/error/index.d.ts +3 -0
  226. package/dist/interfaces/node/hooks.cjs +119 -0
  227. package/dist/interfaces/node/hooks.d.ts +8 -0
  228. package/dist/interfaces/node/hooks.mjs +117 -0
  229. package/dist/interfaces/node/index.cjs +26 -0
  230. package/dist/interfaces/node/index.d.ts +5 -0
  231. package/dist/interfaces/node/index.mjs +15 -0
  232. package/dist/interfaces/node/kind.cjs +9 -0
  233. package/dist/interfaces/node/kind.d.ts +6 -0
  234. package/dist/interfaces/node/kind.mjs +7 -0
  235. package/dist/interfaces/node/types/host.d.ts +4 -0
  236. package/dist/interfaces/node/types/index.d.ts +2 -0
  237. package/dist/interfaces/node/types/request.d.ts +23 -0
  238. package/package.json +82 -0
@@ -0,0 +1,13 @@
1
+ import { type ResponseCode, Response } from "../../response";
2
+ import { type HookRouteLifeCycle } from ".";
3
+ declare const HookResponse_base: new (params: {
4
+ "@DuplojsHttpCore/hook-response"?: unknown;
5
+ }, parentParams: [code: any, information: any, body: any]) => Response<any, any, any> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsHttpCore/hook-response", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"hook-response", unknown>, unknown>;
6
+ export declare class HookResponse<GenericCode extends ResponseCode = ResponseCode, GenericInformation extends string = string, GenericBody extends unknown = unknown> extends HookResponse_base {
7
+ code: GenericCode;
8
+ information: `from-hook-${GenericInformation}`;
9
+ body: GenericBody;
10
+ fromHook: keyof HookRouteLifeCycle;
11
+ constructor(from: keyof HookRouteLifeCycle, code: GenericCode, information: GenericInformation, body: GenericBody);
12
+ }
13
+ export {};
@@ -0,0 +1,21 @@
1
+ import { createCoreLibKind } from '../../kind.mjs';
2
+ import { Response } from '../../response/index.mjs';
3
+ import { kindHeritage } from '@duplojs/utils';
4
+
5
+ const defaultParamsParent = [undefined, undefined, undefined];
6
+ const defaultParams = {};
7
+ class HookResponse extends kindHeritage("hook-response", createCoreLibKind("hook-response"), Response) {
8
+ code;
9
+ information;
10
+ body;
11
+ fromHook;
12
+ constructor(from, code, information, body) {
13
+ super(defaultParams, defaultParamsParent);
14
+ this.code = code;
15
+ this.information = `from-hook-${information}`;
16
+ this.body = body;
17
+ this.fromHook = from;
18
+ }
19
+ }
20
+
21
+ export { HookResponse };
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@duplojs/utils');
4
+ var kind = require('../kind.cjs');
5
+ var index = require('./hooks/index.cjs');
6
+
7
+ const routeKind = kind.createCoreLibKind("route");
8
+ function createRoute(definition) {
9
+ return utils.pipe({ definition }, routeKind.setTo);
10
+ }
11
+
12
+ exports.createHookRouteLifeCycle = index.createHookRouteLifeCycle;
13
+ exports.hookRouteExitKind = index.hookRouteExitKind;
14
+ exports.hookRouteNextKind = index.hookRouteNextKind;
15
+ exports.createRoute = createRoute;
16
+ exports.routeKind = routeKind;
@@ -0,0 +1,25 @@
1
+ import { type O, type Kind } from "@duplojs/utils";
2
+ import { type RequestMethods } from "../request";
3
+ import { type ExtractStep, type CheckerStep, type CutStep, type HandlerStep, type ProcessStep, type stepKind, type PresetCheckerStep } from "../steps";
4
+ import { type HookRouteLifeCycle } from "./hooks";
5
+ export * from "./types";
6
+ export * from "./hooks";
7
+ export interface RouteStepsCustom {
8
+ }
9
+ export type RouteSteps = (RouteStepsCustom[O.GetPropsWithValueExtends<RouteStepsCustom, Kind<typeof stepKind.definition>>] | CheckerStep | PresetCheckerStep | ProcessStep | ExtractStep | CutStep | HandlerStep);
10
+ export interface RoutePreFlightStepsCustom {
11
+ }
12
+ export type RoutePreFlightSteps = (RoutePreFlightStepsCustom[O.GetPropsWithValueExtends<RoutePreFlightStepsCustom, Kind<typeof stepKind.definition>>] | ProcessStep);
13
+ export type RoutePath = `/${string}`;
14
+ export interface RouteDefinition {
15
+ readonly paths: readonly [RoutePath, ...RoutePath[]];
16
+ readonly method: RequestMethods;
17
+ readonly preflightSteps: readonly RoutePreFlightSteps[];
18
+ readonly steps: readonly RouteSteps[];
19
+ readonly hooks: readonly HookRouteLifeCycle[];
20
+ }
21
+ export declare const routeKind: import("@duplojs/utils").KindHandler<import("@duplojs/utils").KindDefinition<"@DuplojsHttpCore/route", unknown>>;
22
+ export interface Route<GenericDefinition extends RouteDefinition = RouteDefinition> extends Kind<typeof routeKind.definition> {
23
+ readonly definition: GenericDefinition;
24
+ }
25
+ export declare function createRoute<GenericDefinition extends RouteDefinition>(definition: GenericDefinition): Route<GenericDefinition>;
@@ -0,0 +1,10 @@
1
+ import { pipe } from '@duplojs/utils';
2
+ import { createCoreLibKind } from '../kind.mjs';
3
+ export { createHookRouteLifeCycle, hookRouteExitKind, hookRouteNextKind } from './hooks/index.mjs';
4
+
5
+ const routeKind = createCoreLibKind("route");
6
+ function createRoute(definition) {
7
+ return pipe({ definition }, routeKind.setTo);
8
+ }
9
+
10
+ export { createRoute, routeKind };
@@ -0,0 +1,2 @@
1
+ import { type Request } from "../../request";
2
+ export type BuildedRoute = (request: Request) => Promise<void>;
@@ -0,0 +1 @@
1
+ export * from "./buildedRoute";
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ var kind = require('../kind.cjs');
4
+ var utils = require('@duplojs/utils');
5
+
6
+ class RouterBuildError extends utils.kindHeritage("router-build-error", kind.createCoreLibKind("router-build-error"), Error) {
7
+ element;
8
+ constructor(element) {
9
+ super({}, ["Error during build route."]);
10
+ this.element = element;
11
+ }
12
+ }
13
+
14
+ exports.RouterBuildError = RouterBuildError;
@@ -0,0 +1,9 @@
1
+ import { type Route } from "../route";
2
+ declare const RouterBuildError_base: new (params: {
3
+ "@DuplojsHttpCore/router-build-error"?: unknown;
4
+ }, parentParams: [message?: string | undefined, options?: ErrorOptions | undefined]) => Error & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsHttpCore/router-build-error", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"router-build-error", unknown>, unknown>;
5
+ export declare class RouterBuildError extends RouterBuildError_base {
6
+ element: Route;
7
+ constructor(element: Route);
8
+ }
9
+ export {};
@@ -0,0 +1,12 @@
1
+ import { createCoreLibKind } from '../kind.mjs';
2
+ import { kindHeritage } from '@duplojs/utils';
3
+
4
+ class RouterBuildError extends kindHeritage("router-build-error", createCoreLibKind("router-build-error"), Error) {
5
+ element;
6
+ constructor(element) {
7
+ super({}, ["Error during build route."]);
8
+ this.element = element;
9
+ }
10
+ }
11
+
12
+ export { RouterBuildError };
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ const regexUrlAnalyser = /^(?<path>[^?]*)(?:\?(?<query>[^#]*))?(?:#(?<fragment>[^]*))?$/;
4
+ const regexQueryAnalyser = /(?<key>[^=&]+)=(?<value>[^&]*)/g;
5
+ function decodeUrl(url) {
6
+ try {
7
+ const groups = regexUrlAnalyser.exec(url).groups;
8
+ const path = decodeURIComponent(groups.path || "/");
9
+ const queryString = groups.query;
10
+ if (!queryString) {
11
+ return {
12
+ path,
13
+ query: {},
14
+ };
15
+ }
16
+ const query = {};
17
+ for (const result of queryString.matchAll(regexQueryAnalyser)) {
18
+ const groups = result.groups;
19
+ const key = decodeURIComponent(groups.key);
20
+ const value = decodeURIComponent(groups.value);
21
+ const currentValue = query[key];
22
+ if (typeof currentValue === "undefined") {
23
+ query[key] = value;
24
+ }
25
+ else if (currentValue instanceof Array) {
26
+ currentValue.push(value);
27
+ }
28
+ else {
29
+ query[key] = [currentValue, value];
30
+ }
31
+ }
32
+ return {
33
+ path,
34
+ query,
35
+ };
36
+ }
37
+ catch {
38
+ return {
39
+ path: "/",
40
+ query: {},
41
+ };
42
+ }
43
+ }
44
+
45
+ exports.decodeUrl = decodeUrl;
46
+ exports.regexQueryAnalyser = regexQueryAnalyser;
47
+ exports.regexUrlAnalyser = regexUrlAnalyser;
@@ -0,0 +1,7 @@
1
+ export declare const regexUrlAnalyser: RegExp;
2
+ export declare const regexQueryAnalyser: RegExp;
3
+ export interface DecodedUrl {
4
+ path: string;
5
+ query: Record<string, string | string[]>;
6
+ }
7
+ export declare function decodeUrl(url: string): DecodedUrl;
@@ -0,0 +1,43 @@
1
+ const regexUrlAnalyser = /^(?<path>[^?]*)(?:\?(?<query>[^#]*))?(?:#(?<fragment>[^]*))?$/;
2
+ const regexQueryAnalyser = /(?<key>[^=&]+)=(?<value>[^&]*)/g;
3
+ function decodeUrl(url) {
4
+ try {
5
+ const groups = regexUrlAnalyser.exec(url).groups;
6
+ const path = decodeURIComponent(groups.path || "/");
7
+ const queryString = groups.query;
8
+ if (!queryString) {
9
+ return {
10
+ path,
11
+ query: {},
12
+ };
13
+ }
14
+ const query = {};
15
+ for (const result of queryString.matchAll(regexQueryAnalyser)) {
16
+ const groups = result.groups;
17
+ const key = decodeURIComponent(groups.key);
18
+ const value = decodeURIComponent(groups.value);
19
+ const currentValue = query[key];
20
+ if (typeof currentValue === "undefined") {
21
+ query[key] = value;
22
+ }
23
+ else if (currentValue instanceof Array) {
24
+ currentValue.push(value);
25
+ }
26
+ else {
27
+ query[key] = [currentValue, value];
28
+ }
29
+ }
30
+ return {
31
+ path,
32
+ query,
33
+ };
34
+ }
35
+ catch {
36
+ return {
37
+ path: "/",
38
+ query: {},
39
+ };
40
+ }
41
+ }
42
+
43
+ export { decodeUrl, regexQueryAnalyser, regexUrlAnalyser };
@@ -0,0 +1,108 @@
1
+ 'use strict';
2
+
3
+ require('../hub/index.cjs');
4
+ var utils = require('@duplojs/utils');
5
+ var pathToRegExp = require('./pathToRegExp.cjs');
6
+ var index = require('../route/index.cjs');
7
+ var buildError = require('./buildError.cjs');
8
+ var build = require('../functionsBuilders/route/build.cjs');
9
+ var _default = require('../functionsBuilders/route/default.cjs');
10
+ require('../functionsBuilders/route/hook.cjs');
11
+ var checkerStep = require('../functionsBuilders/steps/defaults/checkerStep.cjs');
12
+ var cutStep = require('../functionsBuilders/steps/defaults/cutStep.cjs');
13
+ var handlerStep = require('../functionsBuilders/steps/defaults/handlerStep.cjs');
14
+ var extractStep = require('../functionsBuilders/steps/defaults/extractStep.cjs');
15
+ var processStep = require('../functionsBuilders/steps/defaults/processStep.cjs');
16
+ var decodeUrl = require('./decodeUrl.cjs');
17
+ var hooks = require('../hub/hooks.cjs');
18
+
19
+ async function buildRouter(inputHub) {
20
+ const hub = inputHub
21
+ .addRouteFunctionBuilder(_default.defaultRouteFunctionBuilder)
22
+ .addStepFunctionBuilder([
23
+ checkerStep.defaultCheckerStepFunctionBuilder,
24
+ cutStep.defaultCutStepFunctionBuilder,
25
+ handlerStep.defaultHandlerStepFunctionBuilder,
26
+ extractStep.defaultExtractStepFunctionBuilder,
27
+ processStep.defaultProcessStepFunctionBuilder,
28
+ ]);
29
+ const { environment } = hub.config;
30
+ const { hooksRouteLifeCycle, routeFunctionBuilders, routes, stepFunctionBuilders, hooksHubLifeCycle, } = hub.aggregates();
31
+ const hooksBeforeBuildRoute = utils.pipe(hooksHubLifeCycle, utils.A.map(({ beforeBuildRoute }) => beforeBuildRoute), utils.A.filter(utils.isType("function")));
32
+ const buildParams = {
33
+ environment,
34
+ globalHooksRouteLifeCycle: hooksRouteLifeCycle,
35
+ stepFunctionBuilders,
36
+ routeFunctionBuilders,
37
+ };
38
+ const groupedRoute = await utils.G.asyncReduce(routes, utils.G.reduceFrom({}), async ({ lastValue, element: route, nextWithObject, }) => {
39
+ const routeAfterHook = await hooks.launchHookBeforeBuildRoute(hooksBeforeBuildRoute, route);
40
+ const buildedRoute = await build.buildRouteFunction(routeAfterHook, buildParams);
41
+ if (utils.E.isLeft(buildedRoute)) {
42
+ throw new buildError.RouterBuildError(utils.unwrap(buildedRoute));
43
+ }
44
+ return nextWithObject(lastValue, {
45
+ [route.definition.method]: utils.A.concat(lastValue[route.definition.method] ?? [], utils.A.map(route.definition.paths, utils.O.to({
46
+ pattern: pathToRegExp.pathToRegExp,
47
+ buildedRoute: utils.justReturn(utils.unwrap(buildedRoute)),
48
+ matchedPath: utils.forward,
49
+ }))),
50
+ });
51
+ });
52
+ const buildedNotfoundRoute = await utils.asyncPipe(index.createRoute({
53
+ method: "GET",
54
+ paths: ["/"],
55
+ hooks: [],
56
+ preflightSteps: [],
57
+ steps: [hub.notfoundHandler],
58
+ }), (route) => build.buildRouteFunction(route, buildParams), utils.E.whenIsLeft((element) => {
59
+ throw new buildError.RouterBuildError(element);
60
+ }), utils.unwrap);
61
+ const Request = hub.classRequest;
62
+ return {
63
+ exec: (initializationData) => {
64
+ const routerElements = groupedRoute[initializationData.method];
65
+ const decodedUrl = decodeUrl.decodeUrl(initializationData.url);
66
+ if (!routerElements) {
67
+ return buildedNotfoundRoute(new Request({
68
+ ...initializationData,
69
+ ...decodedUrl,
70
+ params: {},
71
+ matchedPath: null,
72
+ }));
73
+ }
74
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
75
+ for (let index = 0; index < routerElements.length; index++) {
76
+ const routerElement = routerElements[index];
77
+ const result = routerElement.pattern.exec(decodedUrl.path);
78
+ if (!result) {
79
+ continue;
80
+ }
81
+ return routerElement.buildedRoute(new Request({
82
+ ...initializationData,
83
+ ...decodedUrl,
84
+ params: result.groups ?? {},
85
+ matchedPath: routerElement.matchedPath,
86
+ }));
87
+ }
88
+ return buildedNotfoundRoute(new Request({
89
+ ...initializationData,
90
+ ...decodedUrl,
91
+ params: {},
92
+ matchedPath: null,
93
+ }));
94
+ },
95
+ hooksRouteLifeCycle,
96
+ routeFunctionBuilders,
97
+ routes,
98
+ stepFunctionBuilders,
99
+ hooksHubLifeCycle,
100
+ };
101
+ }
102
+
103
+ exports.pathToRegExp = pathToRegExp.pathToRegExp;
104
+ exports.RouterBuildError = buildError.RouterBuildError;
105
+ exports.decodeUrl = decodeUrl.decodeUrl;
106
+ exports.regexQueryAnalyser = decodeUrl.regexQueryAnalyser;
107
+ exports.regexUrlAnalyser = decodeUrl.regexUrlAnalyser;
108
+ exports.buildRouter = buildRouter;
@@ -0,0 +1,7 @@
1
+ import { type Hub } from "../hub";
2
+ import { type BuildedRouter } from "./types";
3
+ export * from "./types";
4
+ export * from "./pathToRegExp";
5
+ export * from "./buildError";
6
+ export * from "./decodeUrl";
7
+ export declare function buildRouter(inputHub: Hub): Promise<BuildedRouter>;
@@ -0,0 +1,102 @@
1
+ import '../hub/index.mjs';
2
+ import { pipe, A, isType, G, E, unwrap, O, forward, justReturn, asyncPipe } from '@duplojs/utils';
3
+ import { pathToRegExp } from './pathToRegExp.mjs';
4
+ import { createRoute } from '../route/index.mjs';
5
+ import { RouterBuildError } from './buildError.mjs';
6
+ import { buildRouteFunction } from '../functionsBuilders/route/build.mjs';
7
+ import { defaultRouteFunctionBuilder } from '../functionsBuilders/route/default.mjs';
8
+ import '../functionsBuilders/route/hook.mjs';
9
+ import { defaultCheckerStepFunctionBuilder } from '../functionsBuilders/steps/defaults/checkerStep.mjs';
10
+ import { defaultCutStepFunctionBuilder } from '../functionsBuilders/steps/defaults/cutStep.mjs';
11
+ import { defaultHandlerStepFunctionBuilder } from '../functionsBuilders/steps/defaults/handlerStep.mjs';
12
+ import { defaultExtractStepFunctionBuilder } from '../functionsBuilders/steps/defaults/extractStep.mjs';
13
+ import { defaultProcessStepFunctionBuilder } from '../functionsBuilders/steps/defaults/processStep.mjs';
14
+ import { decodeUrl } from './decodeUrl.mjs';
15
+ export { regexQueryAnalyser, regexUrlAnalyser } from './decodeUrl.mjs';
16
+ import { launchHookBeforeBuildRoute } from '../hub/hooks.mjs';
17
+
18
+ async function buildRouter(inputHub) {
19
+ const hub = inputHub
20
+ .addRouteFunctionBuilder(defaultRouteFunctionBuilder)
21
+ .addStepFunctionBuilder([
22
+ defaultCheckerStepFunctionBuilder,
23
+ defaultCutStepFunctionBuilder,
24
+ defaultHandlerStepFunctionBuilder,
25
+ defaultExtractStepFunctionBuilder,
26
+ defaultProcessStepFunctionBuilder,
27
+ ]);
28
+ const { environment } = hub.config;
29
+ const { hooksRouteLifeCycle, routeFunctionBuilders, routes, stepFunctionBuilders, hooksHubLifeCycle, } = hub.aggregates();
30
+ const hooksBeforeBuildRoute = pipe(hooksHubLifeCycle, A.map(({ beforeBuildRoute }) => beforeBuildRoute), A.filter(isType("function")));
31
+ const buildParams = {
32
+ environment,
33
+ globalHooksRouteLifeCycle: hooksRouteLifeCycle,
34
+ stepFunctionBuilders,
35
+ routeFunctionBuilders,
36
+ };
37
+ const groupedRoute = await G.asyncReduce(routes, G.reduceFrom({}), async ({ lastValue, element: route, nextWithObject, }) => {
38
+ const routeAfterHook = await launchHookBeforeBuildRoute(hooksBeforeBuildRoute, route);
39
+ const buildedRoute = await buildRouteFunction(routeAfterHook, buildParams);
40
+ if (E.isLeft(buildedRoute)) {
41
+ throw new RouterBuildError(unwrap(buildedRoute));
42
+ }
43
+ return nextWithObject(lastValue, {
44
+ [route.definition.method]: A.concat(lastValue[route.definition.method] ?? [], A.map(route.definition.paths, O.to({
45
+ pattern: pathToRegExp,
46
+ buildedRoute: justReturn(unwrap(buildedRoute)),
47
+ matchedPath: forward,
48
+ }))),
49
+ });
50
+ });
51
+ const buildedNotfoundRoute = await asyncPipe(createRoute({
52
+ method: "GET",
53
+ paths: ["/"],
54
+ hooks: [],
55
+ preflightSteps: [],
56
+ steps: [hub.notfoundHandler],
57
+ }), (route) => buildRouteFunction(route, buildParams), E.whenIsLeft((element) => {
58
+ throw new RouterBuildError(element);
59
+ }), unwrap);
60
+ const Request = hub.classRequest;
61
+ return {
62
+ exec: (initializationData) => {
63
+ const routerElements = groupedRoute[initializationData.method];
64
+ const decodedUrl = decodeUrl(initializationData.url);
65
+ if (!routerElements) {
66
+ return buildedNotfoundRoute(new Request({
67
+ ...initializationData,
68
+ ...decodedUrl,
69
+ params: {},
70
+ matchedPath: null,
71
+ }));
72
+ }
73
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
74
+ for (let index = 0; index < routerElements.length; index++) {
75
+ const routerElement = routerElements[index];
76
+ const result = routerElement.pattern.exec(decodedUrl.path);
77
+ if (!result) {
78
+ continue;
79
+ }
80
+ return routerElement.buildedRoute(new Request({
81
+ ...initializationData,
82
+ ...decodedUrl,
83
+ params: result.groups ?? {},
84
+ matchedPath: routerElement.matchedPath,
85
+ }));
86
+ }
87
+ return buildedNotfoundRoute(new Request({
88
+ ...initializationData,
89
+ ...decodedUrl,
90
+ params: {},
91
+ matchedPath: null,
92
+ }));
93
+ },
94
+ hooksRouteLifeCycle,
95
+ routeFunctionBuilders,
96
+ routes,
97
+ stepFunctionBuilders,
98
+ hooksHubLifeCycle,
99
+ };
100
+ }
101
+
102
+ export { RouterBuildError, buildRouter, decodeUrl, pathToRegExp };
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@duplojs/utils');
4
+
5
+ function pathToRegExp(path) {
6
+ return utils.pipe(path, utils.escapeRegExp, utils.S.replace(/\\\/$/g, ""), utils.S.replace(/\\\*/g, ".*"), utils.S.replace(/\\\{([A-zÀ-ÿ0-9_-]+)\\\}/g, "(?<$1>[A-zÀ-ÿ0-9_\\-. ]+)"), (regExp) => new RegExp(`^${regExp}\\/?$`));
7
+ }
8
+
9
+ exports.pathToRegExp = pathToRegExp;
@@ -0,0 +1,2 @@
1
+ import { type RoutePath } from "../route";
2
+ export declare function pathToRegExp(path: RoutePath): RegExp;
@@ -0,0 +1,7 @@
1
+ import { pipe, escapeRegExp, S } from '@duplojs/utils';
2
+
3
+ function pathToRegExp(path) {
4
+ return pipe(path, escapeRegExp, S.replace(/\\\/$/g, ""), S.replace(/\\\*/g, ".*"), S.replace(/\\\{([A-zÀ-ÿ0-9_-]+)\\\}/g, "(?<$1>[A-zÀ-ÿ0-9_\\-. ]+)"), (regExp) => new RegExp(`^${regExp}\\/?$`));
5
+ }
6
+
7
+ export { pathToRegExp };
@@ -0,0 +1,12 @@
1
+ import { type createStepFunctionBuilder, type createRouteFunctionBuilder } from "../../functionsBuilders";
2
+ import { type HookHubLifeCycle } from "../../hub";
3
+ import { type RequestInitializationData } from "../../request";
4
+ import { type HookRouteLifeCycle, type Route, type RouteDefinition } from "../../route";
5
+ export interface BuildedRouter {
6
+ exec(initializationData: Omit<RequestInitializationData, "matchedPath" | "params" | "path" | "query">): Promise<void>;
7
+ readonly routes: readonly Route<RouteDefinition>[];
8
+ readonly hooksRouteLifeCycle: readonly HookRouteLifeCycle[];
9
+ readonly routeFunctionBuilders: readonly ReturnType<typeof createRouteFunctionBuilder>[];
10
+ readonly stepFunctionBuilders: readonly ReturnType<typeof createStepFunctionBuilder>[];
11
+ readonly hooksHubLifeCycle: readonly HookHubLifeCycle[];
12
+ }
@@ -0,0 +1 @@
1
+ export * from "./buildedRouter";
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var kind = require('../kind.cjs');
4
+ var utils = require('@duplojs/utils');
5
+ var kind$1 = require('./kind.cjs');
6
+
7
+ const checkerStepKind = kind.createCoreLibKind("checker-step");
8
+ function createCheckerStep(definition) {
9
+ return utils.pipe({ definition }, checkerStepKind.setTo, kind$1.stepKind.setTo);
10
+ }
11
+
12
+ exports.checkerStepKind = checkerStepKind;
13
+ exports.createCheckerStep = createCheckerStep;
@@ -0,0 +1,19 @@
1
+ import { type Kind } from "@duplojs/utils";
2
+ import { type StepKind } from "./kind";
3
+ import { type Checker } from "../checker";
4
+ import { type Floor } from "../floor";
5
+ import { type ClientErrorResponseCode, type ResponseContract } from "../response";
6
+ export interface CheckerStepDefinition {
7
+ readonly checker: Checker;
8
+ readonly result: string | readonly string[];
9
+ readonly indexing?: string;
10
+ input(input: Floor): unknown;
11
+ readonly options?: Record<string, unknown> | ((input: any) => Record<string, unknown>);
12
+ readonly responseContract: ResponseContract.Contract<ClientErrorResponseCode>;
13
+ }
14
+ export declare const checkerStepKind: import("@duplojs/utils").KindHandler<import("@duplojs/utils").KindDefinition<"@DuplojsHttpCore/checker-step", unknown>>;
15
+ export type _CheckerStep = (Kind<typeof checkerStepKind.definition> & StepKind);
16
+ export interface CheckerStep<GenericDefinition extends CheckerStepDefinition = CheckerStepDefinition> extends _CheckerStep {
17
+ readonly definition: GenericDefinition;
18
+ }
19
+ export declare function createCheckerStep<GenericDefinition extends CheckerStepDefinition>(definition: GenericDefinition): CheckerStep<GenericDefinition>;
@@ -0,0 +1,10 @@
1
+ import { createCoreLibKind } from '../kind.mjs';
2
+ import { pipe } from '@duplojs/utils';
3
+ import { stepKind } from './kind.mjs';
4
+
5
+ const checkerStepKind = createCoreLibKind("checker-step");
6
+ function createCheckerStep(definition) {
7
+ return pipe({ definition }, checkerStepKind.setTo, stepKind.setTo);
8
+ }
9
+
10
+ export { checkerStepKind, createCheckerStep };
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var kind = require('../kind.cjs');
4
+ var utils = require('@duplojs/utils');
5
+ var kind$1 = require('./kind.cjs');
6
+
7
+ const cutStepOutputKind = kind.createCoreLibKind("cut-output");
8
+ const cutStepKind = kind.createCoreLibKind("cut-step");
9
+ function createCutStep(definition) {
10
+ return utils.pipe({ definition }, cutStepKind.setTo, kind$1.stepKind.setTo);
11
+ }
12
+
13
+ exports.createCutStep = createCutStep;
14
+ exports.cutStepKind = cutStepKind;
15
+ exports.cutStepOutputKind = cutStepOutputKind;
@@ -0,0 +1,22 @@
1
+ import { type WrappedValue, type Kind, type MaybePromise, type NeverCoalescing } from "@duplojs/utils";
2
+ import { type StepKind } from "./kind";
3
+ import { type Floor } from "../floor";
4
+ import { type StepFunctionParams } from "./types";
5
+ import { type Response, type ResponseContract } from "../response";
6
+ import { type Request } from "../request";
7
+ export declare const cutStepOutputKind: import("@duplojs/utils").KindHandler<import("@duplojs/utils").KindDefinition<"@DuplojsHttpCore/cut-output", unknown>>;
8
+ export interface CutStepFunctionOutput<GenericData extends Record<string, unknown> = Record<string, unknown>> extends Kind<typeof cutStepOutputKind.definition>, WrappedValue<GenericData> {
9
+ }
10
+ export interface CutStepFunctionParams<GenericRequest extends Request = Request, GenericResponse extends Response = Response> extends StepFunctionParams<GenericRequest, GenericResponse> {
11
+ output<GenericData extends Record<string, unknown> = never>(data?: GenericData): CutStepFunctionOutput<NeverCoalescing<GenericData, {}>>;
12
+ }
13
+ export interface CutStepDefinition {
14
+ theFunction(floor: Floor, params: CutStepFunctionParams): MaybePromise<CutStepFunctionOutput | Response>;
15
+ readonly responseContract: ResponseContract.Contract | readonly ResponseContract.Contract[];
16
+ }
17
+ export declare const cutStepKind: import("@duplojs/utils").KindHandler<import("@duplojs/utils").KindDefinition<"@DuplojsHttpCore/cut-step", unknown>>;
18
+ export type _CutStep = (Kind<typeof cutStepKind.definition> & StepKind);
19
+ export interface CutStep<GenericDefinition extends CutStepDefinition = CutStepDefinition> extends _CutStep {
20
+ definition: GenericDefinition;
21
+ }
22
+ export declare function createCutStep<GenericDefinition extends CutStepDefinition>(definition: GenericDefinition): CutStep<GenericDefinition>;
@@ -0,0 +1,11 @@
1
+ import { createCoreLibKind } from '../kind.mjs';
2
+ import { pipe } from '@duplojs/utils';
3
+ import { stepKind } from './kind.mjs';
4
+
5
+ const cutStepOutputKind = createCoreLibKind("cut-output");
6
+ const cutStepKind = createCoreLibKind("cut-step");
7
+ function createCutStep(definition) {
8
+ return pipe({ definition }, cutStepKind.setTo, stepKind.setTo);
9
+ }
10
+
11
+ export { createCutStep, cutStepKind, cutStepOutputKind };
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var kind = require('../kind.cjs');
4
+ var utils = require('@duplojs/utils');
5
+ var kind$1 = require('./kind.cjs');
6
+
7
+ const extractStepKind = kind.createCoreLibKind("extract-step");
8
+ function createExtractStep(definition) {
9
+ return utils.pipe({ definition }, extractStepKind.setTo, kind$1.stepKind.setTo);
10
+ }
11
+
12
+ exports.createExtractStep = createExtractStep;
13
+ exports.extractStepKind = extractStepKind;
@@ -0,0 +1,18 @@
1
+ import { type DP, type Kind, type O, type AnyFunction } from "@duplojs/utils";
2
+ import { type StepKind } from "./kind";
3
+ import { type Request } from "../request";
4
+ import { type ClientErrorResponseCode, type ResponseContract } from "../response";
5
+ export interface DisabledExtractKeysCustom {
6
+ }
7
+ export type DisabledExtractKeys = O.GetPropsWithValue<DisabledExtractKeysCustom, true>;
8
+ export type ExtractShape<GenericRequest extends Request = Request> = Partial<Record<Exclude<keyof GenericRequest, O.GetPropsWithValueExtends<GenericRequest, AnyFunction> | DisabledExtractKeys>, DP.DataParser | Record<string, DP.DataParser>>>;
9
+ export interface ExtractStepDefinition {
10
+ readonly shape: ExtractShape;
11
+ readonly responseContract?: ResponseContract.Contract<ClientErrorResponseCode, string, DP.DataParserEmpty>;
12
+ }
13
+ export declare const extractStepKind: import("@duplojs/utils").KindHandler<import("@duplojs/utils").KindDefinition<"@DuplojsHttpCore/extract-step", unknown>>;
14
+ export type _ExtractStep = (Kind<typeof extractStepKind.definition> & StepKind);
15
+ export interface ExtractStep<GenericDefinition extends ExtractStepDefinition = ExtractStepDefinition> extends _ExtractStep {
16
+ readonly definition: GenericDefinition;
17
+ }
18
+ export declare function createExtractStep<GenericDefinition extends ExtractStepDefinition>(definition: GenericDefinition): ExtractStep<GenericDefinition>;
@@ -0,0 +1,10 @@
1
+ import { createCoreLibKind } from '../kind.mjs';
2
+ import { pipe } from '@duplojs/utils';
3
+ import { stepKind } from './kind.mjs';
4
+
5
+ const extractStepKind = createCoreLibKind("extract-step");
6
+ function createExtractStep(definition) {
7
+ return pipe({ definition }, extractStepKind.setTo, stepKind.setTo);
8
+ }
9
+
10
+ export { createExtractStep, extractStepKind };