@aura-stack/router 0.1.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/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/assert.cjs +50 -0
- package/dist/assert.d.cts +32 -0
- package/dist/assert.d.ts +32 -0
- package/dist/assert.js +12 -0
- package/dist/chunk-6UBPSXKR.js +36 -0
- package/dist/chunk-ENOBC3XN.js +23 -0
- package/dist/chunk-NNCUFWPI.js +78 -0
- package/dist/chunk-RFYOPPMW.js +45 -0
- package/dist/chunk-RVJ2F7OL.js +41 -0
- package/dist/chunk-VBI7H3AK.js +75 -0
- package/dist/context.cjs +151 -0
- package/dist/context.d.cts +84 -0
- package/dist/context.d.ts +84 -0
- package/dist/context.js +15 -0
- package/dist/endpoint.cjs +110 -0
- package/dist/endpoint.d.cts +59 -0
- package/dist/endpoint.d.ts +59 -0
- package/dist/endpoint.js +12 -0
- package/dist/error.cjs +69 -0
- package/dist/error.d.cts +40 -0
- package/dist/error.d.ts +40 -0
- package/dist/error.js +6 -0
- package/dist/index.cjs +264 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +16 -0
- package/dist/middleware.cjs +106 -0
- package/dist/middleware.d.cts +22 -0
- package/dist/middleware.d.ts +22 -0
- package/dist/middleware.js +9 -0
- package/dist/router.cjs +233 -0
- package/dist/router.d.cts +15 -0
- package/dist/router.d.ts +15 -0
- package/dist/router.js +11 -0
- package/dist/types.cjs +18 -0
- package/dist/types.d.cts +134 -0
- package/dist/types.d.ts +134 -0
- package/dist/types.js +0 -0
- package/package.json +55 -0
package/dist/error.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The HTTP status codes used in AuraStack Router.
|
|
3
|
+
*/
|
|
4
|
+
declare const statusCode: {
|
|
5
|
+
OK: number;
|
|
6
|
+
CREATED: number;
|
|
7
|
+
ACCEPTED: number;
|
|
8
|
+
NO_CONTENT: number;
|
|
9
|
+
MULTIPLE_CHOICES: number;
|
|
10
|
+
MOVED_PERMANENTLY: number;
|
|
11
|
+
FOUND: number;
|
|
12
|
+
SEE_OTHER: number;
|
|
13
|
+
NOT_MODIFIED: number;
|
|
14
|
+
TEMPORARY_REDIRECT: number;
|
|
15
|
+
BAD_REQUEST: number;
|
|
16
|
+
UNAUTHORIZED: number;
|
|
17
|
+
PAYMENT_REQUIRED: number;
|
|
18
|
+
FORBIDDEN: number;
|
|
19
|
+
NOT_FOUND: number;
|
|
20
|
+
METHOD_NOT_ALLOWED: number;
|
|
21
|
+
NOT_ACCEPTABLE: number;
|
|
22
|
+
PROXY_AUTHENTICATION_REQUIRED: number;
|
|
23
|
+
UNPROCESSABLE_ENTITY: number;
|
|
24
|
+
INTERNAL_SERVER_ERROR: number;
|
|
25
|
+
NOT_IMPLEMENTED: number;
|
|
26
|
+
BAD_GATEWAY: number;
|
|
27
|
+
SERVICE_UNAVAILABLE: number;
|
|
28
|
+
HTTP_VERSION_NOT_SUPPORTED: number;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Defines the errors used in AuraStack Router. Includes HTTP status code and
|
|
32
|
+
* status text.
|
|
33
|
+
*/
|
|
34
|
+
declare class AuraStackRouterError extends Error {
|
|
35
|
+
readonly status: number;
|
|
36
|
+
readonly statusText: keyof typeof statusCode;
|
|
37
|
+
constructor(type: keyof typeof statusCode, message: string, name?: string);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { AuraStackRouterError };
|
package/dist/error.js
ADDED
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
createEndpoint: () => createEndpoint,
|
|
24
|
+
createEndpointConfig: () => createEndpointConfig,
|
|
25
|
+
createRouter: () => createRouter
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(index_exports);
|
|
28
|
+
|
|
29
|
+
// src/assert.ts
|
|
30
|
+
var supportedMethods = ["GET", "POST", "DELETE", "PUT", "PATCH"];
|
|
31
|
+
var supportedBodyMethods = ["POST", "PUT", "PATCH"];
|
|
32
|
+
var isSupportedMethod = (method) => {
|
|
33
|
+
return supportedMethods.includes(method);
|
|
34
|
+
};
|
|
35
|
+
var isSupportedBodyMethod = (method) => {
|
|
36
|
+
return supportedBodyMethods.includes(method);
|
|
37
|
+
};
|
|
38
|
+
var isValidRoute = (route) => {
|
|
39
|
+
const routePattern = /^\/[a-zA-Z0-9/_:-]*$/;
|
|
40
|
+
return routePattern.test(route);
|
|
41
|
+
};
|
|
42
|
+
var isValidHandler = (handler) => {
|
|
43
|
+
return typeof handler === "function";
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// src/error.ts
|
|
47
|
+
var statusCode = {
|
|
48
|
+
OK: 200,
|
|
49
|
+
CREATED: 201,
|
|
50
|
+
ACCEPTED: 202,
|
|
51
|
+
NO_CONTENT: 204,
|
|
52
|
+
MULTIPLE_CHOICES: 300,
|
|
53
|
+
MOVED_PERMANENTLY: 301,
|
|
54
|
+
FOUND: 302,
|
|
55
|
+
SEE_OTHER: 303,
|
|
56
|
+
NOT_MODIFIED: 304,
|
|
57
|
+
TEMPORARY_REDIRECT: 307,
|
|
58
|
+
BAD_REQUEST: 400,
|
|
59
|
+
UNAUTHORIZED: 401,
|
|
60
|
+
PAYMENT_REQUIRED: 402,
|
|
61
|
+
FORBIDDEN: 403,
|
|
62
|
+
NOT_FOUND: 404,
|
|
63
|
+
METHOD_NOT_ALLOWED: 405,
|
|
64
|
+
NOT_ACCEPTABLE: 406,
|
|
65
|
+
PROXY_AUTHENTICATION_REQUIRED: 407,
|
|
66
|
+
UNPROCESSABLE_ENTITY: 422,
|
|
67
|
+
INTERNAL_SERVER_ERROR: 500,
|
|
68
|
+
NOT_IMPLEMENTED: 501,
|
|
69
|
+
BAD_GATEWAY: 502,
|
|
70
|
+
SERVICE_UNAVAILABLE: 503,
|
|
71
|
+
HTTP_VERSION_NOT_SUPPORTED: 505
|
|
72
|
+
};
|
|
73
|
+
var statusText = Object.entries(statusCode).reduce(
|
|
74
|
+
(previous, [status, code]) => {
|
|
75
|
+
return { ...previous, [code]: status };
|
|
76
|
+
},
|
|
77
|
+
{}
|
|
78
|
+
);
|
|
79
|
+
var AuraStackRouterError = class extends Error {
|
|
80
|
+
constructor(type, message, name) {
|
|
81
|
+
super(message);
|
|
82
|
+
this.name = name ?? "AuraStackRouterError";
|
|
83
|
+
this.status = statusCode[type];
|
|
84
|
+
this.statusText = statusText[this.status];
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// src/endpoint.ts
|
|
89
|
+
var createRoutePattern = (route) => {
|
|
90
|
+
const pattern = route.replace(/:[^/]+/g, "([^/]+)").replace(/\//g, "\\/");
|
|
91
|
+
return new RegExp(`^${pattern}$`);
|
|
92
|
+
};
|
|
93
|
+
var createEndpoint = (method, route, handler, config = {}) => {
|
|
94
|
+
if (!isSupportedMethod(method)) {
|
|
95
|
+
throw new AuraStackRouterError("METHOD_NOT_ALLOWED", `Unsupported HTTP method: ${method}`);
|
|
96
|
+
}
|
|
97
|
+
if (!isValidRoute(route)) {
|
|
98
|
+
throw new AuraStackRouterError("BAD_REQUEST", `Invalid route format: ${route}`);
|
|
99
|
+
}
|
|
100
|
+
if (!isValidHandler(handler)) {
|
|
101
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Handler must be a function");
|
|
102
|
+
}
|
|
103
|
+
return { method, route, handler, config };
|
|
104
|
+
};
|
|
105
|
+
function createEndpointConfig(...args) {
|
|
106
|
+
if (typeof args[0] === "string") return args[1];
|
|
107
|
+
return args[0];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// src/context.ts
|
|
111
|
+
var getRouteParams = (route, path) => {
|
|
112
|
+
const routeRegex = createRoutePattern(route);
|
|
113
|
+
if (!routeRegex.test(path)) {
|
|
114
|
+
throw new AuraStackRouterError("BAD_REQUEST", `Missing required route params for route: ${route}`);
|
|
115
|
+
}
|
|
116
|
+
const params = routeRegex.exec(route)?.slice(1).map((seg) => seg.replace(":", ""));
|
|
117
|
+
if (!params) return {};
|
|
118
|
+
const values = routeRegex.exec(path)?.slice(1);
|
|
119
|
+
return params.reduce(
|
|
120
|
+
(previous, now, idx) => ({
|
|
121
|
+
...previous,
|
|
122
|
+
[now]: decodeURIComponent(values?.[idx] ?? "")
|
|
123
|
+
}),
|
|
124
|
+
{}
|
|
125
|
+
);
|
|
126
|
+
};
|
|
127
|
+
var getSearchParams = (url, config) => {
|
|
128
|
+
const route = new URL(url);
|
|
129
|
+
if (config.schemas?.searchParams) {
|
|
130
|
+
const parsed = config.schemas.searchParams.safeParse(Object.fromEntries(route.searchParams.entries()));
|
|
131
|
+
if (!parsed.success) {
|
|
132
|
+
throw new AuraStackRouterError("UNPROCESSABLE_ENTITY", "Invalid search parameters");
|
|
133
|
+
}
|
|
134
|
+
return parsed.data;
|
|
135
|
+
}
|
|
136
|
+
return new URLSearchParams(route.searchParams.toString());
|
|
137
|
+
};
|
|
138
|
+
var getHeaders = (request) => {
|
|
139
|
+
return new Headers(request.headers);
|
|
140
|
+
};
|
|
141
|
+
var getBody = async (request, config) => {
|
|
142
|
+
if (!isSupportedBodyMethod(request.method)) {
|
|
143
|
+
return void 0;
|
|
144
|
+
}
|
|
145
|
+
const contentType = request.headers.get("Content-Type") ?? "";
|
|
146
|
+
if (contentType.includes("application/json")) {
|
|
147
|
+
const json = await request.json();
|
|
148
|
+
if (config.schemas?.body) {
|
|
149
|
+
const parsed = config.schemas.body.safeParse(json);
|
|
150
|
+
if (!parsed.success) {
|
|
151
|
+
throw new AuraStackRouterError("UNPROCESSABLE_ENTITY", "Invalid request body");
|
|
152
|
+
}
|
|
153
|
+
return parsed.data;
|
|
154
|
+
}
|
|
155
|
+
return json;
|
|
156
|
+
}
|
|
157
|
+
if (contentType.includes("application/x-www-form-urlencoded") || contentType.includes("multipart/form-data")) {
|
|
158
|
+
return await request.formData();
|
|
159
|
+
}
|
|
160
|
+
if (contentType.includes("text/")) {
|
|
161
|
+
return await request.text();
|
|
162
|
+
}
|
|
163
|
+
if (contentType.includes("application/octet-stream")) {
|
|
164
|
+
return await request.arrayBuffer();
|
|
165
|
+
}
|
|
166
|
+
if (contentType.includes("image/") || contentType.includes("video/") || contentType.includes("audio/")) {
|
|
167
|
+
return await request.blob();
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// src/middleware.ts
|
|
173
|
+
var executeGlobalMiddlewares = async (request, middlewares) => {
|
|
174
|
+
if (!middlewares) return request;
|
|
175
|
+
for (const middleware of middlewares) {
|
|
176
|
+
if (typeof middleware !== "function") {
|
|
177
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Global middlewares must be functions");
|
|
178
|
+
}
|
|
179
|
+
const executed = await middleware(request);
|
|
180
|
+
if (executed instanceof Response) {
|
|
181
|
+
return executed;
|
|
182
|
+
}
|
|
183
|
+
request = executed;
|
|
184
|
+
}
|
|
185
|
+
if (!request || !(request instanceof Request)) {
|
|
186
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Global middleware must return a Request or Response object");
|
|
187
|
+
}
|
|
188
|
+
return request;
|
|
189
|
+
};
|
|
190
|
+
var executeMiddlewares = async (request, context, middlewares = []) => {
|
|
191
|
+
try {
|
|
192
|
+
let ctx = context;
|
|
193
|
+
for (const middleware of middlewares) {
|
|
194
|
+
if (typeof middleware !== "function") {
|
|
195
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Middleware must be a function");
|
|
196
|
+
}
|
|
197
|
+
ctx = await middleware(request, ctx);
|
|
198
|
+
}
|
|
199
|
+
return ctx;
|
|
200
|
+
} catch {
|
|
201
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Handler threw an error");
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// src/router.ts
|
|
206
|
+
var createRouter = (endpoints, config = {}) => {
|
|
207
|
+
const server = {};
|
|
208
|
+
const groups = {
|
|
209
|
+
GET: [],
|
|
210
|
+
POST: [],
|
|
211
|
+
DELETE: [],
|
|
212
|
+
PUT: [],
|
|
213
|
+
PATCH: []
|
|
214
|
+
};
|
|
215
|
+
endpoints.forEach((endpoint) => groups[endpoint.method].push(endpoint));
|
|
216
|
+
for (const method in groups) {
|
|
217
|
+
server[method] = async (request, ctx) => {
|
|
218
|
+
try {
|
|
219
|
+
const globalRequest = await executeGlobalMiddlewares(request, config.middlewares);
|
|
220
|
+
if (globalRequest instanceof Response) {
|
|
221
|
+
return globalRequest;
|
|
222
|
+
}
|
|
223
|
+
const url = new URL(globalRequest.url);
|
|
224
|
+
const pathname = url.pathname;
|
|
225
|
+
const endpoint = groups[method].find((endpoint2) => {
|
|
226
|
+
const withBasePath = config.basePath ? `${config.basePath}${endpoint2.route}` : endpoint2.route;
|
|
227
|
+
const regex = createRoutePattern(withBasePath);
|
|
228
|
+
return regex.test(pathname);
|
|
229
|
+
});
|
|
230
|
+
if (endpoint) {
|
|
231
|
+
const withBasePath = config.basePath ? `${config.basePath}${endpoint.route}` : endpoint.route;
|
|
232
|
+
const body = await getBody(globalRequest, endpoint.config);
|
|
233
|
+
const params = getRouteParams(withBasePath, pathname);
|
|
234
|
+
const searchParams = getSearchParams(globalRequest.url, endpoint.config);
|
|
235
|
+
const headers = getHeaders(globalRequest);
|
|
236
|
+
const context = {
|
|
237
|
+
...ctx,
|
|
238
|
+
params,
|
|
239
|
+
searchParams,
|
|
240
|
+
headers,
|
|
241
|
+
body
|
|
242
|
+
};
|
|
243
|
+
await executeMiddlewares(globalRequest, context, endpoint.config.middlewares);
|
|
244
|
+
return endpoint.handler(globalRequest, context);
|
|
245
|
+
}
|
|
246
|
+
return Response.json({ message: "Not Found" }, { status: 404 });
|
|
247
|
+
} catch (error) {
|
|
248
|
+
if (error instanceof AuraStackRouterError) {
|
|
249
|
+
const { message, status, statusText: statusText2 } = error;
|
|
250
|
+
console.log("StatusText: ", statusText2);
|
|
251
|
+
return Response.json({ message }, { status, statusText: statusText2 });
|
|
252
|
+
}
|
|
253
|
+
return Response.json({ message: "Internal Server Error" }, { status: 500 });
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return server;
|
|
258
|
+
};
|
|
259
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
260
|
+
0 && (module.exports = {
|
|
261
|
+
createEndpoint,
|
|
262
|
+
createEndpointConfig,
|
|
263
|
+
createRouter
|
|
264
|
+
});
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createEndpoint, createEndpointConfig } from './endpoint.cjs';
|
|
2
|
+
export { createRouter } from './router.cjs';
|
|
3
|
+
export { ContentType, ContextBody, ContextSearchParams, EndpointConfig, EndpointSchemas, GetHttpHandlers, GetRouteParams, GlobalMiddleware, HTTPMethod, InferMethod, MiddlewareFunction, Params, Prettify, RequestContext, RouteEndpoint, RouteHandler, RoutePattern, RouterConfig } from './types.cjs';
|
|
4
|
+
import 'zod';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createEndpoint, createEndpointConfig } from './endpoint.js';
|
|
2
|
+
export { createRouter } from './router.js';
|
|
3
|
+
export { ContentType, ContextBody, ContextSearchParams, EndpointConfig, EndpointSchemas, GetHttpHandlers, GetRouteParams, GlobalMiddleware, HTTPMethod, InferMethod, MiddlewareFunction, Params, Prettify, RequestContext, RouteEndpoint, RouteHandler, RoutePattern, RouterConfig } from './types.js';
|
|
4
|
+
import 'zod';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createRouter
|
|
3
|
+
} from "./chunk-VBI7H3AK.js";
|
|
4
|
+
import "./chunk-NNCUFWPI.js";
|
|
5
|
+
import {
|
|
6
|
+
createEndpoint,
|
|
7
|
+
createEndpointConfig
|
|
8
|
+
} from "./chunk-6UBPSXKR.js";
|
|
9
|
+
import "./chunk-ENOBC3XN.js";
|
|
10
|
+
import "./chunk-RVJ2F7OL.js";
|
|
11
|
+
import "./chunk-RFYOPPMW.js";
|
|
12
|
+
export {
|
|
13
|
+
createEndpoint,
|
|
14
|
+
createEndpointConfig,
|
|
15
|
+
createRouter
|
|
16
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/middleware.ts
|
|
21
|
+
var middleware_exports = {};
|
|
22
|
+
__export(middleware_exports, {
|
|
23
|
+
executeGlobalMiddlewares: () => executeGlobalMiddlewares,
|
|
24
|
+
executeMiddlewares: () => executeMiddlewares
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(middleware_exports);
|
|
27
|
+
|
|
28
|
+
// src/error.ts
|
|
29
|
+
var statusCode = {
|
|
30
|
+
OK: 200,
|
|
31
|
+
CREATED: 201,
|
|
32
|
+
ACCEPTED: 202,
|
|
33
|
+
NO_CONTENT: 204,
|
|
34
|
+
MULTIPLE_CHOICES: 300,
|
|
35
|
+
MOVED_PERMANENTLY: 301,
|
|
36
|
+
FOUND: 302,
|
|
37
|
+
SEE_OTHER: 303,
|
|
38
|
+
NOT_MODIFIED: 304,
|
|
39
|
+
TEMPORARY_REDIRECT: 307,
|
|
40
|
+
BAD_REQUEST: 400,
|
|
41
|
+
UNAUTHORIZED: 401,
|
|
42
|
+
PAYMENT_REQUIRED: 402,
|
|
43
|
+
FORBIDDEN: 403,
|
|
44
|
+
NOT_FOUND: 404,
|
|
45
|
+
METHOD_NOT_ALLOWED: 405,
|
|
46
|
+
NOT_ACCEPTABLE: 406,
|
|
47
|
+
PROXY_AUTHENTICATION_REQUIRED: 407,
|
|
48
|
+
UNPROCESSABLE_ENTITY: 422,
|
|
49
|
+
INTERNAL_SERVER_ERROR: 500,
|
|
50
|
+
NOT_IMPLEMENTED: 501,
|
|
51
|
+
BAD_GATEWAY: 502,
|
|
52
|
+
SERVICE_UNAVAILABLE: 503,
|
|
53
|
+
HTTP_VERSION_NOT_SUPPORTED: 505
|
|
54
|
+
};
|
|
55
|
+
var statusText = Object.entries(statusCode).reduce(
|
|
56
|
+
(previous, [status, code]) => {
|
|
57
|
+
return { ...previous, [code]: status };
|
|
58
|
+
},
|
|
59
|
+
{}
|
|
60
|
+
);
|
|
61
|
+
var AuraStackRouterError = class extends Error {
|
|
62
|
+
constructor(type, message, name) {
|
|
63
|
+
super(message);
|
|
64
|
+
this.name = name ?? "AuraStackRouterError";
|
|
65
|
+
this.status = statusCode[type];
|
|
66
|
+
this.statusText = statusText[this.status];
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// src/middleware.ts
|
|
71
|
+
var executeGlobalMiddlewares = async (request, middlewares) => {
|
|
72
|
+
if (!middlewares) return request;
|
|
73
|
+
for (const middleware of middlewares) {
|
|
74
|
+
if (typeof middleware !== "function") {
|
|
75
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Global middlewares must be functions");
|
|
76
|
+
}
|
|
77
|
+
const executed = await middleware(request);
|
|
78
|
+
if (executed instanceof Response) {
|
|
79
|
+
return executed;
|
|
80
|
+
}
|
|
81
|
+
request = executed;
|
|
82
|
+
}
|
|
83
|
+
if (!request || !(request instanceof Request)) {
|
|
84
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Global middleware must return a Request or Response object");
|
|
85
|
+
}
|
|
86
|
+
return request;
|
|
87
|
+
};
|
|
88
|
+
var executeMiddlewares = async (request, context, middlewares = []) => {
|
|
89
|
+
try {
|
|
90
|
+
let ctx = context;
|
|
91
|
+
for (const middleware of middlewares) {
|
|
92
|
+
if (typeof middleware !== "function") {
|
|
93
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Middleware must be a function");
|
|
94
|
+
}
|
|
95
|
+
ctx = await middleware(request, ctx);
|
|
96
|
+
}
|
|
97
|
+
return ctx;
|
|
98
|
+
} catch {
|
|
99
|
+
throw new AuraStackRouterError("BAD_REQUEST", "Handler threw an error");
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
103
|
+
0 && (module.exports = {
|
|
104
|
+
executeGlobalMiddlewares,
|
|
105
|
+
executeMiddlewares
|
|
106
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RouterConfig, EndpointConfig, RequestContext, MiddlewareFunction } from './types.cjs';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Executes the middlewares in sequence, passing the request to each middleware.
|
|
6
|
+
*
|
|
7
|
+
* @param request - Original request made from the client
|
|
8
|
+
* @param middlewares - Array of global middleware functions to be executed
|
|
9
|
+
* @returns - The modified request after all middlewares have been executed
|
|
10
|
+
*/
|
|
11
|
+
declare const executeGlobalMiddlewares: (request: Request, middlewares: RouterConfig["middlewares"]) => Promise<Request | Response>;
|
|
12
|
+
/**
|
|
13
|
+
* Executes middlewares in sequence, passing the request and context to each middleware.
|
|
14
|
+
*
|
|
15
|
+
* @param request - Original request made from the client
|
|
16
|
+
* @param context - Context object of the endpoint functionality
|
|
17
|
+
* @param middlewares - Array of middleware functions to be executed
|
|
18
|
+
* @returns The modified context after all middlewares have been executed
|
|
19
|
+
*/
|
|
20
|
+
declare const executeMiddlewares: <const RouteParams extends Record<string, string>, const Config extends EndpointConfig>(request: Request, context: RequestContext<RouteParams, Config>, middlewares?: MiddlewareFunction<RouteParams, Config>[]) => Promise<RequestContext<RouteParams, Config>>;
|
|
21
|
+
|
|
22
|
+
export { executeGlobalMiddlewares, executeMiddlewares };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RouterConfig, EndpointConfig, RequestContext, MiddlewareFunction } from './types.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Executes the middlewares in sequence, passing the request to each middleware.
|
|
6
|
+
*
|
|
7
|
+
* @param request - Original request made from the client
|
|
8
|
+
* @param middlewares - Array of global middleware functions to be executed
|
|
9
|
+
* @returns - The modified request after all middlewares have been executed
|
|
10
|
+
*/
|
|
11
|
+
declare const executeGlobalMiddlewares: (request: Request, middlewares: RouterConfig["middlewares"]) => Promise<Request | Response>;
|
|
12
|
+
/**
|
|
13
|
+
* Executes middlewares in sequence, passing the request and context to each middleware.
|
|
14
|
+
*
|
|
15
|
+
* @param request - Original request made from the client
|
|
16
|
+
* @param context - Context object of the endpoint functionality
|
|
17
|
+
* @param middlewares - Array of middleware functions to be executed
|
|
18
|
+
* @returns The modified context after all middlewares have been executed
|
|
19
|
+
*/
|
|
20
|
+
declare const executeMiddlewares: <const RouteParams extends Record<string, string>, const Config extends EndpointConfig>(request: Request, context: RequestContext<RouteParams, Config>, middlewares?: MiddlewareFunction<RouteParams, Config>[]) => Promise<RequestContext<RouteParams, Config>>;
|
|
21
|
+
|
|
22
|
+
export { executeGlobalMiddlewares, executeMiddlewares };
|