@tsed/platform-http 8.6.0 → 8.7.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 (45) hide show
  1. package/lib/esm/common/decorators/multer/multerFileSize.js +4 -5
  2. package/lib/esm/common/decorators/multer/multerFileSize.js.map +1 -1
  3. package/lib/esm/common/decorators/multer/multerOptions.js +4 -9
  4. package/lib/esm/common/decorators/multer/multerOptions.js.map +1 -1
  5. package/lib/esm/common/decorators/multer/multipartFile.js +4 -30
  6. package/lib/esm/common/decorators/multer/multipartFile.js.map +1 -1
  7. package/lib/esm/common/index.js +0 -1
  8. package/lib/esm/common/index.js.map +1 -1
  9. package/lib/esm/common/middlewares/PlatformAcceptMimesMiddleware.js +7 -0
  10. package/lib/esm/common/middlewares/PlatformAcceptMimesMiddleware.js.map +1 -1
  11. package/lib/esm/common/middlewares/PlatformMulterMiddleware.js +3 -50
  12. package/lib/esm/common/middlewares/PlatformMulterMiddleware.js.map +1 -1
  13. package/lib/esm/common/services/PlatformAdapter.js +8 -0
  14. package/lib/esm/common/services/PlatformAdapter.js.map +1 -1
  15. package/lib/esm/common/services/PlatformHandler.js +2 -3
  16. package/lib/esm/common/services/PlatformHandler.js.map +1 -1
  17. package/lib/types/common/config/interfaces/PlatformMulterSettings.d.ts +17 -14
  18. package/lib/types/common/decorators/multer/multerFileSize.d.ts +4 -2
  19. package/lib/types/common/decorators/multer/multerOptions.d.ts +4 -3
  20. package/lib/types/common/decorators/multer/multipartFile.d.ts +6 -4
  21. package/lib/types/common/index.d.ts +0 -1
  22. package/lib/types/common/middlewares/PlatformAcceptMimesMiddleware.d.ts +8 -1
  23. package/lib/types/common/middlewares/PlatformMulterMiddleware.d.ts +3 -19
  24. package/lib/types/common/services/PlatformAdapter.d.ts +3 -2
  25. package/lib/types/common/services/PlatformHandler.d.ts +0 -2
  26. package/package.json +19 -18
  27. package/src/common/config/interfaces/PlatformMulterSettings.ts +22 -21
  28. package/src/common/decorators/multer/multerFileSize.ts +4 -5
  29. package/src/common/decorators/multer/multerOptions.ts +4 -12
  30. package/src/common/decorators/multer/multipartFile.ts +6 -43
  31. package/src/common/index.ts +0 -1
  32. package/src/common/middlewares/PlatformAcceptMimesMiddleware.ts +11 -1
  33. package/src/common/middlewares/PlatformMulterMiddleware.ts +3 -59
  34. package/src/common/services/PlatformAdapter.ts +5 -2
  35. package/src/common/services/PlatformHandler.ts +2 -3
  36. package/vitest.config.mts +4 -4
  37. package/lib/esm/common/services/PlatformMiddlewaresChain.js +0 -43
  38. package/lib/esm/common/services/PlatformMiddlewaresChain.js.map +0 -1
  39. package/lib/types/common/services/PlatformMiddlewaresChain.d.ts +0 -13
  40. package/src/common/decorators/multer/multerFileSize.spec.ts +0 -22
  41. package/src/common/decorators/multer/multerOptions.spec.ts +0 -21
  42. package/src/common/decorators/multer/multipartFile.spec.ts +0 -259
  43. package/src/common/middlewares/PlatformMulterMiddleware.spec.ts +0 -95
  44. package/src/common/services/PlatformMiddlewaresChain.spec.ts +0 -96
  45. package/src/common/services/PlatformMiddlewaresChain.ts +0 -53
