@tsed/platform-serverless 8.11.1 → 8.11.2-rc.1
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.
- package/lib/esm/builder/PlatformServerless.js +0 -1
- package/lib/esm/builder/PlatformServerlessHandler.js +0 -1
- package/lib/esm/domain/ServerlessContext.js +0 -1
- package/lib/esm/domain/ServerlessEvent.js +0 -1
- package/lib/esm/domain/ServerlessRequest.js +0 -1
- package/lib/esm/domain/ServerlessResponse.js +0 -1
- package/lib/esm/domain/ServerlessResponseStream.js +0 -1
- package/lib/esm/exports.js +0 -1
- package/lib/esm/index.js +0 -1
- package/lib/esm/utils/getRequestId.js +0 -1
- package/lib/esm/utils/isInAWS.js +0 -1
- package/lib/esm/utils/setResponseHeaders.js +0 -1
- package/package.json +16 -13
- package/lib/esm/builder/PlatformServerless.js.map +0 -1
- package/lib/esm/builder/PlatformServerlessHandler.js.map +0 -1
- package/lib/esm/domain/ServerlessContext.js.map +0 -1
- package/lib/esm/domain/ServerlessEvent.js.map +0 -1
- package/lib/esm/domain/ServerlessRequest.js.map +0 -1
- package/lib/esm/domain/ServerlessResponse.js.map +0 -1
- package/lib/esm/domain/ServerlessResponseStream.js.map +0 -1
- package/lib/esm/exports.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/utils/getRequestId.js.map +0 -1
- package/lib/esm/utils/isInAWS.js.map +0 -1
- package/lib/esm/utils/setResponseHeaders.js.map +0 -1
- package/src/builder/PlatformServerless.spec.ts +0 -219
- package/src/builder/PlatformServerless.ts +0 -202
- package/src/builder/PlatformServerlessHandler.spec.ts +0 -145
- package/src/builder/PlatformServerlessHandler.ts +0 -121
- package/src/domain/ServerlessContext.spec.ts +0 -106
- package/src/domain/ServerlessContext.ts +0 -60
- package/src/domain/ServerlessEvent.ts +0 -24
- package/src/domain/ServerlessRequest.spec.ts +0 -130
- package/src/domain/ServerlessRequest.ts +0 -106
- package/src/domain/ServerlessResponse.spec.ts +0 -139
- package/src/domain/ServerlessResponse.ts +0 -226
- package/src/domain/ServerlessResponseStream.spec.ts +0 -63
- package/src/domain/ServerlessResponseStream.ts +0 -113
- package/src/exports.ts +0 -1
- package/src/index.ts +0 -14
- package/src/utils/getRequestId.spec.ts +0 -43
- package/src/utils/getRequestId.ts +0 -16
- package/src/utils/isInAWS.ts +0 -8
- package/src/utils/setResponseHeaders.spec.ts +0 -156
- package/src/utils/setResponseHeaders.ts +0 -58
- package/vitest.config.mts +0 -21
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import {PlatformTest} from "@tsed/platform-http/testing";
|
|
2
|
-
import {Get, JsonEntityStore, Redirect, Returns} from "@tsed/schema";
|
|
3
|
-
|
|
4
|
-
import {createServerlessContext} from "../../test/utils/createServerlessContext.js";
|
|
5
|
-
import {setResponseHeaders} from "./setResponseHeaders.js";
|
|
6
|
-
|
|
7
|
-
describe("setResponseHeaders", () => {
|
|
8
|
-
beforeEach(() => PlatformTest.create());
|
|
9
|
-
afterEach(() => PlatformTest.reset());
|
|
10
|
-
|
|
11
|
-
it("should set headers, status and contentType", async () => {
|
|
12
|
-
class Test {
|
|
13
|
-
@Get("/")
|
|
14
|
-
@(Returns(200).Header("x-header", "test"))
|
|
15
|
-
test() {}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const ctx = createServerlessContext({
|
|
19
|
-
endpoint: JsonEntityStore.fromMethod(Test, "test")
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
vi.spyOn(ctx.response, "setHeaders");
|
|
23
|
-
vi.spyOn(ctx.response, "status");
|
|
24
|
-
// WHEN
|
|
25
|
-
await setResponseHeaders(ctx);
|
|
26
|
-
|
|
27
|
-
// THEN
|
|
28
|
-
expect(ctx.response.setHeaders).toHaveBeenCalledWith({"x-header": "test"});
|
|
29
|
-
expect(ctx.response.status).toHaveBeenCalledWith(200);
|
|
30
|
-
});
|
|
31
|
-
it("should not set headers automatically", async () => {
|
|
32
|
-
class Test {
|
|
33
|
-
@Get("/")
|
|
34
|
-
@(Returns(200).Header("x-header"))
|
|
35
|
-
test() {}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const ctx = createServerlessContext({
|
|
39
|
-
endpoint: JsonEntityStore.fromMethod(Test, "test")
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
vi.spyOn(ctx.response, "setHeaders");
|
|
43
|
-
vi.spyOn(ctx.response, "status");
|
|
44
|
-
// WHEN
|
|
45
|
-
await setResponseHeaders(ctx);
|
|
46
|
-
|
|
47
|
-
// THEN
|
|
48
|
-
expect(ctx.response.setHeaders).toHaveBeenCalledWith({});
|
|
49
|
-
expect(ctx.response.status).toHaveBeenCalledWith(200);
|
|
50
|
-
});
|
|
51
|
-
it("should redirect with 301", async () => {
|
|
52
|
-
class Test {
|
|
53
|
-
@Get("/")
|
|
54
|
-
@Redirect(301, "/path")
|
|
55
|
-
test() {}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const ctx = createServerlessContext({
|
|
59
|
-
endpoint: JsonEntityStore.fromMethod(Test, "test")
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
vi.spyOn(ctx.response, "redirect");
|
|
63
|
-
|
|
64
|
-
// WHEN
|
|
65
|
-
await setResponseHeaders(ctx as any);
|
|
66
|
-
|
|
67
|
-
// THEN
|
|
68
|
-
expect(ctx.response.redirect).toHaveBeenCalledWith(301, "/path");
|
|
69
|
-
});
|
|
70
|
-
it("should redirect with default", async () => {
|
|
71
|
-
class Test {
|
|
72
|
-
@Get("/")
|
|
73
|
-
@Redirect(302, "/path")
|
|
74
|
-
test() {}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const ctx = createServerlessContext({
|
|
78
|
-
endpoint: JsonEntityStore.fromMethod(Test, "test")
|
|
79
|
-
});
|
|
80
|
-
vi.spyOn(ctx.response, "redirect");
|
|
81
|
-
|
|
82
|
-
// WHEN
|
|
83
|
-
await setResponseHeaders(ctx as any);
|
|
84
|
-
|
|
85
|
-
// THEN
|
|
86
|
-
expect(ctx.response.redirect).toHaveBeenCalledWith(302, "/path");
|
|
87
|
-
});
|
|
88
|
-
it("should redirect with assigned value", async () => {
|
|
89
|
-
class Test {
|
|
90
|
-
@Get("/")
|
|
91
|
-
@Redirect(302, "/path")
|
|
92
|
-
test() {}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const ctx = createServerlessContext({
|
|
96
|
-
endpoint: JsonEntityStore.fromMethod(Test, "test")
|
|
97
|
-
});
|
|
98
|
-
vi.spyOn(ctx.response, "redirect");
|
|
99
|
-
|
|
100
|
-
ctx.response.setHeaders({Location: "/path/other"});
|
|
101
|
-
|
|
102
|
-
// WHEN
|
|
103
|
-
await setResponseHeaders(ctx as any);
|
|
104
|
-
|
|
105
|
-
// THEN
|
|
106
|
-
expect(ctx.response.redirect).toHaveBeenCalledWith(302, "/path/other");
|
|
107
|
-
});
|
|
108
|
-
it("should do nothing when headers is already sent", async () => {
|
|
109
|
-
class Test {
|
|
110
|
-
@Get("/")
|
|
111
|
-
@(Returns(200).Header("x-header", "test"))
|
|
112
|
-
test() {}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const ctx = createServerlessContext({
|
|
116
|
-
endpoint: JsonEntityStore.fromMethod(Test, "test")
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
await ctx.destroy();
|
|
120
|
-
|
|
121
|
-
vi.spyOn(ctx.response, "setHeaders");
|
|
122
|
-
vi.spyOn(ctx.response, "isDone");
|
|
123
|
-
|
|
124
|
-
// WHEN
|
|
125
|
-
await setResponseHeaders(ctx);
|
|
126
|
-
|
|
127
|
-
// THEN
|
|
128
|
-
return expect(ctx.response.isDone).toHaveBeenCalled();
|
|
129
|
-
});
|
|
130
|
-
it("should do nothing if the endpoint isn't an operation", async () => {
|
|
131
|
-
class Test {
|
|
132
|
-
test() {}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const endpoint = JsonEntityStore.fromMethod(Test, "test");
|
|
136
|
-
|
|
137
|
-
const ctx = createServerlessContext({
|
|
138
|
-
endpoint: {} as never
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
vi.spyOn(ctx.response, "setHeaders");
|
|
142
|
-
vi.spyOn(ctx.response, "isDone");
|
|
143
|
-
vi.spyOn(ctx.logger, "debug");
|
|
144
|
-
|
|
145
|
-
// WHEN
|
|
146
|
-
await setResponseHeaders(ctx);
|
|
147
|
-
|
|
148
|
-
// THEN
|
|
149
|
-
expect(ctx.response.isDone).toHaveBeenCalled();
|
|
150
|
-
expect(ctx.logger.debug).toHaveBeenCalledWith({
|
|
151
|
-
event: "MISSING_OPERATION_METADATA",
|
|
152
|
-
message: "No operation found on the endpoint. The response headers are not set.",
|
|
153
|
-
endpoint: {}
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
});
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import {JsonHeader, JsonOperation} from "@tsed/schema";
|
|
2
|
-
|
|
3
|
-
import {ServerlessContext} from "../domain/ServerlessContext.js";
|
|
4
|
-
import type {ServerlessEvent} from "../domain/ServerlessEvent.js";
|
|
5
|
-
import {HeaderValue} from "../domain/ServerlessResponse.js";
|
|
6
|
-
|
|
7
|
-
function mergeHeaders(specHeaders: Record<string, JsonHeader & {example: string}>, headers: Record<string, HeaderValue>) {
|
|
8
|
-
return Object.entries(specHeaders).reduce((headers, [key, item]) => {
|
|
9
|
-
key = key.toLowerCase();
|
|
10
|
-
|
|
11
|
-
const value = headers[key] === undefined ? item.example : headers[key];
|
|
12
|
-
|
|
13
|
-
if (value !== undefined) {
|
|
14
|
-
return {
|
|
15
|
-
...headers,
|
|
16
|
-
[key]: String(value)
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return headers;
|
|
21
|
-
}, headers);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* @ignore
|
|
26
|
-
*/
|
|
27
|
-
export function setResponseHeaders(ctx: ServerlessContext<ServerlessEvent>) {
|
|
28
|
-
const {response, endpoint} = ctx;
|
|
29
|
-
if (ctx.isDone()) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const operation = endpoint.operation as JsonOperation | undefined;
|
|
34
|
-
|
|
35
|
-
if (!operation) {
|
|
36
|
-
ctx.logger.debug({
|
|
37
|
-
event: "MISSING_OPERATION_METADATA",
|
|
38
|
-
message: "No operation found on the endpoint. The response headers are not set.",
|
|
39
|
-
endpoint: endpoint
|
|
40
|
-
});
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (!response.hasStatus()) {
|
|
45
|
-
// apply status only if isn't already modified
|
|
46
|
-
response.status(operation.getStatus());
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const statusCode = response.statusCode;
|
|
50
|
-
const headers = operation.getHeadersOf(response.statusCode);
|
|
51
|
-
const mergedHeaders = mergeHeaders(headers, response.getHeaders());
|
|
52
|
-
|
|
53
|
-
response.setHeaders(mergedHeaders);
|
|
54
|
-
|
|
55
|
-
if (operation.isRedirection(statusCode)) {
|
|
56
|
-
response.redirect(statusCode, String(mergedHeaders["location"]));
|
|
57
|
-
}
|
|
58
|
-
}
|
package/vitest.config.mts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// @ts-ignore
|
|
2
|
-
import {presets} from "@tsed/vitest/presets";
|
|
3
|
-
import {defineConfig} from "vitest/config";
|
|
4
|
-
|
|
5
|
-
export default defineConfig(
|
|
6
|
-
{
|
|
7
|
-
...presets,
|
|
8
|
-
test: {
|
|
9
|
-
...presets.test,
|
|
10
|
-
coverage: {
|
|
11
|
-
...presets.test.coverage,
|
|
12
|
-
thresholds: {
|
|
13
|
-
statements: 0,
|
|
14
|
-
branches: 0,
|
|
15
|
-
functions: 0,
|
|
16
|
-
lines: 0
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
);
|