effect-start 0.30.1 → 0.32.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/dist/Fetch.d.ts +1 -1
- package/dist/Fetch.d.ts.map +1 -1
- package/dist/Fetch.js +1 -1
- package/dist/Fetch.js.map +1 -1
- package/dist/GlobalLayer.d.ts.map +1 -1
- package/dist/GlobalLayer.js.map +1 -1
- package/dist/Html.js +3 -3
- package/dist/Html.js.map +1 -1
- package/dist/Password.d.ts +26 -0
- package/dist/Password.d.ts.map +1 -0
- package/dist/Password.js +83 -0
- package/dist/Password.js.map +1 -0
- package/dist/Route.d.ts.map +1 -1
- package/dist/Route.js +1 -1
- package/dist/Route.js.map +1 -1
- package/dist/RouteBody.d.ts +10 -5
- package/dist/RouteBody.d.ts.map +1 -1
- package/dist/RouteBody.js +6 -2
- package/dist/RouteBody.js.map +1 -1
- package/dist/RouteHttp.d.ts.map +1 -1
- package/dist/RouteHttp.js +10 -3
- package/dist/RouteHttp.js.map +1 -1
- package/dist/RouteSse.d.ts +3 -4
- package/dist/RouteSse.d.ts.map +1 -1
- package/dist/RouteSse.js +3 -3
- package/dist/RouteSse.js.map +1 -1
- package/dist/RouteTree.d.ts +20 -5
- package/dist/RouteTree.d.ts.map +1 -1
- package/dist/RouteTree.js +172 -40
- package/dist/RouteTree.js.map +1 -1
- package/dist/StaticFiles.d.ts +23 -0
- package/dist/StaticFiles.d.ts.map +1 -0
- package/dist/StaticFiles.js +74 -0
- package/dist/StaticFiles.js.map +1 -0
- package/dist/_Mime.d.ts +2 -0
- package/dist/_Mime.d.ts.map +1 -0
- package/dist/_Mime.js +33 -0
- package/dist/_Mime.js.map +1 -0
- package/dist/_PathPattern.js +4 -4
- package/dist/_PathPattern.js.map +1 -1
- package/dist/_StreamExtra.d.ts.map +1 -1
- package/dist/_StreamExtra.js +0 -1
- package/dist/_StreamExtra.js.map +1 -1
- package/dist/bun/BunRoute.d.ts.map +1 -1
- package/dist/bun/BunRoute.js +6 -0
- package/dist/bun/BunRoute.js.map +1 -1
- package/dist/bun/BunServer.d.ts +2 -0
- package/dist/bun/BunServer.d.ts.map +1 -1
- package/dist/bun/BunServer.js +18 -7
- package/dist/bun/BunServer.js.map +1 -1
- package/dist/studio/Studio.d.ts +1 -1
- package/dist/studio/Studio.d.ts.map +1 -1
- package/dist/studio/Studio.js +5 -4
- package/dist/studio/Studio.js.map +1 -1
- package/dist/studio/StudioErrors.d.ts.map +1 -1
- package/dist/studio/StudioErrors.js +2 -2
- package/dist/studio/StudioErrors.js.map +1 -1
- package/dist/studio/StudioLogger.d.ts.map +1 -1
- package/dist/studio/StudioLogger.js +1 -3
- package/dist/studio/StudioLogger.js.map +1 -1
- package/dist/studio/StudioStore.d.ts +23 -17
- package/dist/studio/StudioStore.d.ts.map +1 -1
- package/dist/studio/StudioStore.js +48 -44
- package/dist/studio/StudioStore.js.map +1 -1
- package/dist/studio/StudioTracer.d.ts.map +1 -1
- package/dist/studio/StudioTracer.js +10 -4
- package/dist/studio/StudioTracer.js.map +1 -1
- package/dist/studio/routes/errors/route.d.ts +2 -2
- package/dist/studio/routes/errors/route.d.ts.map +1 -1
- package/dist/studio/routes/errors/route.js +2 -2
- package/dist/studio/routes/errors/route.js.map +1 -1
- package/dist/studio/routes/fiberDetail.d.ts +1 -1
- package/dist/studio/routes/fiberDetail.js +4 -4
- package/dist/studio/routes/fiberDetail.js.map +1 -1
- package/dist/studio/routes/fibers/route.d.ts +3 -3
- package/dist/studio/routes/fibers/route.js +4 -4
- package/dist/studio/routes/fibers/route.js.map +1 -1
- package/dist/studio/routes/logs/route.d.ts +2 -2
- package/dist/studio/routes/logs/route.d.ts.map +1 -1
- package/dist/studio/routes/logs/route.js +2 -2
- package/dist/studio/routes/logs/route.js.map +1 -1
- package/dist/studio/routes/metrics/route.d.ts +1 -1
- package/dist/studio/routes/system/route.d.ts +1 -1
- package/dist/studio/routes/traceDetail.d.ts +1 -1
- package/dist/studio/routes/traceDetail.js +1 -1
- package/dist/studio/routes/traceDetail.js.map +1 -1
- package/dist/studio/routes/traces/route.d.ts +3 -3
- package/dist/studio/routes/traces/route.js +5 -5
- package/dist/studio/routes/traces/route.js.map +1 -1
- package/dist/studio/routes/tree.d.ts +14 -14
- package/dist/studio/ui/Traces.d.ts +1 -0
- package/dist/studio/ui/Traces.d.ts.map +1 -1
- package/dist/studio/ui/Traces.js +32 -11
- package/dist/studio/ui/Traces.js.map +1 -1
- package/package.json +2 -2
- package/src/Fetch.ts +2 -2
- package/src/GlobalLayer.ts +1 -3
- package/src/Html.ts +3 -3
- package/src/Password.ts +130 -0
- package/src/Route.ts +10 -12
- package/src/RouteBody.ts +36 -14
- package/src/RouteHttp.ts +14 -3
- package/src/RouteSse.ts +10 -10
- package/src/RouteTree.ts +252 -61
- package/src/StaticFiles.ts +112 -0
- package/src/_Mime.ts +33 -0
- package/src/_PathPattern.ts +4 -4
- package/src/_StreamExtra.ts +0 -1
- package/src/bun/BunRoute.ts +10 -0
- package/src/bun/BunServer.ts +33 -7
- package/src/studio/Studio.ts +6 -5
- package/src/studio/StudioErrors.ts +2 -3
- package/src/studio/StudioLogger.ts +2 -3
- package/src/studio/StudioStore.ts +159 -115
- package/src/studio/StudioTracer.ts +11 -5
- package/src/studio/routes/errors/route.tsx +4 -5
- package/src/studio/routes/fiberDetail.tsx +4 -4
- package/src/studio/routes/fibers/route.tsx +4 -4
- package/src/studio/routes/logs/route.tsx +3 -1
- package/src/studio/routes/traceDetail.tsx +1 -1
- package/src/studio/routes/traces/route.tsx +8 -8
- package/src/studio/ui/Traces.tsx +41 -13
package/dist/RouteSse.d.ts
CHANGED
|
@@ -5,17 +5,16 @@ import * as Entity from "./Entity.ts";
|
|
|
5
5
|
import * as Route from "./Route.ts";
|
|
6
6
|
import type * as Values from "./_Values.ts";
|
|
7
7
|
interface SseEvent {
|
|
8
|
-
readonly [key: string]: unknown;
|
|
9
8
|
readonly _tag?: string;
|
|
10
9
|
readonly data?: string | undefined;
|
|
11
|
-
readonly
|
|
10
|
+
readonly event?: string;
|
|
12
11
|
readonly retry?: number;
|
|
13
12
|
}
|
|
14
13
|
type SseHandlerInput<B, E, R> = Stream.Stream<SseEvent, E, R> | Effect.Effect<Stream.Stream<SseEvent, E, R>, E, R> | ((context: Values.Simplify<B>, next: (context?: Partial<B> & Record<string, unknown>) => Entity.Entity<string>) => Stream.Stream<SseEvent, E, R> | Effect.Effect<Stream.Stream<SseEvent, E, R>, E, R> | Generator<Utils.YieldWrap<Effect.Effect<unknown, E, R>>, Stream.Stream<SseEvent, E, R>, unknown>);
|
|
15
14
|
export declare function sse<D extends Route.RouteDescriptor.Any, B extends {}, I extends Route.Route.Tuple, E = never, R = never>(handler: SseHandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & {
|
|
16
|
-
format: "
|
|
15
|
+
format: "sse";
|
|
17
16
|
}>, E, R>): (self: Route.RouteSet.RouteSet<D, B, I>) => Route.RouteSet.RouteSet<D, B, [...I, Route.Route.Route<{
|
|
18
|
-
format: "
|
|
17
|
+
format: "sse";
|
|
19
18
|
}, {}, Stream.Stream<string, E, R>, E, R>]>;
|
|
20
19
|
export {};
|
|
21
20
|
//# sourceMappingURL=RouteSse.d.ts.map
|
package/dist/RouteSse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteSse.d.ts","sourceRoot":"","sources":["../src/RouteSse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAEnC,OAAO,KAAK,KAAK,MAAM,MAAM,cAAc,CAAA;AAK3C,UAAU,QAAQ;IAChB,QAAQ,
|
|
1
|
+
{"version":3,"file":"RouteSse.d.ts","sourceRoot":"","sources":["../src/RouteSse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAEnC,OAAO,KAAK,KAAK,MAAM,MAAM,cAAc,CAAA;AAK3C,UAAU,QAAQ;IAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AA0BD,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IACxB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,GAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAClD,CAAC,CACC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAE3B,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAE7E,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,GAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAClD,SAAS,CACP,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAC7C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,OAAO,CACR,CAAC,CAAA;AAEV,wBAAgB,GAAG,CACjB,CAAC,SAAS,KAAK,CAAC,eAAe,CAAC,GAAG,EACnC,CAAC,SAAS,EAAE,EACZ,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,KAAK,EAC3B,CAAC,GAAG,KAAK,EACT,CAAC,GAAG,KAAK,EACT,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG;IAAE,MAAM,EAAE,KAAK,CAAA;CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAC5E,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YA6DhB,KAAK;4CAG7C"}
|
package/dist/RouteSse.js
CHANGED
|
@@ -13,8 +13,8 @@ function formatSseEvent(event) {
|
|
|
13
13
|
return `event: ${event._tag}\ndata: ${json}\n\n`;
|
|
14
14
|
}
|
|
15
15
|
let result = "";
|
|
16
|
-
if (event.
|
|
17
|
-
result += `event: ${event.
|
|
16
|
+
if (event.event) {
|
|
17
|
+
result += `event: ${event.event}\n`;
|
|
18
18
|
}
|
|
19
19
|
if (typeof event.data === "string") {
|
|
20
20
|
for (const line of event.data.split("\n")) {
|
|
@@ -68,7 +68,7 @@ export function sse(handler) {
|
|
|
68
68
|
});
|
|
69
69
|
});
|
|
70
70
|
};
|
|
71
|
-
const route = Route.make(sseHandler, { format: "
|
|
71
|
+
const route = Route.make(sseHandler, { format: "sse" });
|
|
72
72
|
const items = [...Route.items(self), route];
|
|
73
73
|
return Route.set(items, Route.descriptor(self));
|
|
74
74
|
};
|
package/dist/RouteSse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteSse.js","sourceRoot":"","sources":["../src/RouteSse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAGhD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC9C,MAAM,SAAS,GAAG,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"RouteSse.js","sourceRoot":"","sources":["../src/RouteSse.ts"],"names":[],"mappings":"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"}
|
package/dist/RouteTree.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import * as PathPattern from "./_PathPattern.ts";
|
|
1
|
+
import type * as PathPattern from "./_PathPattern.ts";
|
|
2
2
|
import * as Route from "./Route.ts";
|
|
3
3
|
import type * as RouteMount from "./RouteMount.ts";
|
|
4
4
|
declare const TypeId: "~effect-start/RouteTree";
|
|
5
5
|
declare const RouteTreeRoutes: unique symbol;
|
|
6
|
+
declare const CompiledRoutesKey: unique symbol;
|
|
6
7
|
type MethodRoute = Route.Route.With<{
|
|
7
8
|
method: string;
|
|
8
9
|
}>;
|
|
@@ -21,9 +22,23 @@ export type RouteMap = {
|
|
|
21
22
|
[path: PathPattern.PathPattern]: Route.Route.Tuple;
|
|
22
23
|
};
|
|
23
24
|
export type Routes<T extends RouteTree> = T[typeof RouteTreeRoutes];
|
|
25
|
+
interface CompiledMethod {
|
|
26
|
+
regex: RegExp;
|
|
27
|
+
table: Array<{
|
|
28
|
+
path: PathPattern.PathPattern;
|
|
29
|
+
routes: Array<RouteMount.MountedRoute>;
|
|
30
|
+
paramNames: Array<string>;
|
|
31
|
+
paramGroupIndices: Array<number>;
|
|
32
|
+
sentinelIndex: number;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
interface CompiledRoutes {
|
|
36
|
+
methods: Record<string, CompiledMethod>;
|
|
37
|
+
}
|
|
24
38
|
export interface RouteTree<Routes extends RouteMap = RouteMap> {
|
|
25
39
|
[TypeId]: typeof TypeId;
|
|
26
40
|
[RouteTreeRoutes]: Routes;
|
|
41
|
+
[CompiledRoutesKey]?: CompiledRoutes;
|
|
27
42
|
}
|
|
28
43
|
type PrefixKeys<T, Prefix extends string> = {
|
|
29
44
|
[K in keyof T as K extends string ? `${Prefix}${K}` : never]: T[K];
|
|
@@ -41,18 +56,18 @@ type PrependLayers<T extends RouteMap, L extends Route.Route.Tuple> = {
|
|
|
41
56
|
[K in keyof T]: T[K] extends Route.Route.Tuple ? [...L, ...T[K]] : never;
|
|
42
57
|
};
|
|
43
58
|
type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
|
|
44
|
-
export declare function make<const Routes extends InputRouteMap>(input: Routes): RouteTree<FlattenRouteMap<Routes>>;
|
|
45
59
|
export type WalkDescriptor = {
|
|
46
60
|
path: PathPattern.PathPattern;
|
|
47
61
|
method: string;
|
|
48
62
|
} & Route.RouteDescriptor.Any;
|
|
49
|
-
export declare function walk(tree: RouteTree): Generator<RouteMount.MountedRoute>;
|
|
50
|
-
export declare function merge(a: RouteTree, b: RouteTree): RouteTree;
|
|
51
|
-
export declare function isRouteTree(input: unknown): input is RouteTree;
|
|
52
63
|
export interface LookupResult {
|
|
53
64
|
route: RouteMount.MountedRoute;
|
|
54
65
|
params: Record<string, string>;
|
|
55
66
|
}
|
|
67
|
+
export declare function make<const Routes extends InputRouteMap>(input: Routes): RouteTree<FlattenRouteMap<Routes>>;
|
|
68
|
+
export declare function walk(tree: RouteTree): Generator<RouteMount.MountedRoute>;
|
|
69
|
+
export declare function merge(a: RouteTree, b: RouteTree): RouteTree;
|
|
70
|
+
export declare function isRouteTree(input: unknown): input is RouteTree;
|
|
56
71
|
export declare function lookup(tree: RouteTree, method: string, path: string): LookupResult | null;
|
|
57
72
|
export {};
|
|
58
73
|
//# sourceMappingURL=RouteTree.d.ts.map
|
package/dist/RouteTree.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteTree.d.ts","sourceRoot":"","sources":["../src/RouteTree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"RouteTree.d.ts","sourceRoot":"","sources":["../src/RouteTree.ts"],"names":[],"mappings":"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"}
|
package/dist/RouteTree.js
CHANGED
|
@@ -1,31 +1,9 @@
|
|
|
1
1
|
import * as Predicate from "effect/Predicate";
|
|
2
|
-
import * as PathPattern from "./_PathPattern.js";
|
|
3
2
|
import * as Route from "./Route.js";
|
|
4
3
|
const TypeId = "~effect-start/RouteTree";
|
|
5
4
|
const RouteTreeRoutes = Symbol();
|
|
5
|
+
const CompiledRoutesKey = Symbol();
|
|
6
6
|
const LayerKey = "*";
|
|
7
|
-
function routes(tree) {
|
|
8
|
-
return tree[RouteTreeRoutes];
|
|
9
|
-
}
|
|
10
|
-
// segment priority: static (0) < :param (1) < :param? (2) < :param+ (3) < :param* (4)
|
|
11
|
-
function sortScore(path) {
|
|
12
|
-
const segments = path.split("/");
|
|
13
|
-
const greedyIdx = segments.findIndex((s) => s.endsWith("*") || s.endsWith("+"));
|
|
14
|
-
const maxPriority = Math.max(...segments.map((s) => !s.startsWith(":") ? 0 : s.endsWith("*") ? 4 : s.endsWith("+") ? 3 : s.endsWith("?") ? 2 : 1), 0);
|
|
15
|
-
return greedyIdx === -1
|
|
16
|
-
? // non-greedy: sort by depth, then by max segment priority
|
|
17
|
-
(segments.length << 16) + (maxPriority << 8)
|
|
18
|
-
: // greedy: sort after non-greedy, by greedy position (later = first), then priority
|
|
19
|
-
(1 << 24) + ((16 - greedyIdx) << 16) + (maxPriority << 8);
|
|
20
|
-
}
|
|
21
|
-
function sortRoutes(input) {
|
|
22
|
-
const keys = Object.keys(input).sort((a, b) => sortScore(a) - sortScore(b) || a.localeCompare(b));
|
|
23
|
-
const sorted = {};
|
|
24
|
-
for (const key of keys) {
|
|
25
|
-
sorted[key] = input[key];
|
|
26
|
-
}
|
|
27
|
-
return sorted;
|
|
28
|
-
}
|
|
29
7
|
export function make(input) {
|
|
30
8
|
const layerRoutes = [...(input[LayerKey] ?? [])];
|
|
31
9
|
const merged = {};
|
|
@@ -45,20 +23,12 @@ export function make(input) {
|
|
|
45
23
|
}
|
|
46
24
|
}
|
|
47
25
|
flatten(input, "", layerRoutes);
|
|
26
|
+
const sorted = sortRoutes(merged);
|
|
48
27
|
return {
|
|
49
28
|
[TypeId]: TypeId,
|
|
50
|
-
[RouteTreeRoutes]:
|
|
29
|
+
[RouteTreeRoutes]: sorted,
|
|
51
30
|
};
|
|
52
31
|
}
|
|
53
|
-
function* flattenRoutes(path, routes) {
|
|
54
|
-
for (const route of routes) {
|
|
55
|
-
const descriptor = {
|
|
56
|
-
...route[Route.RouteDescriptor],
|
|
57
|
-
path,
|
|
58
|
-
};
|
|
59
|
-
yield Route.make(route.handler, descriptor);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
32
|
export function* walk(tree) {
|
|
63
33
|
const _routes = routes(tree);
|
|
64
34
|
for (const path of Object.keys(_routes)) {
|
|
@@ -71,23 +41,185 @@ export function merge(a, b) {
|
|
|
71
41
|
const key = path;
|
|
72
42
|
combined[key] = combined[key] ? [...combined[key], ...items] : items;
|
|
73
43
|
}
|
|
44
|
+
const sorted = sortRoutes(combined);
|
|
74
45
|
return {
|
|
75
46
|
[TypeId]: TypeId,
|
|
76
|
-
[RouteTreeRoutes]:
|
|
47
|
+
[RouteTreeRoutes]: sorted,
|
|
77
48
|
};
|
|
78
49
|
}
|
|
79
50
|
export function isRouteTree(input) {
|
|
80
51
|
return Predicate.hasProperty(input, TypeId);
|
|
81
52
|
}
|
|
82
53
|
export function lookup(tree, method, path) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
54
|
+
tree[CompiledRoutesKey] ??= compileRoutes(routes(tree));
|
|
55
|
+
const { methods } = tree[CompiledRoutesKey];
|
|
56
|
+
const wildcard = methods["*"];
|
|
57
|
+
if (wildcard) {
|
|
58
|
+
const result = execCompiled(wildcard, path);
|
|
59
|
+
if (result)
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
const specific = methods[method];
|
|
63
|
+
if (specific) {
|
|
64
|
+
const result = execCompiled(specific, path);
|
|
65
|
+
if (result)
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
function routes(tree) {
|
|
71
|
+
return tree[RouteTreeRoutes];
|
|
72
|
+
}
|
|
73
|
+
// segment priority: static (0) < :param (1) < :param? (2) < :param+ (3) < :param* (4)
|
|
74
|
+
function sortScore(path) {
|
|
75
|
+
const segments = path.split("/");
|
|
76
|
+
const greedyIdx = segments.findIndex((s) => s.endsWith("*") || s.endsWith("+"));
|
|
77
|
+
const maxPriority = Math.max(...segments.map((s) => !s.startsWith(":") ? 0 : s.endsWith("*") ? 4 : s.endsWith("+") ? 3 : s.endsWith("?") ? 2 : 1), 0);
|
|
78
|
+
return greedyIdx === -1
|
|
79
|
+
? // non-greedy: sort by depth, then by max segment priority
|
|
80
|
+
(segments.length << 16) + (maxPriority << 8)
|
|
81
|
+
: // greedy: sort after non-greedy, by greedy position (later = first), then priority
|
|
82
|
+
(1 << 24) + ((16 - greedyIdx) << 16) + (maxPriority << 8);
|
|
83
|
+
}
|
|
84
|
+
function sortRoutes(input) {
|
|
85
|
+
const keys = Object.keys(input).sort((a, b) => sortScore(a) - sortScore(b) || a.localeCompare(b));
|
|
86
|
+
const sorted = {};
|
|
87
|
+
for (const key of keys) {
|
|
88
|
+
sorted[key] = input[key];
|
|
89
|
+
}
|
|
90
|
+
return sorted;
|
|
91
|
+
}
|
|
92
|
+
function* flattenRoutes(path, routes) {
|
|
93
|
+
for (const route of routes) {
|
|
94
|
+
const descriptor = {
|
|
95
|
+
...route[Route.RouteDescriptor],
|
|
96
|
+
path,
|
|
97
|
+
};
|
|
98
|
+
yield Route.make(route.handler, descriptor);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function escapeRegex(s) {
|
|
102
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
103
|
+
}
|
|
104
|
+
function patternToRegex(pattern) {
|
|
105
|
+
const segments = pattern.split("/").filter(Boolean);
|
|
106
|
+
const paramNames = [];
|
|
107
|
+
let fragment = "";
|
|
108
|
+
let groupCount = 0;
|
|
109
|
+
for (let i = 0; i < segments.length; i++) {
|
|
110
|
+
const seg = segments[i];
|
|
111
|
+
if (seg.startsWith(":")) {
|
|
112
|
+
const last = seg[seg.length - 1];
|
|
113
|
+
if (last === "+") {
|
|
114
|
+
const name = seg.slice(1, -1);
|
|
115
|
+
paramNames.push(name);
|
|
116
|
+
fragment += "\\/(.+)";
|
|
117
|
+
groupCount++;
|
|
118
|
+
}
|
|
119
|
+
else if (last === "*") {
|
|
120
|
+
const name = seg.slice(1, -1);
|
|
121
|
+
paramNames.push(name);
|
|
122
|
+
fragment += "(?:\\/(.+))?";
|
|
123
|
+
groupCount++;
|
|
124
|
+
}
|
|
125
|
+
else if (last === "?") {
|
|
126
|
+
const name = seg.slice(1, -1);
|
|
127
|
+
paramNames.push(name);
|
|
128
|
+
fragment += "(?:\\/([^\\/]+))?";
|
|
129
|
+
groupCount++;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const name = seg.slice(1);
|
|
133
|
+
paramNames.push(name);
|
|
134
|
+
fragment += "\\/([^\\/]+)";
|
|
135
|
+
groupCount++;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
fragment += "\\/" + escapeRegex(seg);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { fragment, paramNames, groupCount };
|
|
143
|
+
}
|
|
144
|
+
function compileRoutes(sortedRoutes) {
|
|
145
|
+
const methodGroups = {};
|
|
146
|
+
for (const path of Object.keys(sortedRoutes)) {
|
|
147
|
+
for (const routeData of sortedRoutes[path]) {
|
|
148
|
+
const descriptor = {
|
|
149
|
+
...routeData[Route.RouteDescriptor],
|
|
150
|
+
path,
|
|
151
|
+
};
|
|
152
|
+
const mounted = Route.make(routeData.handler, descriptor);
|
|
153
|
+
const method = descriptor.method;
|
|
154
|
+
if (!methodGroups[method])
|
|
155
|
+
methodGroups[method] = [];
|
|
156
|
+
methodGroups[method].push({ path, route: mounted });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const pathRoutesByMethod = {};
|
|
160
|
+
for (const method of Object.keys(methodGroups)) {
|
|
161
|
+
const map = new Map();
|
|
162
|
+
for (const { path, route } of methodGroups[method]) {
|
|
163
|
+
let entry = map.get(path);
|
|
164
|
+
if (!entry) {
|
|
165
|
+
entry = { path, routes: [] };
|
|
166
|
+
map.set(path, entry);
|
|
167
|
+
}
|
|
168
|
+
entry.routes.push(route);
|
|
169
|
+
}
|
|
170
|
+
pathRoutesByMethod[method] = map;
|
|
171
|
+
}
|
|
172
|
+
const methods = {};
|
|
173
|
+
for (const method of Object.keys(pathRoutesByMethod)) {
|
|
174
|
+
const pathMap = pathRoutesByMethod[method];
|
|
175
|
+
const sortedPaths = Object.keys(sortedRoutes);
|
|
176
|
+
const orderedPaths = sortedPaths.filter((p) => pathMap.has(p));
|
|
177
|
+
const branches = [];
|
|
178
|
+
const table = [];
|
|
179
|
+
let groupOffset = 1;
|
|
180
|
+
for (const path of orderedPaths) {
|
|
181
|
+
const entry = pathMap.get(path);
|
|
182
|
+
const { fragment, paramNames, groupCount } = patternToRegex(path);
|
|
183
|
+
const paramGroupIndices = [];
|
|
184
|
+
for (let i = 0; i < groupCount; i++) {
|
|
185
|
+
paramGroupIndices.push(groupOffset + i);
|
|
186
|
+
}
|
|
187
|
+
const sentinelIndex = groupOffset + groupCount;
|
|
188
|
+
branches.push(fragment + "()");
|
|
189
|
+
groupOffset += groupCount + 1;
|
|
190
|
+
table.push({
|
|
191
|
+
path: entry.path,
|
|
192
|
+
routes: entry.routes,
|
|
193
|
+
paramNames,
|
|
194
|
+
paramGroupIndices,
|
|
195
|
+
sentinelIndex,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (branches.length === 0)
|
|
86
199
|
continue;
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
200
|
+
const pattern = "^(?:" + branches.join("|") + ")\\/*$";
|
|
201
|
+
methods[method] = {
|
|
202
|
+
regex: new RegExp(pattern),
|
|
203
|
+
table,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return { methods };
|
|
207
|
+
}
|
|
208
|
+
function execCompiled(compiled, path) {
|
|
209
|
+
const match = compiled.regex.exec(path);
|
|
210
|
+
if (!match)
|
|
211
|
+
return null;
|
|
212
|
+
for (const entry of compiled.table) {
|
|
213
|
+
if (match[entry.sentinelIndex] === undefined)
|
|
214
|
+
continue;
|
|
215
|
+
const params = {};
|
|
216
|
+
for (let i = 0; i < entry.paramNames.length; i++) {
|
|
217
|
+
const val = match[entry.paramGroupIndices[i]];
|
|
218
|
+
if (val !== undefined) {
|
|
219
|
+
params[entry.paramNames[i]] = val;
|
|
220
|
+
}
|
|
90
221
|
}
|
|
222
|
+
return { route: entry.routes[0], params };
|
|
91
223
|
}
|
|
92
224
|
return null;
|
|
93
225
|
}
|
package/dist/RouteTree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteTree.js","sourceRoot":"","sources":["../src/RouteTree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"RouteTree.js","sourceRoot":"","sources":["../src/RouteTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as Layer from "effect/Layer";
|
|
2
|
+
import * as FileSystem from "./FileSystem.ts";
|
|
3
|
+
import * as Route from "./Route.ts";
|
|
4
|
+
import * as System from "./System.ts";
|
|
5
|
+
export declare const make: (directory: string) => import("./RouteMount.ts").RouteMount.Builder<{}, [Route.Route.Route<{
|
|
6
|
+
method: "GET";
|
|
7
|
+
}, {
|
|
8
|
+
pathParams: {
|
|
9
|
+
readonly path?: string | undefined;
|
|
10
|
+
};
|
|
11
|
+
}, unknown, import("effect/ParseResult").ParseError, never>, Route.Route.Route<{
|
|
12
|
+
method: "GET";
|
|
13
|
+
format: "*";
|
|
14
|
+
}, {
|
|
15
|
+
pathParams: {
|
|
16
|
+
readonly path?: string | undefined;
|
|
17
|
+
};
|
|
18
|
+
}, Uint8Array<ArrayBufferLike>, System.SystemError, FileSystem.FileSystem>]>;
|
|
19
|
+
export declare const layer: (options: {
|
|
20
|
+
directory: string;
|
|
21
|
+
path?: string;
|
|
22
|
+
}) => Layer.Layer<Route.Routes, never, never>;
|
|
23
|
+
//# sourceMappingURL=StaticFiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StaticFiles.d.ts","sourceRoot":"","sources":["../src/StaticFiles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAIrC,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAGnC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AASrC,eAAO,MAAM,IAAI,GAAI,WAAW,MAAM;;;;;;;;;;;;;4EAmCnC,CAAA;AAEH,eAAO,MAAM,KAAK,GAAI,SAAS;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,4CAmBE,CAAA"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import * as Option from "effect/Option";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import * as Entity from "./Entity.js";
|
|
6
|
+
import * as FileSystem from "./FileSystem.js";
|
|
7
|
+
import * as Mime from "./_Mime.js";
|
|
8
|
+
import * as Route from "./Route.js";
|
|
9
|
+
import * as RouteSchema from "./RouteSchema.js";
|
|
10
|
+
import * as RouteTree from "./RouteTree.js";
|
|
11
|
+
const defaultMountPath = "/assets";
|
|
12
|
+
const PathParamsSchema = Schema.Struct({
|
|
13
|
+
path: Schema.optional(Schema.String),
|
|
14
|
+
});
|
|
15
|
+
const emptyNotFound = Entity.make(new Uint8Array(0), { status: 404 });
|
|
16
|
+
export const make = (directory) => Route.get(RouteSchema.schemaPathParams(PathParamsSchema), Route.render(function* (ctx) {
|
|
17
|
+
const fs = yield* FileSystem.FileSystem;
|
|
18
|
+
const relativePath = typeof ctx.pathParams.path === "string" ? normalizeRelativePath(ctx.pathParams.path) : null;
|
|
19
|
+
if (!relativePath) {
|
|
20
|
+
return emptyNotFound;
|
|
21
|
+
}
|
|
22
|
+
const absolutePath = `${directory.replace(/[\\/]+$/, "")}/${relativePath}`;
|
|
23
|
+
const info = yield* fs.stat(absolutePath).pipe(Effect.catchAll((error) => isNotFound(error) ? Effect.succeed(null) : Effect.fail(error)));
|
|
24
|
+
if (info === null || info.type !== "File") {
|
|
25
|
+
return emptyNotFound;
|
|
26
|
+
}
|
|
27
|
+
const headers = {
|
|
28
|
+
"content-length": String(info.size),
|
|
29
|
+
"content-type": Mime.fromPath(relativePath),
|
|
30
|
+
};
|
|
31
|
+
if (Option.isSome(info.mtime)) {
|
|
32
|
+
headers["last-modified"] = info.mtime.value.toUTCString();
|
|
33
|
+
}
|
|
34
|
+
const bytes = yield* fs.readFile(absolutePath);
|
|
35
|
+
return Entity.make(bytes, { headers });
|
|
36
|
+
}));
|
|
37
|
+
export const layer = (options) => Layer.effect(Route.Routes, Effect.gen(function* () {
|
|
38
|
+
const existing = yield* Effect.serviceOption(Route.Routes).pipe(Effect.andThen(Option.getOrUndefined));
|
|
39
|
+
const trimmedMountPath = (options.path ?? defaultMountPath).trim().replace(/^\/+|\/+$/g, "");
|
|
40
|
+
const mountPattern = (trimmedMountPath.length > 0 ? `/${trimmedMountPath}/:path+` : "/:path+");
|
|
41
|
+
const staticFilesTree = Route.tree({
|
|
42
|
+
[mountPattern]: make(options.directory),
|
|
43
|
+
});
|
|
44
|
+
if (!existing) {
|
|
45
|
+
return staticFilesTree;
|
|
46
|
+
}
|
|
47
|
+
return RouteTree.merge(existing, staticFilesTree);
|
|
48
|
+
}));
|
|
49
|
+
function normalizeRelativePath(path) {
|
|
50
|
+
if (path.length === 0 || path.startsWith("/") || path.startsWith("\\")) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const segments = path.split(/[\\/]+/);
|
|
54
|
+
const normalized = [];
|
|
55
|
+
for (const segment of segments) {
|
|
56
|
+
if (segment === "" || segment === ".") {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (segment === ".." || segment.includes("\0")) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
normalized.push(segment);
|
|
63
|
+
}
|
|
64
|
+
return normalized.length > 0 ? normalized.join("/") : null;
|
|
65
|
+
}
|
|
66
|
+
function isNotFound(error) {
|
|
67
|
+
return (typeof error === "object" &&
|
|
68
|
+
error !== null &&
|
|
69
|
+
"_tag" in error &&
|
|
70
|
+
error._tag === "SystemError" &&
|
|
71
|
+
"reason" in error &&
|
|
72
|
+
error.reason === "NotFound");
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=StaticFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StaticFiles.js","sourceRoot":"","sources":["../src/StaticFiles.ts"],"names":[],"mappings":"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"}
|
package/dist/_Mime.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_Mime.d.ts","sourceRoot":"","sources":["../src/_Mime.ts"],"names":[],"mappings":"AA2BA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7C"}
|
package/dist/_Mime.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const mediaTypes = {
|
|
2
|
+
".avif": "image/avif",
|
|
3
|
+
".bmp": "image/bmp",
|
|
4
|
+
".css": "text/css",
|
|
5
|
+
".csv": "text/csv",
|
|
6
|
+
".gif": "image/gif",
|
|
7
|
+
".html": "text/html",
|
|
8
|
+
".ico": "image/x-icon",
|
|
9
|
+
".js": "text/javascript",
|
|
10
|
+
".jpeg": "image/jpeg",
|
|
11
|
+
".jpg": "image/jpeg",
|
|
12
|
+
".json": "application/json",
|
|
13
|
+
".map": "application/json",
|
|
14
|
+
".md": "text/markdown",
|
|
15
|
+
".mjs": "text/javascript",
|
|
16
|
+
".pdf": "application/pdf",
|
|
17
|
+
".png": "image/png",
|
|
18
|
+
".svg": "image/svg+xml",
|
|
19
|
+
".txt": "text/plain",
|
|
20
|
+
".wasm": "application/wasm",
|
|
21
|
+
".webm": "video/webm",
|
|
22
|
+
".webp": "image/webp",
|
|
23
|
+
".woff": "font/woff",
|
|
24
|
+
".woff2": "font/woff2",
|
|
25
|
+
".xml": "application/xml",
|
|
26
|
+
};
|
|
27
|
+
export function fromPath(path) {
|
|
28
|
+
const dotIndex = path.lastIndexOf(".");
|
|
29
|
+
const extension = dotIndex === -1 ? "" : path.slice(dotIndex).toLowerCase();
|
|
30
|
+
const mediaType = mediaTypes[extension] ?? "application/octet-stream";
|
|
31
|
+
return mediaType.startsWith("text/") ? `${mediaType}; charset=utf-8` : mediaType;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=_Mime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_Mime.js","sourceRoot":"","sources":["../src/_Mime.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE,iBAAiB;IACxB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,kBAAkB;IAC3B,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,iBAAiB;CAC1B,CAAA;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,SAAS,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IAC3E,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,0BAA0B,CAAA;IACrE,OAAO,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAA;AAClF,CAAC"}
|
package/dist/_PathPattern.js
CHANGED
|
@@ -122,21 +122,21 @@ export function match(pattern, path) {
|
|
|
122
122
|
if (remaining.length === 0) {
|
|
123
123
|
return null;
|
|
124
124
|
}
|
|
125
|
-
params[name] = remaining.join("/");
|
|
125
|
+
params[name] = remaining.map(decodeURIComponent).join("/");
|
|
126
126
|
return params;
|
|
127
127
|
}
|
|
128
128
|
if (rest.endsWith("*")) {
|
|
129
129
|
const name = rest.slice(0, -1);
|
|
130
130
|
const remaining = pathSegments.slice(pathIndex);
|
|
131
131
|
if (remaining.length > 0) {
|
|
132
|
-
params[name] = remaining.join("/");
|
|
132
|
+
params[name] = remaining.map(decodeURIComponent).join("/");
|
|
133
133
|
}
|
|
134
134
|
return params;
|
|
135
135
|
}
|
|
136
136
|
if (rest.endsWith("?")) {
|
|
137
137
|
const name = rest.slice(0, -1);
|
|
138
138
|
if (pathIndex < pathSegments.length) {
|
|
139
|
-
params[name] = pathSegments[pathIndex];
|
|
139
|
+
params[name] = decodeURIComponent(pathSegments[pathIndex]);
|
|
140
140
|
pathIndex++;
|
|
141
141
|
}
|
|
142
142
|
patternIndex++;
|
|
@@ -145,7 +145,7 @@ export function match(pattern, path) {
|
|
|
145
145
|
if (pathIndex >= pathSegments.length) {
|
|
146
146
|
return null;
|
|
147
147
|
}
|
|
148
|
-
params[rest] = pathSegments[pathIndex];
|
|
148
|
+
params[rest] = decodeURIComponent(pathSegments[pathIndex]);
|
|
149
149
|
pathIndex++;
|
|
150
150
|
patternIndex++;
|
|
151
151
|
continue;
|