@@ -1,95 +0,0 @@
1
- import {catchAsyncError} from "@tsed/core";
2
- import {inject} from "@tsed/di";
3
- import {Exception} from "@tsed/exceptions";
4
- import {MulterError} from "multer";
5
-
6
- import {PlatformTest} from "../../testing/PlatformTest.js";
7
- import {MulterOptions} from "../decorators/multer/multerOptions.js";
8
- import {MultipartFile} from "../decorators/multer/multipartFile.js";
9
- import {EndpointMetadata} from "../domain/EndpointMetadata.js";
10
- import {PlatformAdapter} from "../services/PlatformAdapter.js";
11
- import {PlatformApplication} from "../services/PlatformApplication.js";
12
- import {PlatformMulterMiddleware} from "./PlatformMulterMiddleware.js";
13
-
14
- async function build(options = {}) {
15
- class Test {
16
- @MulterOptions(options)
17
- upload(@MultipartFile("file1") file1: any) {}
18
- }
19
-
20
- const multerMiddleware = vi.fn();
21
- const multer = {
22
- fields: vi.fn().mockReturnValue(multerMiddleware)
23
- };
24
-
25
- const middleware = inject(PlatformMulterMiddleware);
26
- const ctx: any = PlatformTest.createRequestContext();
27
- ctx.endpoint = EndpointMetadata.get(Test, "upload");
28
-
29
- const adapter = inject(PlatformAdapter);
30
-
31
- vi.spyOn(adapter, "multipart").mockReturnValue(multer as any);
32
-
33
- return {middleware, ctx, multer, adapter, multerMiddleware};
34
- }
35
-
36
- describe("PlatformMulterMiddleware", () => {
37
- beforeEach(() =>
38
- PlatformTest.create({
39
- multer: {
40
- dest: "/dest"
41
- }
42
- })
43
- );
44
- afterEach(() => PlatformTest.reset());
45
- it("should create middleware", async () => {
46
- const {middleware, ctx, multer, adapter, multerMiddleware} = await build({});
47
-
48
- await middleware.use(ctx);
49
-
50
- expect(adapter.multipart).toHaveBeenCalledWith({
51
- dest: "/dest"
52
- });
53
- expect(multer.fields).toHaveBeenCalledWith([{maxCount: undefined, name: "file1"}]);
54
- expect(multerMiddleware).toHaveBeenCalledWith(ctx.request.raw, ctx.response.raw);
55
- });
56
- it("should create middleware with storage", async () => {
57
- const {middleware, ctx, multer, adapter, multerMiddleware} = await build({
58
- storage: "storage"
59
- });
60
-
61
- await middleware.use(ctx);
62
-
63
- expect(adapter.multipart).toHaveBeenCalledWith({
64
- storage: "storage"
65
- });
66
- expect(multer.fields).toHaveBeenCalledWith([{maxCount: undefined, name: "file1"}]);
67
- expect(multerMiddleware).toHaveBeenCalledWith(ctx.request.raw, ctx.response.raw);
68
- });
69
- it("should catch error with code", async () => {
70
- const {middleware, ctx, multerMiddleware} = await build();
71
- const error = new MulterError("LIMIT_FILE_SIZE", "field");
72
-
73
- multerMiddleware.mockRejectedValue(error);
74
-
75
- const actualError: any | undefined = await catchAsyncError(() => middleware.use(ctx));
76
-
77
- expect(actualError).toBeInstanceOf(Exception);
78
- expect(actualError?.message).toEqual("File too large");
79
- expect(actualError?.status).toEqual(400);
80
- });
81
- it("should throw error without code", async () => {
82
- const {middleware, ctx, multerMiddleware} = await build();
83
-
84
- multerMiddleware.mockRejectedValue(new Error("test"));
85
-
86
- let actualError: any;
87
- try {
88
- await middleware.use(ctx);
89
- } catch (er) {
90
- actualError = er;
91
- }
92
-
93
- expect(actualError.message).toEqual("test");
94
- });
95
- });
@@ -1,96 +0,0 @@
1
- import {Controller, ControllerProvider} from "@tsed/di";
2
- import {Middleware, Use, UseAuth} from "@tsed/platform-middlewares";
3
- import {AcceptMime, All, EndpointMetadata, Get, getOperationsRoutes, Post} from "@tsed/schema";
4
-
5
- import {PlatformTest} from "../../testing/PlatformTest.js";
6
- import {MultipartFile} from "../decorators/multer/multipartFile.js";
7
- import {PlatformAcceptMimesMiddleware} from "../middlewares/PlatformAcceptMimesMiddleware.js";
8
- import {PlatformMulterMiddleware} from "../middlewares/PlatformMulterMiddleware.js";
9
- import {PlatformMiddlewaresChain} from "./PlatformMiddlewaresChain.js";
10
-
11
- @Middleware()
12
- class MyAuthMiddleware {
13
- use() {}
14
- }
15
-
16
- @Middleware({
17
- priority: -1
18
- })
19
- class TokenMiddleware {
20
- use() {}
21
- }
22
-
23
- @Controller("/")
24
- class TestCtrl {
25
- @All("/")
26
- allMethod() {}
27
-
28
- @Get("/")
29
- getMethod() {}
30
-
31
- @Use("/")
32
- use() {}
33
-
34
- @Use()
35
- use2() {}
36
-
37
- @Post("/file")
38
- @UseAuth(MyAuthMiddleware, {scope: "admin"})
39
- @Use(TokenMiddleware)
40
- @AcceptMime("application/json")
41
- authEndpoint(@MultipartFile("file") file: MultipartFile) {}
42
- }
43
-
44
- function parentControllerBefore() {}
45
-
46
- function getFixture() {
47
- const provider = PlatformTest.injector.getProvider<ControllerProvider>(TestCtrl)!;
48
- const platformMiddlewaresChain = PlatformTest.get<PlatformMiddlewaresChain>(PlatformMiddlewaresChain);
49
- const operationRoutes = getOperationsRoutes<EndpointMetadata>(provider.token);
50
- return {platformMiddlewaresChain, operationRoutes, provider};
51
- }
52
-
53
- describe("PlatformMiddlewaresChain", () => {
54
- beforeEach(() => PlatformTest.create());
55
- afterEach(() => PlatformTest.reset());
56
-
57
- it("should return the middlewares for a given endpoint (getMethod)", () => {
58
- const {platformMiddlewaresChain, operationRoutes} = getFixture();
59
- const parentsMiddlewares = {
60
- before: [parentControllerBefore]
61
- };
62
-
63
- const chain = platformMiddlewaresChain.get(parentsMiddlewares as any, operationRoutes[1]);
64
-
65
- expect(chain.before[0]).toEqual(parentControllerBefore);
66
- });
67
- it("should return the middlewares for a given endpoint (allMethod)", () => {
68
- const {platformMiddlewaresChain, operationRoutes} = getFixture();
69
-
70
- const parentsMiddlewares: any = {
71
- before: [parentControllerBefore]
72
- };
73
-
74
- const chain = platformMiddlewaresChain.get(parentsMiddlewares, operationRoutes[1]);
75
-
76
- expect(chain.before[0]).toEqual(parentControllerBefore);
77
- });
78
-
79
- it("should merge middlewares and sort middleware by priority", () => {
80
- const {platformMiddlewaresChain, operationRoutes} = getFixture();
81
-
82
- const parentsMiddlewares: any = {
83
- before: [parentControllerBefore, MyAuthMiddleware, TokenMiddleware]
84
- };
85
-
86
- const chain = platformMiddlewaresChain.get(parentsMiddlewares, operationRoutes[3]);
87
-
88
- expect(chain.before).toEqual([
89
- PlatformAcceptMimesMiddleware,
90
- parentControllerBefore,
91
- MyAuthMiddleware,
92
- TokenMiddleware,
93
- PlatformMulterMiddleware
94
- ]);
95
- });
96
- });
@@ -1,53 +0,0 @@
1
- import {isClass} from "@tsed/core";
2
- import {constant, injectable} from "@tsed/di";
3
- import {ParamTypes} from "@tsed/platform-params";
4
- import {AlterEndpointHandlersArg} from "@tsed/platform-router";
5
- import {JsonEntityStore, JsonOperationRoute} from "@tsed/schema";
6
-
7
- import {PlatformAcceptMimesMiddleware} from "../middlewares/PlatformAcceptMimesMiddleware.js";
8
- import {PlatformMulterMiddleware} from "../middlewares/PlatformMulterMiddleware.js";
9
-
10
- export class PlatformMiddlewaresChain {
11
- protected acceptMimes = constant<string[]>("acceptMimes", []);
12
-
13
- get(handlers: AlterEndpointHandlersArg, operationRoute: JsonOperationRoute): AlterEndpointHandlersArg {
14
- const {ACCEPT_MIMES, FILE} = this.getParamTypes(handlers, operationRoute);
15
-
16
- return {
17
- ...handlers,
18
- before: [ACCEPT_MIMES && PlatformAcceptMimesMiddleware, ...handlers.before, FILE && PlatformMulterMiddleware].filter(Boolean) as any[]
19
- };
20
- }
21
-
22
- protected hasAcceptMimes(operationRoute: JsonOperationRoute) {
23
- return operationRoute.endpoint.acceptMimes.length || this.acceptMimes.length;
24
- }
25
-
26
- protected getParamTypes(middlewares: AlterEndpointHandlersArg, operationRoute: JsonOperationRoute) {
27
- return middlewares.before
28
- .concat(middlewares.after)
29
- .filter(isClass)
30
- .reduce(
31
- (paramTypes, token) => {
32
- const entity = JsonEntityStore.fromMethod(token, "use");
33
-
34
- if (entity.decoratorType === "method") {
35
- const {FILE, RAW_BODY, BODY} = entity.getParamTypes();
36
- paramTypes.FILE = paramTypes.FILE || FILE;
37
- paramTypes.RAW_BODY = paramTypes.RAW_BODY || RAW_BODY;
38
- paramTypes.BODY = paramTypes.BODY || BODY;
39
- }
40
-
41
- return paramTypes;
42
- },
43
- {
44
- ACCEPT_MIMES: this.hasAcceptMimes(operationRoute),
45
- FILE: operationRoute.has(ParamTypes.FILES),
46
- RAW_BODY: operationRoute.has(ParamTypes.RAW_BODY),
47
- BODY: operationRoute.has(ParamTypes.BODY) || operationRoute.method === "ALL"
48
- }
49
- );
50
- }
51
- }
52
-
53
- injectable(PlatformMiddlewaresChain);