tspace-spear 1.2.9-beta.1 → 1.3.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.
- package/README.md +103 -0
- package/dist/cli/generators/controller/template.d.ts +1 -1
- package/dist/cli/generators/controller/template.js +1 -1
- package/dist/lib/core/client/index.js +19 -23
- package/dist/lib/core/client/index.js.map +1 -1
- package/dist/lib/core/client/types.d.ts +4 -3
- package/dist/lib/core/compiler/generator.js +2 -2
- package/dist/lib/core/compiler/generator.js.map +1 -1
- package/dist/lib/core/compiler/pre-routes.d.ts +260 -6
- package/dist/lib/core/compiler/pre-routes.js +54 -4
- package/dist/lib/core/compiler/pre-routes.js.map +1 -1
- package/dist/lib/core/const/index.d.ts +12 -0
- package/dist/lib/core/const/index.js +6 -1
- package/dist/lib/core/const/index.js.map +1 -1
- package/dist/lib/core/decorators/headers.js +1 -0
- package/dist/lib/core/decorators/headers.js.map +1 -1
- package/dist/lib/core/decorators/middleware.d.ts +9 -3
- package/dist/lib/core/decorators/middleware.js +55 -15
- package/dist/lib/core/decorators/middleware.js.map +1 -1
- package/dist/lib/core/decorators/statusCode.js.map +1 -1
- package/dist/lib/core/server/fast-router.d.ts +5 -5
- package/dist/lib/core/server/fast-router.js +2 -2
- package/dist/lib/core/server/fast-router.js.map +1 -1
- package/dist/lib/core/server/http/index.d.ts +22 -0
- package/dist/lib/core/server/http/index.js +220 -0
- package/dist/lib/core/server/http/index.js.map +1 -0
- package/dist/lib/core/server/index.d.ts +3 -2
- package/dist/lib/core/server/index.js +94 -60
- package/dist/lib/core/server/index.js.map +1 -1
- package/dist/lib/core/server/net/index.d.ts +13 -8
- package/dist/lib/core/server/net/index.js +2 -2
- package/dist/lib/core/server/net/index.js.map +1 -1
- package/dist/lib/core/server/parser-factory.d.ts +3 -4
- package/dist/lib/core/server/parser-factory.js +17 -157
- package/dist/lib/core/server/parser-factory.js.map +1 -1
- package/dist/lib/core/server/response.d.ts +1 -2
- package/dist/lib/core/server/response.js +173 -171
- package/dist/lib/core/server/response.js.map +1 -1
- package/dist/lib/core/server/uWS/index.d.ts +2 -3
- package/dist/lib/core/server/uWS/index.js +15 -10
- package/dist/lib/core/server/uWS/index.js.map +1 -1
- package/dist/lib/core/types/index.d.ts +15 -6
- package/dist/lib/core/utils/index.d.ts +3 -3
- package/dist/lib/core/utils/index.js +19 -16
- package/dist/lib/core/utils/index.js.map +1 -1
- package/package.json +27 -10
- package/dist/cli/app.d.ts +0 -1
- package/dist/cli/app.js +0 -28
- package/dist/cli/app.js.map +0 -1
- package/dist/cli/controller.d.ts +0 -1
- package/dist/cli/controller.js +0 -158
- package/dist/cli/controller.js.map +0 -1
- package/dist/lib/core/compiler/types.d.ts +0 -39
- package/dist/lib/core/compiler/types.js +0 -3
- package/dist/lib/core/compiler/types.js.map +0 -1
|
@@ -16,10 +16,10 @@ const normalizeRequestBody = async ({ contentType, payload, }) => {
|
|
|
16
16
|
if (contentType == null || payload == null || payload === "") {
|
|
17
17
|
return {};
|
|
18
18
|
}
|
|
19
|
-
if (contentType.includes("
|
|
19
|
+
if (contentType.includes(const_1.HEADER_CONTENT_TYPES["form"]["Content-Type"])) {
|
|
20
20
|
return querystring_1.default.parse(payload);
|
|
21
21
|
}
|
|
22
|
-
if (contentType.includes("
|
|
22
|
+
if (contentType.includes(const_1.HEADER_CONTENT_TYPES["json"]["Content-Type"])) {
|
|
23
23
|
try {
|
|
24
24
|
return JSON.parse(payload);
|
|
25
25
|
}
|
|
@@ -27,8 +27,8 @@ const normalizeRequestBody = async ({ contentType, payload, }) => {
|
|
|
27
27
|
throw new Error("Invalid JSON format in request body.");
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
if (contentType.includes("
|
|
31
|
-
contentType.includes("
|
|
30
|
+
if (contentType.includes(const_1.HEADER_CONTENT_TYPES["xml"]["Content-Type"]) ||
|
|
31
|
+
contentType.includes(const_1.HEADER_CONTENT_TYPES["xmlText"]["Content-Type"])) {
|
|
32
32
|
try {
|
|
33
33
|
const result = await xml2js_1.default.parseStringPromise(payload, {
|
|
34
34
|
explicitArray: false,
|
|
@@ -39,10 +39,10 @@ const normalizeRequestBody = async ({ contentType, payload, }) => {
|
|
|
39
39
|
throw new Error("Invalid XML format in request body.");
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
if (contentType.includes("text
|
|
43
|
-
contentType.includes("
|
|
44
|
-
contentType.includes("
|
|
45
|
-
contentType.includes("
|
|
42
|
+
if (contentType.includes(const_1.HEADER_CONTENT_TYPES["text"]["Content-Type"]) ||
|
|
43
|
+
contentType.includes(const_1.HEADER_CONTENT_TYPES["js"]["Content-Type"]) ||
|
|
44
|
+
contentType.includes(const_1.HEADER_CONTENT_TYPES["jsText"]["Content-Type"]) ||
|
|
45
|
+
contentType.includes(const_1.HEADER_CONTENT_TYPES["jsX"]["Content-Type"])) {
|
|
46
46
|
return { contentType, text: payload };
|
|
47
47
|
}
|
|
48
48
|
return {};
|
|
@@ -60,7 +60,7 @@ const pipeStream = async ({ req, res, filePath, isUwebSocket, }) => {
|
|
|
60
60
|
const stat = fs_1.default.statSync(filePath);
|
|
61
61
|
const fileSize = stat.size;
|
|
62
62
|
const range = req.headers["range"] ?? null;
|
|
63
|
-
const contentType = mime_types_1.default.lookup(filePath) || "
|
|
63
|
+
const contentType = mime_types_1.default.lookup(filePath) || const_1.HEADER_CONTENT_TYPES["octet"]["Content-Type"];
|
|
64
64
|
const isVideo = contentType.startsWith("video/");
|
|
65
65
|
const writeHead = (header, code = 200) => {
|
|
66
66
|
const extension = filePath.split(".").pop();
|
|
@@ -80,7 +80,7 @@ const pipeStream = async ({ req, res, filePath, isUwebSocket, }) => {
|
|
|
80
80
|
"mpeg",
|
|
81
81
|
],
|
|
82
82
|
audio: ["wav", "mp3"],
|
|
83
|
-
document: ["pdf"],
|
|
83
|
+
document: ["pdf", "html"],
|
|
84
84
|
image: ["png", "jpeg", "jpg", "gif", "webp", "svg", "ico"],
|
|
85
85
|
}).flat();
|
|
86
86
|
if (previews.some((p) => extension?.toLocaleLowerCase().includes(p))) {
|
|
@@ -88,10 +88,13 @@ const pipeStream = async ({ req, res, filePath, isUwebSocket, }) => {
|
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
90
90
|
res.setHeader("Content-Disposition", `attachment; filename=${+new Date()}.${extension}`);
|
|
91
|
-
res.setHeader("Content-Type", "
|
|
91
|
+
res.setHeader("Content-Type", const_1.HEADER_CONTENT_TYPES["octet"]["Content-Type"]);
|
|
92
92
|
};
|
|
93
93
|
const maxAge = 1000 * 60 * 60 * 24 * 7;
|
|
94
|
-
const etag = crypto_1.default
|
|
94
|
+
const etag = crypto_1.default
|
|
95
|
+
.createHash("md5")
|
|
96
|
+
.update(`${stat.size}-${stat.mtimeMs}`)
|
|
97
|
+
.digest("hex");
|
|
95
98
|
const baseHeader = {
|
|
96
99
|
"Connection": "keep-alive",
|
|
97
100
|
"Keep-Alive": "timeout=60, max=1000",
|
|
@@ -115,8 +118,8 @@ const pipeStream = async ({ req, res, filePath, isUwebSocket, }) => {
|
|
|
115
118
|
};
|
|
116
119
|
const stream = fs_1.default.createReadStream(filePath);
|
|
117
120
|
writeHead(header);
|
|
118
|
-
stream.on("error", () => res.end());
|
|
119
|
-
return stream.pipe(res);
|
|
121
|
+
stream.on("error", () => res.http.end());
|
|
122
|
+
return stream.pipe(res.http);
|
|
120
123
|
}
|
|
121
124
|
const parts = range.replace(/bytes=/, "").split("-");
|
|
122
125
|
const start = parseInt(parts[0], 10);
|
|
@@ -130,8 +133,8 @@ const pipeStream = async ({ req, res, filePath, isUwebSocket, }) => {
|
|
|
130
133
|
"Accept-Ranges": "bytes"
|
|
131
134
|
};
|
|
132
135
|
writeHead(header, 206);
|
|
133
|
-
stream.on("error", () => res.end());
|
|
134
|
-
return stream.pipe(res);
|
|
136
|
+
stream.on("error", () => res.http.end());
|
|
137
|
+
return stream.pipe(res.http);
|
|
135
138
|
};
|
|
136
139
|
exports.pipeStream = pipeStream;
|
|
137
140
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/core/utils/index.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/core/utils/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tspace-spear",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "tspace-spear is a lightweight, high-performance API framework for Node.js that leverages the native HTTP server and supports uWebSockets.js (C++) for maximum speed and efficiency.",
|
|
5
5
|
"main": "./dist/lib/index.js",
|
|
6
6
|
"types": "./dist/lib/index.d.ts",
|
|
@@ -18,16 +18,33 @@
|
|
|
18
18
|
"keywords": [
|
|
19
19
|
"tspace",
|
|
20
20
|
"tspace-spear",
|
|
21
|
+
"nodejs",
|
|
22
|
+
"node",
|
|
23
|
+
"framework",
|
|
21
24
|
"api",
|
|
22
|
-
"rest api",
|
|
23
|
-
"fast",
|
|
24
|
-
"fast-api",
|
|
25
|
-
"fast api",
|
|
26
|
-
"low overhead",
|
|
27
25
|
"http",
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
26
|
+
"server",
|
|
27
|
+
"backend",
|
|
28
|
+
"web",
|
|
29
|
+
"typescript",
|
|
30
|
+
"type-safe",
|
|
31
|
+
"dependency-injection",
|
|
32
|
+
"decorators",
|
|
33
|
+
"middleware",
|
|
34
|
+
"routing",
|
|
35
|
+
"controller",
|
|
36
|
+
"rest",
|
|
37
|
+
"rest-api",
|
|
38
|
+
"high-performance",
|
|
39
|
+
"fast",
|
|
40
|
+
"lightweight",
|
|
41
|
+
"low-overhead",
|
|
42
|
+
"uws",
|
|
43
|
+
"uwebsockets",
|
|
44
|
+
"uwebsockets.js",
|
|
45
|
+
"native-http",
|
|
46
|
+
"e2e",
|
|
47
|
+
"end-to-end"
|
|
31
48
|
],
|
|
32
49
|
"author": "Thanathip (https://github.com/thanathip41)",
|
|
33
50
|
"license": "MIT",
|
|
@@ -45,7 +62,7 @@
|
|
|
45
62
|
"benchmark:node": "npm run build && node --no-warnings --optimize-for-size benchmarks/tests/benchmark.node.js",
|
|
46
63
|
"benchmark:bun": "npm run build && bun run --no-warnings --optimize-for-size benchmarks/tests/benchmark.bun.js",
|
|
47
64
|
"load": "autocannon -c 100 -d 30 -p 10 localhost:5000",
|
|
48
|
-
"test": "ts-mocha ./__tests__
|
|
65
|
+
"test": "ts-mocha ./__tests__/**/0*.test.ts --reporter spec --slow 0 --no-timeouts --recursive --reporter mochawesome --reporter-options reportDir=__tests-report__,reportFilename=errors.html,reportTitle=Unit-test --exit",
|
|
49
66
|
"docs": "npx docsify-cli serve docs"
|
|
50
67
|
},
|
|
51
68
|
"exports": {
|
package/dist/cli/app.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const app = "\nimport Spear from \"tspace-spear\";\n\nexport const app = new Spear({\n logger: true,\n controllers: {\n folder: `${__dirname}/controllers`,\n name: /controller\\\\.(ts|js)$/i,\n\n // don't forget to set this option for auto-generate route metadata for type-safe E2E usage, \n // and swagger documentation. By default if use .useSwagger() in app no need to set any description\n preRouteTypes: true\n }\n})\n\napp.useGlobalPrefix(\"api\");\napp.useSwagger();\napp.useBodyParser();\n\napp.listen(8000 , ({ port , server }) => {\n console.log(`Server listening on : http://localhost:${port}`)\n console.log(\n`Docs listening on : http://localhost:${port}`/api/docs)\n})\n";
|
package/dist/cli/app.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.app = void 0;
|
|
4
|
-
exports.app = `
|
|
5
|
-
import Spear from "tspace-spear";
|
|
6
|
-
|
|
7
|
-
export const app = new Spear({
|
|
8
|
-
logger: true,
|
|
9
|
-
controllers: {
|
|
10
|
-
folder: \`\${__dirname}/controllers\`,
|
|
11
|
-
name: /controller\\\\.(ts|js)$/i,
|
|
12
|
-
|
|
13
|
-
// don't forget to set this option for auto-generate route metadata for type-safe E2E usage,
|
|
14
|
-
// and swagger documentation. By default if use .useSwagger() in app no need to set any description
|
|
15
|
-
preRouteTypes: true
|
|
16
|
-
}
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
app.useGlobalPrefix("api");
|
|
20
|
-
app.useSwagger();
|
|
21
|
-
app.useBodyParser();
|
|
22
|
-
|
|
23
|
-
app.listen(8000 , ({ port , server }) => {
|
|
24
|
-
console.log(\`Server listening on : http://localhost:\${port}\`)
|
|
25
|
-
console.log(\n\`Docs listening on : http://localhost:\${port}\`/api/docs)
|
|
26
|
-
})
|
|
27
|
-
`;
|
|
28
|
-
//# sourceMappingURL=app.js.map
|
package/dist/cli/app.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":";;;AAAa,QAAA,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBlB,CAAC"}
|
package/dist/cli/controller.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const CatController = "\nimport {\n type T,\n Controller,\n Get,\n Post,\n Put,\n Delete\n} from \"tspace-spear\";\n\ntype Cat = {\n id: number;\n name: string;\n age: number;\n};\n\nlet cats: Cat[] = [\n {\n id: 1,\n name: \"cat 1\",\n age: 2\n },\n {\n id: 2,\n name: \"cat 2\",\n age: 4\n }\n];\n\n@Controller(\"/cats\")\nexport default class CatController {\n\n @Get(\"/\")\n async index() {\n return {\n cats\n };\n }\n\n @Get(\"/:id\")\n async show({\n res,\n params\n }: T.Context<{\n params: {\n id: number;\n };\n }>) {\n\n const cat = cats.find(\n d => d.id === Number(params.id)\n );\n\n if (!cat) {\n throw res.notFound(\n \"Cat not found\"\n );\n }\n\n return {\n cat\n };\n }\n\n @Post(\"/\")\n async create({\n body\n }: T.Context<{\n body: {\n name: string;\n age: number;\n };\n }>) {\n\n const cat: Cat = {\n id: cats.length + 1,\n name: body.name,\n age: body.age\n };\n\n cats.push(cat);\n\n return {\n message: \"Created\",\n cat\n };\n }\n\n @Put(\"/:id\")\n async update({\n res,\n params,\n body\n }: T.Context<{\n params: {\n id: number;\n };\n body: Partial<{\n name: string;\n age: number;\n }>;\n }>) {\n\n const index = cats.findIndex(\n d => d.id === Number(params.id)\n );\n\n if (index === -1) {\n throw res.notFound(\n \"Cat not found\"\n );\n }\n\n cats[index] = {\n ...cats[index],\n ...body\n };\n\n return {\n message: \"Updated\",\n cat: cats[index]\n };\n }\n\n @Delete(\"/:id\")\n async remove({\n res,\n params\n }: T.Context<{\n params: {\n id: number;\n };\n }>) {\n\n const index = cats.findIndex(\n d => d.id === Number(params.id)\n );\n\n if (index === -1) {\n throw res.notFound(\n \"Cat not found\"\n );\n }\n\n cats = cats.filter(\n d => d.id !== Number(params.id)\n );\n\n return {\n message: \"Deleted\"\n };\n }\n}\n";
|
package/dist/cli/controller.js
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CatController = void 0;
|
|
4
|
-
exports.CatController = `
|
|
5
|
-
import {
|
|
6
|
-
type T,
|
|
7
|
-
Controller,
|
|
8
|
-
Get,
|
|
9
|
-
Post,
|
|
10
|
-
Put,
|
|
11
|
-
Delete
|
|
12
|
-
} from "tspace-spear";
|
|
13
|
-
|
|
14
|
-
type Cat = {
|
|
15
|
-
id: number;
|
|
16
|
-
name: string;
|
|
17
|
-
age: number;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
let cats: Cat[] = [
|
|
21
|
-
{
|
|
22
|
-
id: 1,
|
|
23
|
-
name: "cat 1",
|
|
24
|
-
age: 2
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
id: 2,
|
|
28
|
-
name: "cat 2",
|
|
29
|
-
age: 4
|
|
30
|
-
}
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
@Controller("/cats")
|
|
34
|
-
export default class CatController {
|
|
35
|
-
|
|
36
|
-
@Get("/")
|
|
37
|
-
async index() {
|
|
38
|
-
return {
|
|
39
|
-
cats
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@Get("/:id")
|
|
44
|
-
async show({
|
|
45
|
-
res,
|
|
46
|
-
params
|
|
47
|
-
}: T.Context<{
|
|
48
|
-
params: {
|
|
49
|
-
id: number;
|
|
50
|
-
};
|
|
51
|
-
}>) {
|
|
52
|
-
|
|
53
|
-
const cat = cats.find(
|
|
54
|
-
d => d.id === Number(params.id)
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
if (!cat) {
|
|
58
|
-
throw res.notFound(
|
|
59
|
-
"Cat not found"
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
cat
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
@Post("/")
|
|
69
|
-
async create({
|
|
70
|
-
body
|
|
71
|
-
}: T.Context<{
|
|
72
|
-
body: {
|
|
73
|
-
name: string;
|
|
74
|
-
age: number;
|
|
75
|
-
};
|
|
76
|
-
}>) {
|
|
77
|
-
|
|
78
|
-
const cat: Cat = {
|
|
79
|
-
id: cats.length + 1,
|
|
80
|
-
name: body.name,
|
|
81
|
-
age: body.age
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
cats.push(cat);
|
|
85
|
-
|
|
86
|
-
return {
|
|
87
|
-
message: "Created",
|
|
88
|
-
cat
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
@Put("/:id")
|
|
93
|
-
async update({
|
|
94
|
-
res,
|
|
95
|
-
params,
|
|
96
|
-
body
|
|
97
|
-
}: T.Context<{
|
|
98
|
-
params: {
|
|
99
|
-
id: number;
|
|
100
|
-
};
|
|
101
|
-
body: Partial<{
|
|
102
|
-
name: string;
|
|
103
|
-
age: number;
|
|
104
|
-
}>;
|
|
105
|
-
}>) {
|
|
106
|
-
|
|
107
|
-
const index = cats.findIndex(
|
|
108
|
-
d => d.id === Number(params.id)
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
if (index === -1) {
|
|
112
|
-
throw res.notFound(
|
|
113
|
-
"Cat not found"
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
cats[index] = {
|
|
118
|
-
...cats[index],
|
|
119
|
-
...body
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
return {
|
|
123
|
-
message: "Updated",
|
|
124
|
-
cat: cats[index]
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
@Delete("/:id")
|
|
129
|
-
async remove({
|
|
130
|
-
res,
|
|
131
|
-
params
|
|
132
|
-
}: T.Context<{
|
|
133
|
-
params: {
|
|
134
|
-
id: number;
|
|
135
|
-
};
|
|
136
|
-
}>) {
|
|
137
|
-
|
|
138
|
-
const index = cats.findIndex(
|
|
139
|
-
d => d.id === Number(params.id)
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
if (index === -1) {
|
|
143
|
-
throw res.notFound(
|
|
144
|
-
"Cat not found"
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
cats = cats.filter(
|
|
149
|
-
d => d.id !== Number(params.id)
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
return {
|
|
153
|
-
message: "Deleted"
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
`;
|
|
158
|
-
//# sourceMappingURL=controller.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/cli/controller.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyJ5B,CAAC"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
export type AnyRoutes = {
|
|
2
|
-
[key: string]: any;
|
|
3
|
-
};
|
|
4
|
-
export type RoutesWithMethod<TRoutes extends AnyRoutes, TMethod extends string> = {
|
|
5
|
-
[K in keyof TRoutes]: TMethod extends keyof TRoutes[K] ? K : never;
|
|
6
|
-
}[keyof TRoutes];
|
|
7
|
-
export type ExtractFrom<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath], Key extends string> = TRoutes[TPath][TMethod] extends Record<Key, infer R> ? R : never;
|
|
8
|
-
export type RequestBody<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = ExtractFrom<TRoutes, TPath, TMethod, "body">;
|
|
9
|
-
export type RequestQuery<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = ExtractFrom<TRoutes, TPath, TMethod, "query">;
|
|
10
|
-
export type RequestParams<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = ExtractFrom<TRoutes, TPath, TMethod, "params">;
|
|
11
|
-
export type RequestFiles<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = ExtractFrom<TRoutes, TPath, TMethod, "files">;
|
|
12
|
-
export type ResponseType<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = TRoutes[TPath][TMethod] extends {
|
|
13
|
-
response: infer R;
|
|
14
|
-
} ? Awaited<R> : never;
|
|
15
|
-
export type OptionalIfEmpty<T> = {} extends T ? [input?: T] : [input: T];
|
|
16
|
-
export type RequestInput<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = RequestParams<TRoutes, TPath, TMethod> extends never ? {
|
|
17
|
-
params?: never;
|
|
18
|
-
query?: RequestQuery<TRoutes, TPath, TMethod>;
|
|
19
|
-
body?: RequestBody<TRoutes, TPath, TMethod>;
|
|
20
|
-
files?: RequestFiles<TRoutes, TPath, TMethod>;
|
|
21
|
-
} : {
|
|
22
|
-
params: RequestParams<TRoutes, TPath, TMethod>;
|
|
23
|
-
query?: RequestQuery<TRoutes, TPath, TMethod>;
|
|
24
|
-
body?: RequestBody<TRoutes, TPath, TMethod>;
|
|
25
|
-
files?: RequestFiles<TRoutes, TPath, TMethod>;
|
|
26
|
-
};
|
|
27
|
-
export type SuccessStatus = 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226;
|
|
28
|
-
export type ErrorStatus = 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511;
|
|
29
|
-
export type ApiResponse<T, E = unknown> = {
|
|
30
|
-
ok: true;
|
|
31
|
-
status: SuccessStatus;
|
|
32
|
-
headers: Headers;
|
|
33
|
-
data: T;
|
|
34
|
-
} | {
|
|
35
|
-
ok: false;
|
|
36
|
-
status: ErrorStatus;
|
|
37
|
-
headers: Headers;
|
|
38
|
-
data: E;
|
|
39
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/core/compiler/types.ts"],"names":[],"mappings":""}
|