From 07d93176bbd373d0f078b0f165514674f8674bea Mon Sep 17 00:00:00 2001 From: mathcovax Date: Tue, 10 Feb 2026 18:07:34 +0000 Subject: [PATCH 01/10] feat(15): add body extractor and Received body --- integration/client/index.test.ts | 2 +- integration/core/routes/document.ts | 26 ++ integration/core/routes/index.ts | 1 + integration/files/fakeFiles/1mb.jpg | Bin 0 -> 1000000 bytes integration/files/fakeFiles/2mb.jpg | Bin 0 -> 2000000 bytes integration/files/store/.gitkeep | 0 integration/files/upload/.gitkeep | 0 integration/node/file.test.ts | 41 ++++ integration/node/tsconfig.json | 3 +- integration/node/utils/createFileToSend.ts | 11 + integration/node/utils/index.ts | 1 + package-lock.json | 31 ++- package.json | 7 +- scripts/core/builders/process/extract.ts | 14 +- scripts/core/builders/route/extract.ts | 14 +- scripts/core/clean/newType.ts | 3 +- scripts/core/clean/primitive.ts | 5 +- scripts/core/defaultHooks/index.ts | 56 +++++ .../core/functionsBuilders/route/default.ts | 22 +- .../steps/defaults/extractStep.ts | 131 ++++++---- scripts/core/hub/hooks.ts | 5 +- scripts/core/implementHttpServer.ts | 9 +- scripts/core/index.ts | 1 + scripts/core/steps/extract/bodyExtractor.ts | 87 +++++++ scripts/core/steps/extract/formData.ts | 43 ++++ .../steps/{extract.ts => extract/index.ts} | 18 +- scripts/core/steps/extract/receivedBody.ts | 72 ++++++ scripts/core/steps/extract/text.ts | 42 ++++ scripts/core/types/hosts.ts | 8 + scripts/core/types/httpServerParams.ts | 12 + scripts/core/types/index.ts | 2 + scripts/interfaces/node/createHttpServer.ts | 24 +- scripts/interfaces/node/hooks.ts | 172 ------------- .../interfaces/node/hooks/formData/error.ts | 14 ++ .../interfaces/node/hooks/formData/index.ts | 117 +++++++++ .../hooks/formData/readRequestFormData.ts | 228 ++++++++++++++++++ scripts/interfaces/node/hooks/index.ts | 112 +++++++++ scripts/interfaces/node/hooks/text/index.ts | 30 +++ .../node/hooks/text/readRequestText.ts | 51 ++++ scripts/interfaces/node/types/host.ts | 18 -- .../codeGenerator/aggregateStepContract.ts | 12 +- scripts/plugins/codeGenerator/plugin.ts | 9 +- .../openApiGenerator/aggregateStepContract.ts | 12 +- scripts/plugins/openApiGenerator/plugin.ts | 9 +- .../index.test.ts} | 0 .../{hooks.test.ts => hooks/index.test.ts} | 0 tests/plugins/codeGenerator/plugin.test.ts | 24 +- tests/plugins/openApiGenerator/plugin.test.ts | 38 ++- 48 files changed, 1202 insertions(+), 335 deletions(-) create mode 100644 integration/core/routes/document.ts create mode 100644 integration/files/fakeFiles/1mb.jpg create mode 100644 integration/files/fakeFiles/2mb.jpg create mode 100644 integration/files/store/.gitkeep create mode 100644 integration/files/upload/.gitkeep create mode 100644 integration/node/file.test.ts create mode 100644 integration/node/utils/createFileToSend.ts create mode 100644 integration/node/utils/index.ts create mode 100644 scripts/core/defaultHooks/index.ts create mode 100644 scripts/core/steps/extract/bodyExtractor.ts create mode 100644 scripts/core/steps/extract/formData.ts rename scripts/core/steps/{extract.ts => extract/index.ts} (83%) create mode 100644 scripts/core/steps/extract/receivedBody.ts create mode 100644 scripts/core/steps/extract/text.ts create mode 100644 scripts/core/types/hosts.ts create mode 100644 scripts/core/types/httpServerParams.ts delete mode 100644 scripts/interfaces/node/hooks.ts create mode 100644 scripts/interfaces/node/hooks/formData/error.ts create mode 100644 scripts/interfaces/node/hooks/formData/index.ts create mode 100644 scripts/interfaces/node/hooks/formData/readRequestFormData.ts create mode 100644 scripts/interfaces/node/hooks/index.ts create mode 100644 scripts/interfaces/node/hooks/text/index.ts create mode 100644 scripts/interfaces/node/hooks/text/readRequestText.ts delete mode 100644 scripts/interfaces/node/types/host.ts rename tests/core/steps/{extract.test.ts => extract/index.test.ts} (100%) rename tests/interfaces/node/{hooks.test.ts => hooks/index.test.ts} (100%) diff --git a/integration/client/index.test.ts b/integration/client/index.test.ts index 446c247..7f95717 100644 --- a/integration/client/index.test.ts +++ b/integration/client/index.test.ts @@ -131,7 +131,7 @@ describe("node server", async() => { ); }); - it("port user", async() => { + it("post user", async() => { const result = await httpClient.post("/users", { body: { id: 5, diff --git a/integration/core/routes/document.ts b/integration/core/routes/document.ts new file mode 100644 index 0000000..1eee90c --- /dev/null +++ b/integration/core/routes/document.ts @@ -0,0 +1,26 @@ +import { asFormData, ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { SDPE } from "@duplojs/server-utils"; +import { asserts, E } from "@duplojs/utils"; + +useRouteBuilder("POST", "/documents") + .extract({ + body: asFormData( + { + myFile: SDPE.file(), + }, + { + maxFileQuantity: 10, + }, + ), + }) + .handler( + ResponseContract.noContent("file.receive"), + async({ body }, { response }) => { + asserts( + await body.myFile.move("files/store"), + E.isRight, + ); + + return response("file.receive"); + }, + ); diff --git a/integration/core/routes/index.ts b/integration/core/routes/index.ts index 50fcd1e..dd9f685 100644 --- a/integration/core/routes/index.ts +++ b/integration/core/routes/index.ts @@ -1 +1,2 @@ import "./users"; +import "./document"; diff --git a/integration/files/fakeFiles/1mb.jpg b/integration/files/fakeFiles/1mb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5632653eca1926993c8db3730e673120b20b749 GIT binary patch literal 1000000 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