@arabesque/middleware-http-router 1.0.0-alpha.1 → 1.0.0-alpha.2
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/index.cjs +14 -11
- package/index.d.mts +44 -1
- package/index.mjs +14 -10
- package/package.json +1 -1
- package/route.d.mts +0 -32
package/index.cjs
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
|
3
3
|
var logicMiddlewares = require('@arabesque/logic-middlewares');
|
4
4
|
|
5
|
-
|
5
|
+
/**
|
6
|
+
* Returns a Router - i.e. a Route which matches everything and has no handler.
|
7
|
+
*/
|
8
|
+
const createRouter = (callback, log) => {
|
6
9
|
const createRoute = (pattern, handler, callback) => {
|
7
10
|
const subRoutes = [];
|
8
11
|
if (callback) {
|
@@ -69,21 +72,21 @@ const createRouteFactory = (log) => {
|
|
69
72
|
}
|
70
73
|
const queryParameters = new URLSearchParams(queryString || '');
|
71
74
|
if (handler) {
|
72
|
-
const handlerContext = {
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
return Promise.resolve(handler(handlerContext)).then(
|
75
|
+
const handlerContext = Object.assign(Object.assign({}, context), { route: {
|
76
|
+
pattern,
|
77
|
+
parameters,
|
78
|
+
queryParameters
|
79
|
+
} });
|
80
|
+
return Promise.resolve(handler(handlerContext)).then((context) => {
|
81
|
+
return actualNext(Object.assign(Object.assign({}, context), { request: handlerContext.request }));
|
82
|
+
});
|
78
83
|
}
|
79
84
|
return actualNext(context);
|
80
85
|
}
|
81
86
|
return Promise.resolve(context);
|
82
87
|
});
|
83
88
|
};
|
84
|
-
return createRoute;
|
89
|
+
return createRoute('', null, callback);
|
85
90
|
};
|
86
|
-
const createRoute = createRouteFactory();
|
87
91
|
|
88
|
-
exports.
|
89
|
-
exports.createRouteFactory = createRouteFactory;
|
92
|
+
exports.createRouter = createRouter;
|
package/index.d.mts
CHANGED
@@ -1 +1,44 @@
|
|
1
|
-
|
1
|
+
import type { Middleware } from "@arabesque/core";
|
2
|
+
import type { Context } from "@arabesque/listener-http";
|
3
|
+
type StringParameter = `:${string}`;
|
4
|
+
type NumberParameter = `#${string}`;
|
5
|
+
type ParameterName<T extends string> = T extends `${':' | '#'}${infer Name}` ? `${Name}` : void;
|
6
|
+
type ParameterType<T extends string> = (T extends StringParameter ? string : (T extends NumberParameter ? number : never));
|
7
|
+
type CreateRecord<T extends string, V extends string | void> = V extends string ? {
|
8
|
+
[key in V]: ParameterType<T>;
|
9
|
+
} : {};
|
10
|
+
type SplitAsRecord<T extends string> = (T extends `/${infer Part extends string}/${infer Rest extends string}` ? CreateRecord<Part, ParameterName<Part>> & SplitAsRecord<`/${Rest}`> : (T extends `/${infer LastPart extends string}` ? CreateRecord<LastPart, ParameterName<LastPart>> : never));
|
11
|
+
export type Parameters = Record<string, string | number>;
|
12
|
+
export interface QueryParameters {
|
13
|
+
get(key: string): string | null;
|
14
|
+
getAll(key: string): Array<string>;
|
15
|
+
has(key: string): boolean;
|
16
|
+
entries(): Iterable<[string, string]>;
|
17
|
+
readonly size: number;
|
18
|
+
}
|
19
|
+
export interface RouterContext<Data extends Record<string, any>> extends Context {
|
20
|
+
readonly data: Data;
|
21
|
+
}
|
22
|
+
export interface RouteHandlerContext<P extends Parameters, Data extends Record<string, any>> extends RouterContext<Data> {
|
23
|
+
/**
|
24
|
+
* The route that was matched by the request uri.
|
25
|
+
*/
|
26
|
+
readonly route: {
|
27
|
+
readonly parameters: P;
|
28
|
+
readonly pattern: string;
|
29
|
+
readonly queryParameters: QueryParameters;
|
30
|
+
};
|
31
|
+
}
|
32
|
+
export type RouteHandler<P extends Parameters = {}, Data extends Record<string, any> = {}> = (context: RouteHandlerContext<P, Data>) => Pick<typeof context, "response" | "data"> | Promise<Pick<typeof context, "response" | "data">>;
|
33
|
+
export type Route<Data extends Record<string, any>> = Middleware<RouterContext<Data>>;
|
34
|
+
export type RoutePattern<Prefix extends string, Pattern extends string> = `${Prefix}${Pattern}`;
|
35
|
+
export type RouteParameters<P extends RoutePattern<string, string>> = SplitAsRecord<P>;
|
36
|
+
export type RouteFactory<Prefix extends string, Data extends Record<string, any>> = <Pattern extends string>(pattern: Pattern, handler: RouteHandler<RouteParameters<RoutePattern<Prefix, Pattern>>, Data> | null, callback?: (createRoute: RouteFactory<RoutePattern<Prefix, Pattern>, Data>) => void) => Route<Data>;
|
37
|
+
export interface Logger {
|
38
|
+
(eventName: "match", request: Context["request"], pattern: string, type: "leaf" | "node"): void;
|
39
|
+
}
|
40
|
+
/**
|
41
|
+
* Returns a Router - i.e. a Route which matches everything and has no handler.
|
42
|
+
*/
|
43
|
+
export declare const createRouter: <Data extends Record<string, any>>(callback: (createRoute: RouteFactory<"", Data>) => void, log?: Logger) => Route<Data>;
|
44
|
+
export {};
|
package/index.mjs
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
import { createORMiddleware } from '@arabesque/logic-middlewares';
|
2
2
|
|
3
|
-
|
3
|
+
/**
|
4
|
+
* Returns a Router - i.e. a Route which matches everything and has no handler.
|
5
|
+
*/
|
6
|
+
const createRouter = (callback, log) => {
|
4
7
|
const createRoute = (pattern, handler, callback) => {
|
5
8
|
const subRoutes = [];
|
6
9
|
if (callback) {
|
@@ -67,20 +70,21 @@ const createRouteFactory = (log) => {
|
|
67
70
|
}
|
68
71
|
const queryParameters = new URLSearchParams(queryString || '');
|
69
72
|
if (handler) {
|
70
|
-
const handlerContext = {
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
return Promise.resolve(handler(handlerContext)).then(
|
73
|
+
const handlerContext = Object.assign(Object.assign({}, context), { route: {
|
74
|
+
pattern,
|
75
|
+
parameters,
|
76
|
+
queryParameters
|
77
|
+
} });
|
78
|
+
return Promise.resolve(handler(handlerContext)).then((context) => {
|
79
|
+
return actualNext(Object.assign(Object.assign({}, context), { request: handlerContext.request }));
|
80
|
+
});
|
76
81
|
}
|
77
82
|
return actualNext(context);
|
78
83
|
}
|
79
84
|
return Promise.resolve(context);
|
80
85
|
});
|
81
86
|
};
|
82
|
-
return createRoute;
|
87
|
+
return createRoute('', null, callback);
|
83
88
|
};
|
84
|
-
const createRoute = createRouteFactory();
|
85
89
|
|
86
|
-
export {
|
90
|
+
export { createRouter };
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"name":"@arabesque/middleware-http-router","version":"1.0.0-alpha.
|
1
|
+
{"name":"@arabesque/middleware-http-router","version":"1.0.0-alpha.2","description":"An Arabesque Middleware to route HTTP requests","types":"index.d.mts","keywords":["arabesque","middleware","router","http","https"],"author":"Eric MORAND <eric.morand@gmail.com>","license":"MIT License","repository":"https://gitlab.com/arabesque/middleware-http-router","readme":"https://gitlab.com/arabesque/middleware-http-router/README.md","exports":{"import":"./index.mjs","require":"./index.cjs","types":"./index.d.mts"},"dependencies":{"@arabesque/logic-middlewares":"^1.0.0-beta.1"}}
|
package/route.d.mts
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
import type { Middleware } from "@arabesque/core";
|
2
|
-
import type { Context, ContextRequest } from "@arabesque/listener-http";
|
3
|
-
type StringParameter = `:${string}`;
|
4
|
-
type NumberParameter = `#${string}`;
|
5
|
-
type ParameterName<T extends string> = T extends `${':' | '#'}${infer Name}` ? `${Name}` : void;
|
6
|
-
type ParameterType<T extends string> = (T extends StringParameter ? string : (T extends NumberParameter ? number : never));
|
7
|
-
type CreateRecord<T extends string, V extends string | void> = V extends string ? {
|
8
|
-
[key in V]: ParameterType<T>;
|
9
|
-
} : {};
|
10
|
-
export type SplitAsRecord<T extends string> = (T extends `/${infer Part extends string}/${infer Rest extends string}` ? CreateRecord<Part, ParameterName<Part>> & SplitAsRecord<`/${Rest}`> : (T extends `/${infer LastPart extends string}` ? CreateRecord<LastPart, ParameterName<LastPart>> : never));
|
11
|
-
export type Parameters = Record<string, string | number>;
|
12
|
-
export interface QueryParameters {
|
13
|
-
get(key: string): string | null;
|
14
|
-
getAll(key: string): Array<string>;
|
15
|
-
has(key: string): boolean;
|
16
|
-
entries(): Iterable<[string, string]>;
|
17
|
-
readonly size: number;
|
18
|
-
}
|
19
|
-
export interface HandlerContext<P extends Parameters> extends Context<ContextRequest & {
|
20
|
-
readonly parameters: P;
|
21
|
-
readonly queryParameters: QueryParameters;
|
22
|
-
}> {
|
23
|
-
}
|
24
|
-
export type RouteHandler<P extends Parameters = {}> = (context: HandlerContext<P>) => Context | Promise<Context>;
|
25
|
-
export type Route = Middleware<Context>;
|
26
|
-
export type RouteFactory<Prefix extends string> = <Pattern extends string>(pattern: Pattern, handler: RouteHandler<SplitAsRecord<`${Prefix}${Pattern}`>> | null, callback?: (createRoute: RouteFactory<`${Prefix}${Pattern}`>) => void) => Route;
|
27
|
-
export interface Logger {
|
28
|
-
(eventName: "match", request: Context["request"], pattern: string, type: "leaf" | "node"): void;
|
29
|
-
}
|
30
|
-
export declare const createRouteFactory: (log?: Logger) => RouteFactory<"">;
|
31
|
-
export declare const createRoute: RouteFactory<"">;
|
32
|
-
export {};
|