Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
1 change: 1 addition & 0 deletions scripts/core/functionsBuilders/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from "./route";
export * from "./steps";
export * from "./router";
7 changes: 5 additions & 2 deletions scripts/core/functionsBuilders/route/build.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { E, G, unwrap } from "@duplojs/utils";
import { buildStepFunction, type BuildStepFunctionParams } from "../steps";
import { buildStepFunction, type createStepFunctionBuilder } from "../steps";
import { type RouteFunctionBuilderParams, type BuildRouteNotSupportEither, type createRouteFunctionBuilder } from "./create";
import { type HookRouteLifeCycle, type Route } from "@core/route";
import { type ResponseContract } from "@core/response";
import { type Environment } from "@core/types";

export interface BuildRouteFunctionParams extends BuildStepFunctionParams {
export interface BuildRouteFunctionParams {
readonly routeFunctionBuilders: readonly ReturnType<typeof createRouteFunctionBuilder>[];
readonly globalHooksRouteLifeCycle: readonly HookRouteLifeCycle[];
readonly stepFunctionBuilders: readonly ReturnType<typeof createStepFunctionBuilder>[];
readonly environment: Environment;
readonly defaultExtractContract: ResponseContract.Contract;
}

Expand Down
11 changes: 3 additions & 8 deletions scripts/core/functionsBuilders/route/create.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
import { E, type MaybePromise } from "@duplojs/utils";
import { type HookRouteLifeCycle, type Route } from "@core/route";
import { type Request } from "@core/request";
import { type BuildedRoute, type HookRouteLifeCycle, type Route } from "@core/route";
import { type Environment } from "@core/types";
import { type BuildStepSuccessEither, type BuildStepNotSupportEither } from "../steps";
import { type Steps } from "@core/steps";
import { type ResponseContract } from "@core/response";

export type BuildedRouteFunction = (
request: Request,
) => Promise<void>;

export type BuildRouteSuccessEither<
> = E.Right<"buildSuccess", BuildedRouteFunction>;
> = E.Right<"buildSuccess", BuildedRoute>;

export type BuildRouteNotSupportEither = E.Left<"routeNotSupport", Route>;

Expand All @@ -28,7 +23,7 @@ export interface RouteFunctionBuilderParams {
>;

success(
result: BuildedRouteFunction
result: BuildedRoute
): BuildRouteSuccessEither;

readonly defaultExtractContract: ResponseContract.Contract;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import { A, E, forward, isType, pipe } from "@duplojs/utils";
import { HookResponse, Response } from "@core/response";
import { type Request } from "@core/request";
import { buildHookAfter, buildHookBefore, buildHookErrorBefore, createHookResponse, exitHookFunction, nextHookFunction } from "./hook";
import { createRouteFunctionBuilder } from "./create";
import { buildStepsFunction } from "../steps";
import { createRouteFunctionBuilder } from "../create";
import { buildStepsFunction } from "../../steps";

export * from "./hook";

export const defaultRouteFunctionBuilder = createRouteFunctionBuilder(
routeKind.has,
Expand Down
1 change: 0 additions & 1 deletion scripts/core/functionsBuilders/route/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export * from "./build";
export * from "./create";
export * from "./default";
export * from "./hook";
23 changes: 23 additions & 0 deletions scripts/core/functionsBuilders/router/build.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { type Environment } from "@core/types";
import { type createRouterFunctionBuilder } from "./create";
import { type Request } from "@core/request";
import { type RouterElementWrapper } from "@core/router/types/routerElementWrapper";
import { type RouterElementSystem } from "@core/router/types/routerElementSystem";

export interface BuildRouterFunctionParams {
readonly routerFunctionBuilder: ReturnType<typeof createRouterFunctionBuilder>;
readonly environment: Environment;
readonly routerElementWrapper: RouterElementWrapper;
readonly classRequest: typeof Request;
readonly notfoundRouterElement: RouterElementSystem;
readonly malformedUrlRouterElement: RouterElementSystem;
}

export async function buildRouterFunction(
{
routerFunctionBuilder,
...params
}: BuildRouterFunctionParams,
) {
return routerFunctionBuilder(params);
}
24 changes: 24 additions & 0 deletions scripts/core/functionsBuilders/router/create.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { type Request } from "@core/request";
import { type BuildedRouter } from "@core/router";
import { type RouterElementSystem } from "@core/router/types/routerElementSystem";
import { type RouterElementWrapper } from "@core/router/types/routerElementWrapper";
import { type Environment } from "@core/types";
import { type MaybePromise } from "bun";

export interface RouterFunctionBuilderParams {
readonly environment: Environment;
readonly routerElementWrapper: RouterElementWrapper;
readonly classRequest: typeof Request;
readonly notfoundRouterElement: RouterElementSystem;
readonly malformedUrlRouterElement: RouterElementSystem;
}

export type RouterFunctionBuilder = (
params: RouterFunctionBuilderParams
) => MaybePromise<BuildedRouter>;

export function createRouterFunctionBuilder(
theFunction: RouterFunctionBuilder,
) {
return theFunction;
}
69 changes: 69 additions & 0 deletions scripts/core/functionsBuilders/router/default/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { decodeUrl } from "@core/decodeUrl";
import { createRouterFunctionBuilder } from "../create";

export const defaultRouterFunctionBuilder = createRouterFunctionBuilder(
({
routerElementWrapper,
malformedUrlRouterElement,
notfoundRouterElement,
classRequest,
}) => (initializationData) => {
const routerElements = routerElementWrapper[initializationData.method];
const decodedUrl = decodeUrl(initializationData.url);

if (!decodedUrl) {
return malformedUrlRouterElement.buildedRoute(
new classRequest({
...initializationData,
params: {},
path: "",
query: {},
matchedPath: null,
bodyReader: malformedUrlRouterElement.bodyReader,
}),
);
}

if (!routerElements) {
return notfoundRouterElement.buildedRoute(
new classRequest({
...initializationData,
...decodedUrl,
params: {},
matchedPath: null,
bodyReader: notfoundRouterElement.bodyReader,
}),
);
}

// eslint-disable-next-line @typescript-eslint/prefer-for-of
for (let index = 0; index < routerElements.length; index++) {
const routerElement = routerElements[index]!;
const result = routerElement.pattern.exec(decodedUrl.path);

if (!result) {
continue;
}

return routerElement.buildedRoute(
new classRequest({
...initializationData,
...decodedUrl,
params: result.groups ?? {},
matchedPath: routerElement.matchedPath,
bodyReader: routerElement.bodyReader,
}),
);
}

return notfoundRouterElement.buildedRoute(
new classRequest({
...initializationData,
...decodedUrl,
params: {},
matchedPath: null,
bodyReader: notfoundRouterElement.bodyReader,
}),
);
},
);
3 changes: 3 additions & 0 deletions scripts/core/functionsBuilders/router/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from "./create";
export * from "./default";
export * from "./build";
2 changes: 0 additions & 2 deletions scripts/core/functionsBuilders/steps/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ import { type ResponseContract } from "@core/response";

export interface BuildStepFunctionParams {
readonly stepFunctionBuilders: readonly ReturnType<typeof createStepFunctionBuilder>[];

readonly environment: Environment;

readonly defaultExtractContract: ResponseContract.Contract;
}

Expand Down
13 changes: 3 additions & 10 deletions scripts/core/functionsBuilders/steps/create.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,11 @@
import { E, type MaybePromise } from "@duplojs/utils";
import { type Steps } from "../../steps/types";
import { type Floor } from "@core/floor";
import { type BuildedStep, type Steps } from "../../steps/types";
import { type HookRouteLifeCycle } from "@core/route";
import { type Request } from "@core/request";
import { type ResponseContract, type Response } from "@core/response";
import { type ResponseContract } from "@core/response";
import { type Environment } from "@core/types";

export type BuildedStepFunction = (
request: Request,
floor: Floor
) => MaybePromise<Floor | Response>;

export interface BuildStepResult {
readonly buildedFunction: BuildedStepFunction;
readonly buildedFunction: BuildedStep;
readonly hooksRouteLifeCycle: readonly HookRouteLifeCycle[];
}

Expand Down
4 changes: 2 additions & 2 deletions scripts/core/hub/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { type Route } from "@core/route";
import { type EscapeVoid, G, type Kind, type MaybePromise } from "@duplojs/utils";
import { type Hub } from ".";
import { createCoreLibKind } from "@core/kind";
import { type RouterInitializationData } from "@core/router";
import { type RouterParams } from "@core/router";
import { type HttpServerParams } from "@core/types";

export const hookServerExitKind = createCoreLibKind("server-hook-exit");
Expand Down Expand Up @@ -65,7 +65,7 @@ export interface HttpServerErrorParams {
readonly error: unknown;
next(): ServerHookNext;
exit(): ServerHookExit;
routerInitializationData: RouterInitializationData;
routerInitializationData: RouterParams;
}

export type HookServerError = (
Expand Down
10 changes: 10 additions & 0 deletions scripts/core/hub/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { type createRouteFunctionBuilder } from "@core/functionsBuilders/route";
import { defaultBodyController } from "./defaultBodyController";
import { defaultMalformedUrlHandler } from "./defaultMalformedUrlHandler";
import { defaultEmptyReaderImplementation } from "./defaultEmptyReaderImplementation";
import { type createRouterFunctionBuilder } from "@core/functionsBuilders/router";

export * from "./hooks";
export * from "./defaultNotfoundHandler";
Expand Down Expand Up @@ -51,6 +52,8 @@ export class Hub<

public routes = new Set<Route>();

public routerFunctionBuilder: ReturnType<typeof createRouterFunctionBuilder> | undefined = undefined;

public routeFunctionBuilders: ReturnType<typeof createRouteFunctionBuilder>[] = [];

public stepFunctionBuilders: ReturnType<typeof createStepFunctionBuilder>[] = [];
Expand Down Expand Up @@ -97,6 +100,13 @@ export class Hub<
return this;
}

public setRouterFunctionBuilder(
functionBuilder: ReturnType<typeof createRouterFunctionBuilder>,
) {
this.routerFunctionBuilder = functionBuilder;
return this;
}

public addRouteFunctionBuilder(
functionBuilder: MaybeArray<ReturnType<typeof createRouteFunctionBuilder>>,
) {
Expand Down
9 changes: 4 additions & 5 deletions scripts/core/implementHttpServer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

import { type Hub, launchHookServer, launchHookServerError, serverErrorExitHookFunction, serverErrorNextHookFunction } from "./hub";
import { buildRouter, type RouterInitializationData } from "./router";
import { createRouter, type RouterParams } from "./router";
import { type AnyTuple, forward, type MaybePromise } from "@duplojs/utils";
import { type HttpServerParams } from "./types";
import { type HookRouteLifeCycle } from "./route";
Expand All @@ -18,10 +17,10 @@ export interface ImplementHttpServerParams {
}

export type ExecRouteSystem = (
routerInitializationData: RouterInitializationData,
routerInitializationData: RouterParams,
whenUncaughtError: (
error: unknown,
routerInitializationData: RouterInitializationData
routerInitializationData: RouterParams
) => MaybePromise<void>
) => Promise<void>;

Expand All @@ -47,7 +46,7 @@ export async function implementHttpServer<
...params.getInterfaceHooks(params),
]);

const router = await buildRouter(
const router = await createRouter(
params.hub,
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ import { buildRouteFunction, type BuildRouteFunctionParams } from "@core/functio
import { controlBodyAsEmpty } from "@core/request";
import { createRoute } from "@core/route";
import { RouterBuildError } from "./buildError";
import { defaultEmptyReaderImplementation } from "@core/hub/defaultEmptyReaderImplementation";
import { defaultEmptyReaderImplementation } from "@core/hub";
import { type HandlerStep } from "@core/steps";
import { type RouterElementSystem } from "./types";

interface BuildSystemRouteParams {
interface CreateRouterElementSystemParams {
handlerStep: HandlerStep;
buildParams: BuildRouteFunctionParams;
}

export async function buildSystemRoute(params: BuildSystemRouteParams) {
export async function createRouterElementSystem(params: CreateRouterElementSystemParams): Promise<RouterElementSystem> {
const bodyController = controlBodyAsEmpty();
const bodyReader = bodyController.createReaderOrThrow(
defaultEmptyReaderImplementation,
Expand Down
Loading
Loading