effect-start 0.23.1 → 0.26.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/package.json +18 -86
- package/src/Development.ts +3 -1
- package/src/Entity.ts +17 -0
- package/src/Fetch.ts +271 -0
- package/src/SqlIntrospect.ts +64 -70
- package/src/Start.ts +21 -24
- package/src/StartApp.ts +1 -1
- package/src/bun/BunServer.ts +42 -10
- package/src/hyper/HyperHtml.ts +0 -1
- package/src/sql/bun/index.ts +1 -1
- package/src/sql/index.ts +1 -0
- package/src/sql/libsql/index.ts +173 -0
- package/src/sql/libsql/libsql.d.ts +39 -0
- package/src/sql/mssql/index.ts +1 -1
- package/dist/BlobStore.d.ts +0 -80
- package/dist/BlobStore.js +0 -19
- package/dist/ChildProcess.d.ts +0 -60
- package/dist/ChildProcess.js +0 -30
- package/dist/Commander.d.ts +0 -100
- package/dist/Commander.js +0 -326
- package/dist/ContentNegotiation.d.ts +0 -12
- package/dist/ContentNegotiation.js +0 -359
- package/dist/Cookies.d.ts +0 -47
- package/dist/Cookies.js +0 -302
- package/dist/Development.d.ts +0 -39
- package/dist/Development.js +0 -58
- package/dist/Effectify.d.ts +0 -209
- package/dist/Effectify.js +0 -19
- package/dist/Entity.d.ts +0 -47
- package/dist/Entity.js +0 -224
- package/dist/FilePathPattern.d.ts +0 -29
- package/dist/FilePathPattern.js +0 -86
- package/dist/FileRouter.d.ts +0 -56
- package/dist/FileRouter.js +0 -148
- package/dist/FileRouterCodegen.d.ts +0 -18
- package/dist/FileRouterCodegen.js +0 -227
- package/dist/FileRouterPattern.d.ts +0 -9
- package/dist/FileRouterPattern.js +0 -35
- package/dist/FileSystem.d.ts +0 -158
- package/dist/FileSystem.js +0 -70
- package/dist/Http.d.ts +0 -37
- package/dist/Http.js +0 -88
- package/dist/HttpAppExtra.d.ts +0 -7
- package/dist/HttpAppExtra.js +0 -320
- package/dist/HttpUtils.d.ts +0 -3
- package/dist/HttpUtils.js +0 -11
- package/dist/PathPattern.d.ts +0 -134
- package/dist/PathPattern.js +0 -413
- package/dist/PlatformError.d.ts +0 -38
- package/dist/PlatformError.js +0 -25
- package/dist/PlatformRuntime.d.ts +0 -27
- package/dist/PlatformRuntime.js +0 -46
- package/dist/Route.d.ts +0 -97
- package/dist/Route.js +0 -100
- package/dist/RouteBody.d.ts +0 -47
- package/dist/RouteBody.js +0 -67
- package/dist/RouteError.d.ts +0 -98
- package/dist/RouteError.js +0 -55
- package/dist/RouteHook.d.ts +0 -12
- package/dist/RouteHook.js +0 -40
- package/dist/RouteHttp.d.ts +0 -21
- package/dist/RouteHttp.js +0 -258
- package/dist/RouteHttpTracer.d.ts +0 -10
- package/dist/RouteHttpTracer.js +0 -62
- package/dist/RouteMount.d.ts +0 -86
- package/dist/RouteMount.js +0 -63
- package/dist/RouteSchema.d.ts +0 -86
- package/dist/RouteSchema.js +0 -188
- package/dist/RouteSse.d.ts +0 -21
- package/dist/RouteSse.js +0 -79
- package/dist/RouteTree.d.ts +0 -57
- package/dist/RouteTree.js +0 -93
- package/dist/RouteTrie.d.ts +0 -20
- package/dist/RouteTrie.js +0 -152
- package/dist/RouterPattern.d.ts +0 -118
- package/dist/RouterPattern.js +0 -269
- package/dist/SchemaExtra.d.ts +0 -7
- package/dist/SchemaExtra.js +0 -74
- package/dist/Socket.d.ts +0 -27
- package/dist/Socket.js +0 -29
- package/dist/Sql.d.ts +0 -34
- package/dist/Sql.js +0 -5
- package/dist/SqlIntrospect.d.ts +0 -91
- package/dist/SqlIntrospect.js +0 -466
- package/dist/Start.d.ts +0 -44
- package/dist/Start.js +0 -49
- package/dist/StartApp.d.ts +0 -19
- package/dist/StartApp.js +0 -21
- package/dist/StreamExtra.d.ts +0 -28
- package/dist/StreamExtra.js +0 -100
- package/dist/System.d.ts +0 -7
- package/dist/System.js +0 -22
- package/dist/TuplePathPattern.d.ts +0 -9
- package/dist/TuplePathPattern.js +0 -68
- package/dist/Unique.d.ts +0 -50
- package/dist/Unique.js +0 -187
- package/dist/Values.d.ts +0 -27
- package/dist/Values.js +0 -36
- package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
- package/dist/bun/BunBlobStoreDisk.js +0 -116
- package/dist/bun/BunBlobStoreS3.d.ts +0 -11
- package/dist/bun/BunBlobStoreS3.js +0 -89
- package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
- package/dist/bun/BunBlobWatcherDisk.js +0 -60
- package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
- package/dist/bun/BunBlobWatcherQueue.js +0 -17
- package/dist/bun/BunBundle.d.ts +0 -11
- package/dist/bun/BunBundle.js +0 -137
- package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
- package/dist/bun/BunChildProcessSpawner.js +0 -103
- package/dist/bun/BunHttpServer.d.ts +0 -44
- package/dist/bun/BunHttpServer.js +0 -186
- package/dist/bun/BunHttpServer_web.d.ts +0 -60
- package/dist/bun/BunHttpServer_web.js +0 -252
- package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
- package/dist/bun/BunImportTrackerPlugin.js +0 -69
- package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
- package/dist/bun/BunPlatformHttpServer.js +0 -53
- package/dist/bun/BunRoute.d.ts +0 -48
- package/dist/bun/BunRoute.js +0 -121
- package/dist/bun/BunRuntime.d.ts +0 -2
- package/dist/bun/BunRuntime.js +0 -31
- package/dist/bun/BunServer.d.ts +0 -40
- package/dist/bun/BunServer.js +0 -157
- package/dist/bun/BunServerRequest.d.ts +0 -60
- package/dist/bun/BunServerRequest.js +0 -252
- package/dist/bun/BunSql.d.ts +0 -4
- package/dist/bun/BunSql.js +0 -81
- package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
- package/dist/bun/BunVirtualFilesPlugin.js +0 -40
- package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
- package/dist/bun/_BunEnhancedResolve.js +0 -102
- package/dist/bun/index.d.ts +0 -5
- package/dist/bun/index.js +0 -5
- package/dist/bundler/Bundle.d.ts +0 -61
- package/dist/bundler/Bundle.js +0 -48
- package/dist/bundler/BundleFiles.d.ts +0 -13
- package/dist/bundler/BundleFiles.js +0 -96
- package/dist/bundler/BundleHttp.d.ts +0 -45
- package/dist/bundler/BundleHttp.js +0 -176
- package/dist/bundler/BundleRoute.d.ts +0 -27
- package/dist/bundler/BundleRoute.js +0 -51
- package/dist/client/Overlay.d.ts +0 -2
- package/dist/client/Overlay.js +0 -32
- package/dist/client/ScrollState.d.ts +0 -6
- package/dist/client/ScrollState.js +0 -94
- package/dist/client/index.d.ts +0 -6
- package/dist/client/index.js +0 -79
- package/dist/console/Console.d.ts +0 -6
- package/dist/console/Console.js +0 -26
- package/dist/console/ConsoleErrors.d.ts +0 -3
- package/dist/console/ConsoleErrors.js +0 -200
- package/dist/console/ConsoleLogger.d.ts +0 -3
- package/dist/console/ConsoleLogger.js +0 -47
- package/dist/console/ConsoleMetrics.d.ts +0 -3
- package/dist/console/ConsoleMetrics.js +0 -61
- package/dist/console/ConsoleProcess.d.ts +0 -3
- package/dist/console/ConsoleProcess.js +0 -49
- package/dist/console/ConsoleStore.d.ts +0 -144
- package/dist/console/ConsoleStore.js +0 -61
- package/dist/console/ConsoleTracer.d.ts +0 -3
- package/dist/console/ConsoleTracer.js +0 -94
- package/dist/console/Simulation.d.ts +0 -2
- package/dist/console/Simulation.js +0 -633
- package/dist/console/index.d.ts +0 -3
- package/dist/console/index.js +0 -3
- package/dist/console/routes/errors/route.d.ts +0 -10
- package/dist/console/routes/errors/route.js +0 -47
- package/dist/console/routes/fiberDetail.d.ts +0 -16
- package/dist/console/routes/fiberDetail.js +0 -38
- package/dist/console/routes/fibers/route.d.ts +0 -10
- package/dist/console/routes/fibers/route.js +0 -19
- package/dist/console/routes/git/route.d.ts +0 -11
- package/dist/console/routes/git/route.js +0 -33
- package/dist/console/routes/layout.d.ts +0 -9
- package/dist/console/routes/layout.js +0 -3
- package/dist/console/routes/logs/route.d.ts +0 -10
- package/dist/console/routes/logs/route.js +0 -32
- package/dist/console/routes/metrics/route.d.ts +0 -10
- package/dist/console/routes/metrics/route.js +0 -17
- package/dist/console/routes/route.d.ts +0 -6
- package/dist/console/routes/route.js +0 -5
- package/dist/console/routes/routes/route.d.ts +0 -6
- package/dist/console/routes/routes/route.js +0 -20
- package/dist/console/routes/services/route.d.ts +0 -6
- package/dist/console/routes/services/route.js +0 -12
- package/dist/console/routes/system/route.d.ts +0 -10
- package/dist/console/routes/system/route.js +0 -18
- package/dist/console/routes/traceDetail.d.ts +0 -16
- package/dist/console/routes/traceDetail.js +0 -14
- package/dist/console/routes/traces/route.d.ts +0 -10
- package/dist/console/routes/traces/route.js +0 -39
- package/dist/console/routes/tree.d.ts +0 -153
- package/dist/console/routes/tree.js +0 -29
- package/dist/console/ui/Errors.d.ts +0 -4
- package/dist/console/ui/Errors.js +0 -15
- package/dist/console/ui/Fibers.d.ts +0 -24
- package/dist/console/ui/Fibers.js +0 -121
- package/dist/console/ui/Git.d.ts +0 -20
- package/dist/console/ui/Git.js +0 -95
- package/dist/console/ui/Logs.d.ts +0 -4
- package/dist/console/ui/Logs.js +0 -25
- package/dist/console/ui/Metrics.d.ts +0 -4
- package/dist/console/ui/Metrics.js +0 -26
- package/dist/console/ui/Routes.d.ts +0 -8
- package/dist/console/ui/Routes.js +0 -70
- package/dist/console/ui/Services.d.ts +0 -10
- package/dist/console/ui/Services.js +0 -246
- package/dist/console/ui/Shell.d.ts +0 -10
- package/dist/console/ui/Shell.js +0 -7
- package/dist/console/ui/System.d.ts +0 -4
- package/dist/console/ui/System.js +0 -35
- package/dist/console/ui/Traces.d.ts +0 -12
- package/dist/console/ui/Traces.js +0 -179
- package/dist/datastar/actions/fetch.d.ts +0 -30
- package/dist/datastar/actions/fetch.js +0 -403
- package/dist/datastar/actions/peek.d.ts +0 -1
- package/dist/datastar/actions/peek.js +0 -13
- package/dist/datastar/actions/setAll.d.ts +0 -1
- package/dist/datastar/actions/setAll.js +0 -12
- package/dist/datastar/actions/toggleAll.d.ts +0 -1
- package/dist/datastar/actions/toggleAll.js +0 -12
- package/dist/datastar/attributes/attr.d.ts +0 -1
- package/dist/datastar/attributes/attr.js +0 -48
- package/dist/datastar/attributes/bind.d.ts +0 -1
- package/dist/datastar/attributes/bind.js +0 -175
- package/dist/datastar/attributes/class.d.ts +0 -1
- package/dist/datastar/attributes/class.js +0 -47
- package/dist/datastar/attributes/computed.d.ts +0 -1
- package/dist/datastar/attributes/computed.js +0 -26
- package/dist/datastar/attributes/effect.d.ts +0 -1
- package/dist/datastar/attributes/effect.js +0 -9
- package/dist/datastar/attributes/indicator.d.ts +0 -1
- package/dist/datastar/attributes/indicator.js +0 -30
- package/dist/datastar/attributes/init.d.ts +0 -1
- package/dist/datastar/attributes/init.js +0 -26
- package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
- package/dist/datastar/attributes/jsonSignals.js +0 -30
- package/dist/datastar/attributes/on.d.ts +0 -1
- package/dist/datastar/attributes/on.js +0 -78
- package/dist/datastar/attributes/onIntersect.d.ts +0 -1
- package/dist/datastar/attributes/onIntersect.js +0 -53
- package/dist/datastar/attributes/onInterval.d.ts +0 -1
- package/dist/datastar/attributes/onInterval.js +0 -30
- package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
- package/dist/datastar/attributes/onSignalPatch.js +0 -42
- package/dist/datastar/attributes/ref.d.ts +0 -1
- package/dist/datastar/attributes/ref.js +0 -10
- package/dist/datastar/attributes/show.d.ts +0 -1
- package/dist/datastar/attributes/show.js +0 -31
- package/dist/datastar/attributes/signals.d.ts +0 -1
- package/dist/datastar/attributes/signals.js +0 -17
- package/dist/datastar/attributes/style.d.ts +0 -1
- package/dist/datastar/attributes/style.js +0 -50
- package/dist/datastar/attributes/text.d.ts +0 -1
- package/dist/datastar/attributes/text.js +0 -26
- package/dist/datastar/engine.d.ts +0 -162
- package/dist/datastar/engine.js +0 -999
- package/dist/datastar/happydom.d.ts +0 -1
- package/dist/datastar/happydom.js +0 -8
- package/dist/datastar/index.d.ts +0 -24
- package/dist/datastar/index.js +0 -24
- package/dist/datastar/load.d.ts +0 -24
- package/dist/datastar/load.js +0 -24
- package/dist/datastar/utils.d.ts +0 -51
- package/dist/datastar/utils.js +0 -202
- package/dist/datastar/watchers/patchElements.d.ts +0 -1
- package/dist/datastar/watchers/patchElements.js +0 -399
- package/dist/datastar/watchers/patchSignals.d.ts +0 -1
- package/dist/datastar/watchers/patchSignals.js +0 -14
- package/dist/experimental/EncryptedCookies.d.ts +0 -48
- package/dist/experimental/EncryptedCookies.js +0 -212
- package/dist/experimental/SseHttpResponse.d.ts +0 -7
- package/dist/experimental/SseHttpResponse.js +0 -28
- package/dist/experimental/index.d.ts +0 -1
- package/dist/experimental/index.js +0 -1
- package/dist/hyper/Hyper.d.ts +0 -25
- package/dist/hyper/Hyper.js +0 -23
- package/dist/hyper/HyperHtml.d.ts +0 -23
- package/dist/hyper/HyperHtml.js +0 -150
- package/dist/hyper/HyperHtml.test.d.ts +0 -1
- package/dist/hyper/HyperHtml.test.js +0 -197
- package/dist/hyper/HyperNode.d.ts +0 -14
- package/dist/hyper/HyperNode.js +0 -11
- package/dist/hyper/HyperRoute.d.ts +0 -8
- package/dist/hyper/HyperRoute.js +0 -32
- package/dist/hyper/HyperRoute.test.d.ts +0 -1
- package/dist/hyper/HyperRoute.test.js +0 -83
- package/dist/hyper/html.d.ts +0 -11
- package/dist/hyper/html.js +0 -30
- package/dist/hyper/index.d.ts +0 -6
- package/dist/hyper/index.js +0 -5
- package/dist/hyper/jsx-runtime.d.ts +0 -7
- package/dist/hyper/jsx-runtime.js +0 -8
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -8
- package/dist/inference_check.d.ts +0 -1
- package/dist/inference_check.js +0 -15
- package/dist/lint/plugin.d.ts +0 -86
- package/dist/lint/plugin.js +0 -341
- package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
- package/dist/middlewares/BasicAuthMiddleware.js +0 -22
- package/dist/middlewares/index.d.ts +0 -1
- package/dist/middlewares/index.js +0 -1
- package/dist/node/Effectify.d.ts +0 -209
- package/dist/node/Effectify.js +0 -19
- package/dist/node/FileSystem.d.ts +0 -7
- package/dist/node/FileSystem.js +0 -420
- package/dist/node/NodeFileSystem.d.ts +0 -7
- package/dist/node/NodeFileSystem.js +0 -410
- package/dist/node/NodeUtils.d.ts +0 -2
- package/dist/node/NodeUtils.js +0 -20
- package/dist/node/PlatformError.d.ts +0 -46
- package/dist/node/PlatformError.js +0 -43
- package/dist/node/Utils.d.ts +0 -1
- package/dist/node/Utils.js +0 -19
- package/dist/repro_fail.d.ts +0 -1
- package/dist/repro_fail.js +0 -14
- package/dist/sql/bun/index.d.ts +0 -3
- package/dist/sql/bun/index.js +0 -75
- package/dist/sql/mssql/docker.d.ts +0 -2
- package/dist/sql/mssql/docker.js +0 -67
- package/dist/sql/mssql/index.d.ts +0 -21
- package/dist/sql/mssql/index.js +0 -113
- package/dist/testing/TestHttpClient.d.ts +0 -13
- package/dist/testing/TestHttpClient.js +0 -68
- package/dist/testing/TestLogger.d.ts +0 -13
- package/dist/testing/TestLogger.js +0 -32
- package/dist/testing/index.d.ts +0 -2
- package/dist/testing/index.js +0 -2
- package/dist/testing/utils.d.ts +0 -9
- package/dist/testing/utils.js +0 -39
- package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
- package/dist/x/cloudflare/CloudflareTunnel.js +0 -30
- package/dist/x/cloudflare/index.d.ts +0 -1
- package/dist/x/cloudflare/index.js +0 -1
- package/dist/x/datastar/Datastar.d.ts +0 -6
- package/dist/x/datastar/Datastar.js +0 -47
- package/dist/x/datastar/index.d.ts +0 -1
- package/dist/x/datastar/index.js +0 -1
- package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
- package/dist/x/tailscale/TailscaleTunnel.js +0 -68
- package/dist/x/tailscale/index.d.ts +0 -1
- package/dist/x/tailscale/index.js +0 -1
- package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
- package/dist/x/tailwind/TailwindPlugin.js +0 -219
- package/dist/x/tailwind/compile.d.ts +0 -19
- package/dist/x/tailwind/compile.js +0 -154
- package/dist/x/tailwind/plugin.d.ts +0 -2
- package/dist/x/tailwind/plugin.js +0 -15
- /package/src/{Sql.ts → sql/Sql.ts} +0 -0
package/dist/FilePathPattern.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import * as Either from "effect/Either";
|
|
2
|
-
export function segments(pattern) {
|
|
3
|
-
const parts = pattern.split("/").filter(Boolean);
|
|
4
|
-
const result = [];
|
|
5
|
-
for (const part of parts) {
|
|
6
|
-
if (/^\(\w+\)$/.test(part)) {
|
|
7
|
-
result.push({ _tag: "GroupSegment", name: part.slice(1, -1) });
|
|
8
|
-
}
|
|
9
|
-
else if (part.startsWith("[[") && part.endsWith("]]")) {
|
|
10
|
-
result.push({ _tag: "RestSegment", name: part.slice(2, -2) });
|
|
11
|
-
}
|
|
12
|
-
else if (part.startsWith("[") && part.endsWith("]")) {
|
|
13
|
-
result.push({ _tag: "ParamSegment", name: part.slice(1, -1) });
|
|
14
|
-
}
|
|
15
|
-
else if (/^[\p{L}\p{N}._~-]+$/u.test(part)) {
|
|
16
|
-
result.push({ _tag: "LiteralSegment", value: part });
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
result.push({ _tag: "InvalidSegment", value: part });
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return result;
|
|
23
|
-
}
|
|
24
|
-
export function validate(pattern) {
|
|
25
|
-
const segs = segments(pattern);
|
|
26
|
-
const invalid = segs.find((s) => s._tag === "InvalidSegment");
|
|
27
|
-
if (invalid) {
|
|
28
|
-
return Either.left({
|
|
29
|
-
_tag: "FilePathPatternError",
|
|
30
|
-
pattern,
|
|
31
|
-
message: `Invalid segment: "${invalid.value}"`,
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
const restIndex = segs.findIndex((s) => s._tag === "RestSegment");
|
|
35
|
-
if (restIndex !== -1 && restIndex !== segs.length - 1) {
|
|
36
|
-
return Either.left({
|
|
37
|
-
_tag: "FilePathPatternError",
|
|
38
|
-
pattern,
|
|
39
|
-
message: "Rest segment must be the last segment",
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return Either.right(segs);
|
|
43
|
-
}
|
|
44
|
-
export function format(segs) {
|
|
45
|
-
const parts = segs.map((seg) => {
|
|
46
|
-
switch (seg._tag) {
|
|
47
|
-
case "GroupSegment":
|
|
48
|
-
return `(${seg.name})`;
|
|
49
|
-
case "RestSegment":
|
|
50
|
-
return `[[${seg.name}]]`;
|
|
51
|
-
case "ParamSegment":
|
|
52
|
-
return `[${seg.name}]`;
|
|
53
|
-
case "LiteralSegment":
|
|
54
|
-
return seg.value;
|
|
55
|
-
case "InvalidSegment":
|
|
56
|
-
return seg.value;
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
const joined = parts.join("/");
|
|
60
|
-
return (joined ? `/${joined}` : "/");
|
|
61
|
-
}
|
|
62
|
-
export function toPathPattern(pattern) {
|
|
63
|
-
const result = validate(pattern);
|
|
64
|
-
if (Either.isLeft(result)) {
|
|
65
|
-
return Either.left(result.left);
|
|
66
|
-
}
|
|
67
|
-
const segs = result.right;
|
|
68
|
-
const pathParts = [];
|
|
69
|
-
for (const seg of segs) {
|
|
70
|
-
switch (seg._tag) {
|
|
71
|
-
case "GroupSegment":
|
|
72
|
-
continue;
|
|
73
|
-
case "RestSegment":
|
|
74
|
-
pathParts.push(`:${seg.name}*`);
|
|
75
|
-
break;
|
|
76
|
-
case "ParamSegment":
|
|
77
|
-
pathParts.push(`:${seg.name}`);
|
|
78
|
-
break;
|
|
79
|
-
case "LiteralSegment":
|
|
80
|
-
pathParts.push(seg.value);
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
const joined = pathParts.join("/");
|
|
85
|
-
return Either.right((joined ? `/${joined}` : "/"));
|
|
86
|
-
}
|
package/dist/FileRouter.d.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import * as FileSystem from "./FileSystem.ts";
|
|
2
|
-
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Layer from "effect/Layer";
|
|
4
|
-
import * as FilePathPattern from "./FilePathPattern.ts";
|
|
5
|
-
import type * as PathPattern from "./PathPattern.ts";
|
|
6
|
-
import type * as PlatformError from "./PlatformError.ts";
|
|
7
|
-
import * as Route from "./Route.ts";
|
|
8
|
-
import * as RouteTree from "./RouteTree.ts";
|
|
9
|
-
declare const FileRouterError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
10
|
-
readonly _tag: "FileRouterError";
|
|
11
|
-
} & Readonly<A>;
|
|
12
|
-
export declare class FileRouterError extends FileRouterError_base<{
|
|
13
|
-
reason: "Import" | "Conflict" | "FileSystem";
|
|
14
|
-
cause?: unknown;
|
|
15
|
-
path?: string;
|
|
16
|
-
}> {
|
|
17
|
-
}
|
|
18
|
-
export type RouteModule = {
|
|
19
|
-
default: Route.RouteSet.Any;
|
|
20
|
-
};
|
|
21
|
-
export type LazyRouteModule = () => Promise<RouteModule>;
|
|
22
|
-
export type FileRoutes = {
|
|
23
|
-
[path: PathPattern.PathPattern]: [LazyRouteModule, ...LazyRouteModule[]];
|
|
24
|
-
};
|
|
25
|
-
export type Segment = FilePathPattern.Segment;
|
|
26
|
-
export type FileRoute = {
|
|
27
|
-
handle: "route" | "layer";
|
|
28
|
-
modulePath: `/${string}`;
|
|
29
|
-
routePath: `/${string}`;
|
|
30
|
-
segments: Array<Segment>;
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Routes sorted by depth, with rest parameters at the end.
|
|
34
|
-
* - layer.tsx
|
|
35
|
-
* - users/route.tsx
|
|
36
|
-
* - users/[userId]/route.tsx
|
|
37
|
-
* - [[rest]]/route.tsx
|
|
38
|
-
*/
|
|
39
|
-
export type OrderedFileRoutes = Array<FileRoute>;
|
|
40
|
-
export declare function parseRoute(path: string): FileRoute | null;
|
|
41
|
-
/**
|
|
42
|
-
* Generates a tree file that references all routes.
|
|
43
|
-
*/
|
|
44
|
-
export declare function layer(load: () => Promise<{
|
|
45
|
-
default: FileRoutes;
|
|
46
|
-
}>): Layer.Layer<Route.Routes, FileRouterError, FileSystem.FileSystem>;
|
|
47
|
-
export declare function layer(options: {
|
|
48
|
-
load: () => Promise<{
|
|
49
|
-
default: FileRoutes;
|
|
50
|
-
}>;
|
|
51
|
-
path: string;
|
|
52
|
-
}): Layer.Layer<Route.Routes, FileRouterError, FileSystem.FileSystem>;
|
|
53
|
-
export declare function fromFileRoutes(fileRoutes: FileRoutes): Effect.Effect<RouteTree.RouteTree>;
|
|
54
|
-
export declare function walkRoutesDirectory(dir: string): Effect.Effect<OrderedFileRoutes, PlatformError.PlatformError | FileRouterError, FileSystem.FileSystem>;
|
|
55
|
-
export declare function getFileRoutes(paths: Array<string>): Effect.Effect<OrderedFileRoutes, FileRouterError>;
|
|
56
|
-
export {};
|
package/dist/FileRouter.js
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import * as FileSystem from "./FileSystem.js";
|
|
2
|
-
import * as Data from "effect/Data";
|
|
3
|
-
import * as Effect from "effect/Effect";
|
|
4
|
-
import * as Either from "effect/Either";
|
|
5
|
-
import * as Function from "effect/Function";
|
|
6
|
-
import * as Layer from "effect/Layer";
|
|
7
|
-
import * as Stream from "effect/Stream";
|
|
8
|
-
import * as NPath from "node:path";
|
|
9
|
-
import * as NUrl from "node:url";
|
|
10
|
-
import * as Development from "./Development.js";
|
|
11
|
-
import * as FilePathPattern from "./FilePathPattern.js";
|
|
12
|
-
import * as FileRouterCodegen from "./FileRouterCodegen.js";
|
|
13
|
-
import * as NodeUtils from "./node/NodeUtils.js";
|
|
14
|
-
import * as Route from "./Route.js";
|
|
15
|
-
import * as RouteTree from "./RouteTree.js";
|
|
16
|
-
export class FileRouterError extends Data.TaggedError("FileRouterError") {
|
|
17
|
-
}
|
|
18
|
-
const ROUTE_PATH_REGEX = /^\/?(.*\/?)(?:route|layer)\.(jsx?|tsx?)$/;
|
|
19
|
-
export function parseRoute(path) {
|
|
20
|
-
const segs = FilePathPattern.segments(path);
|
|
21
|
-
const lastSeg = segs.at(-1);
|
|
22
|
-
const handleMatch = lastSeg?._tag === "LiteralSegment" && lastSeg.value.match(/^(route|layer)\.(tsx?|jsx?)$/);
|
|
23
|
-
const handle = handleMatch ? handleMatch[1] : null;
|
|
24
|
-
if (!handle) {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
const pathSegments = segs.slice(0, -1);
|
|
28
|
-
const validated = FilePathPattern.validate(FilePathPattern.format(pathSegments));
|
|
29
|
-
if (Either.isLeft(validated)) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
const restIndex = pathSegments.findIndex((seg) => seg._tag === "RestSegment");
|
|
33
|
-
if (restIndex !== -1 && restIndex !== pathSegments.length - 1) {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
const routePathSegments = pathSegments.filter((seg) => seg._tag !== "GroupSegment");
|
|
37
|
-
const routePath = FilePathPattern.format(routePathSegments);
|
|
38
|
-
return {
|
|
39
|
-
handle,
|
|
40
|
-
modulePath: `/${path}`,
|
|
41
|
-
routePath,
|
|
42
|
-
segments: pathSegments,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
function importModule(load) {
|
|
46
|
-
return Effect.tryPromise({
|
|
47
|
-
try: () => load(),
|
|
48
|
-
catch: (cause) => new FileRouterError({ reason: "Import", cause }),
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
export function layer(loadOrOptions) {
|
|
52
|
-
const options = typeof loadOrOptions === "function"
|
|
53
|
-
? {
|
|
54
|
-
load: loadOrOptions,
|
|
55
|
-
path: NPath.join(NodeUtils.getEntrypoint(), "routes"),
|
|
56
|
-
}
|
|
57
|
-
: loadOrOptions;
|
|
58
|
-
let treePath = options.path;
|
|
59
|
-
if (treePath.startsWith("file://")) {
|
|
60
|
-
treePath = NUrl.fileURLToPath(treePath);
|
|
61
|
-
}
|
|
62
|
-
if (NPath.extname(treePath) === "") {
|
|
63
|
-
treePath = NPath.join(treePath, "server.gen.ts");
|
|
64
|
-
}
|
|
65
|
-
const routesPath = NPath.dirname(treePath);
|
|
66
|
-
const treeFilename = NPath.basename(treePath);
|
|
67
|
-
const relativeRoutesPath = NPath.relative(process.cwd(), routesPath);
|
|
68
|
-
return Layer.scoped(Route.Routes, Effect.gen(function* () {
|
|
69
|
-
// Generate routes file before loading
|
|
70
|
-
yield* FileRouterCodegen.update(routesPath, treeFilename);
|
|
71
|
-
// Load and build route tree
|
|
72
|
-
const m = yield* importModule(options.load);
|
|
73
|
-
const routeTree = yield* fromFileRoutes(m.default);
|
|
74
|
-
// Watch for changes (only when Development service is available)
|
|
75
|
-
yield* Function.pipe(Development.stream(), Stream.filter((e) => e._tag !== "Reload" && e.path.startsWith(relativeRoutesPath)), Stream.runForEach(() => FileRouterCodegen.update(routesPath, treeFilename)), Effect.fork);
|
|
76
|
-
return routeTree;
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
export function fromFileRoutes(fileRoutes) {
|
|
80
|
-
return Effect.gen(function* () {
|
|
81
|
-
const mounts = {};
|
|
82
|
-
for (const [path, loaders] of Object.entries(fileRoutes)) {
|
|
83
|
-
const modules = yield* Effect.forEach(loaders, (loader) => Effect.promise(() => loader()));
|
|
84
|
-
const allRoutes = [];
|
|
85
|
-
for (const m of modules) {
|
|
86
|
-
if (Route.isRouteSet(m.default)) {
|
|
87
|
-
for (const route of m.default) {
|
|
88
|
-
;
|
|
89
|
-
allRoutes.push(route);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
mounts[path] = allRoutes;
|
|
94
|
-
}
|
|
95
|
-
return RouteTree.make(mounts);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
export function walkRoutesDirectory(dir) {
|
|
99
|
-
return Effect.gen(function* () {
|
|
100
|
-
const fs = yield* FileSystem.FileSystem;
|
|
101
|
-
const files = yield* fs.readDirectory(dir, { recursive: true });
|
|
102
|
-
return yield* getFileRoutes(files);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
export function getFileRoutes(paths) {
|
|
106
|
-
return Effect.gen(function* () {
|
|
107
|
-
const routes = paths
|
|
108
|
-
.map((f) => f.match(ROUTE_PATH_REGEX))
|
|
109
|
-
.filter(Boolean)
|
|
110
|
-
.map((v) => {
|
|
111
|
-
const path = v[0];
|
|
112
|
-
try {
|
|
113
|
-
return parseRoute(path);
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
})
|
|
119
|
-
.filter((route) => route !== null)
|
|
120
|
-
.toSorted((a, b) => {
|
|
121
|
-
const aDepth = a.segments.length;
|
|
122
|
-
const bDepth = b.segments.length;
|
|
123
|
-
const aHasRest = a.segments.some((seg) => seg._tag === "RestSegment");
|
|
124
|
-
const bHasRest = b.segments.some((seg) => seg._tag === "RestSegment");
|
|
125
|
-
return (
|
|
126
|
-
// rest is a dominant factor (routes with rest come last)
|
|
127
|
-
(+aHasRest - +bHasRest) * 1000 +
|
|
128
|
-
// depth is reversed for rest
|
|
129
|
-
(aDepth - bDepth) * (1 - 2 * +aHasRest) +
|
|
130
|
-
// lexicographic comparison as tiebreaker
|
|
131
|
-
a.modulePath.localeCompare(b.modulePath) * 0.001);
|
|
132
|
-
});
|
|
133
|
-
// Detect conflicting routes at the same path
|
|
134
|
-
const routesByPath = new Map();
|
|
135
|
-
for (const route of routes) {
|
|
136
|
-
const existing = routesByPath.get(route.routePath) || [];
|
|
137
|
-
existing.push(route);
|
|
138
|
-
routesByPath.set(route.routePath, existing);
|
|
139
|
-
}
|
|
140
|
-
for (const [path, pathRoutes] of routesByPath) {
|
|
141
|
-
const routeHandles = pathRoutes.filter((h) => h.handle === "route");
|
|
142
|
-
if (routeHandles.length > 1) {
|
|
143
|
-
yield* new FileRouterError({ reason: "Conflict", path });
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return routes;
|
|
147
|
-
});
|
|
148
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as FileSystem from "./FileSystem.ts";
|
|
2
|
-
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Schema from "effect/Schema";
|
|
4
|
-
import * as FilePathPattern from "./FilePathPattern.ts";
|
|
5
|
-
import * as FileRouter from "./FileRouter.ts";
|
|
6
|
-
export declare function validateRouteModule(module: unknown): module is FileRouter.RouteModule;
|
|
7
|
-
export declare function generatePathParamsSchema(segments: ReadonlyArray<FilePathPattern.Segment>): Schema.Struct<any> | null;
|
|
8
|
-
/**
|
|
9
|
-
* Validates all route modules in the given route handles.
|
|
10
|
-
*/
|
|
11
|
-
export declare function validateRouteModules(path: string, routes: FileRouter.OrderedFileRoutes): Effect.Effect<void, FileRouter.FileRouterError, FileSystem.FileSystem>;
|
|
12
|
-
export declare function generateCode(fileRoutes: FileRouter.OrderedFileRoutes): string | null;
|
|
13
|
-
/**
|
|
14
|
-
* Updates the tree file only if the generated content differs from the existing file.
|
|
15
|
-
* This prevents infinite loops when watching for file changes.
|
|
16
|
-
*/
|
|
17
|
-
export declare function update(routesPath: string, treePath?: string): Effect.Effect<void, FileRouter.FileRouterError, FileSystem.FileSystem>;
|
|
18
|
-
export declare function dump(routesPath: string, treePath?: string): Effect.Effect<void, FileRouter.FileRouterError, FileSystem.FileSystem>;
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
-
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
-
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
-
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
-
});
|
|
6
|
-
}
|
|
7
|
-
return path;
|
|
8
|
-
};
|
|
9
|
-
import * as FileSystem from "./FileSystem.js";
|
|
10
|
-
import * as Effect from "effect/Effect";
|
|
11
|
-
import * as Either from "effect/Either";
|
|
12
|
-
import * as Schema from "effect/Schema";
|
|
13
|
-
import * as NPath from "node:path";
|
|
14
|
-
import * as FilePathPattern from "./FilePathPattern.js";
|
|
15
|
-
import * as FileRouter from "./FileRouter.js";
|
|
16
|
-
import * as SchemaExtra from "./SchemaExtra.js";
|
|
17
|
-
export function validateRouteModule(module) {
|
|
18
|
-
if (typeof module !== "object" || module === null) {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
if (!("default" in module)) {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
// TODO: verify we're exporting a proper shape
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
export function generatePathParamsSchema(segments) {
|
|
28
|
-
const fields = {};
|
|
29
|
-
for (const segment of segments) {
|
|
30
|
-
if (segment._tag === "ParamSegment") {
|
|
31
|
-
fields[segment.name] = Schema.String;
|
|
32
|
-
}
|
|
33
|
-
else if (segment._tag === "RestSegment") {
|
|
34
|
-
fields[segment.name] = Schema.optional(Schema.String);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (Object.keys(fields).length === 0) {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
return Schema.Struct(fields);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Validates all route modules in the given route handles.
|
|
44
|
-
*/
|
|
45
|
-
export function validateRouteModules(path, routes) {
|
|
46
|
-
return Effect.gen(function* () {
|
|
47
|
-
const fs = yield* FileSystem.FileSystem;
|
|
48
|
-
const routeHandles = routes.filter((h) => h.handle === "route");
|
|
49
|
-
for (const handle of routeHandles) {
|
|
50
|
-
const routeModulePath = NPath.resolve(path, handle.modulePath);
|
|
51
|
-
const expectedSchema = generatePathParamsSchema(handle.segments);
|
|
52
|
-
const fileExists = yield* fs
|
|
53
|
-
.exists(routeModulePath)
|
|
54
|
-
.pipe(Effect.catchAll(() => Effect.succeed(false)));
|
|
55
|
-
if (!fileExists) {
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
const module = yield* Effect.tryPromise({
|
|
59
|
-
try: () => import(__rewriteRelativeImportExtension(routeModulePath)),
|
|
60
|
-
catch: (cause) => new FileRouter.FileRouterError({
|
|
61
|
-
reason: "Import",
|
|
62
|
-
cause,
|
|
63
|
-
path: routeModulePath,
|
|
64
|
-
}),
|
|
65
|
-
});
|
|
66
|
-
if (!validateRouteModule(module)) {
|
|
67
|
-
yield* Effect.logWarning(`Route module ${routeModulePath} should export default Route`);
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
const routeSet = module.default;
|
|
71
|
-
// extract user schema
|
|
72
|
-
const userSchema = undefined;
|
|
73
|
-
if (expectedSchema && userSchema && !SchemaExtra.schemaEqual(userSchema, expectedSchema)) {
|
|
74
|
-
const relativeFilePath = NPath.relative(process.cwd(), routeModulePath);
|
|
75
|
-
yield* Effect.logError(`Route '${relativeFilePath}' has incorrect PathParams schema, expected schemaPathParams(${SchemaExtra.formatSchemaCode(expectedSchema)})`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
export function generateCode(fileRoutes) {
|
|
81
|
-
// Group routes by path to find layers
|
|
82
|
-
const routesByPath = new Map();
|
|
83
|
-
for (const fileRoute of fileRoutes) {
|
|
84
|
-
const existing = routesByPath.get(fileRoute.routePath) || { layers: [] };
|
|
85
|
-
if (fileRoute.handle === "route") {
|
|
86
|
-
existing.route = fileRoute;
|
|
87
|
-
}
|
|
88
|
-
else if (fileRoute.handle === "layer") {
|
|
89
|
-
existing.layers.push(fileRoute);
|
|
90
|
-
}
|
|
91
|
-
routesByPath.set(fileRoute.routePath, existing);
|
|
92
|
-
}
|
|
93
|
-
// Helper to check if layer's path is an ancestor of route's path
|
|
94
|
-
const layerMatchesRoute = (layer, route) => {
|
|
95
|
-
const layerDir = layer.modulePath.replace(/\/(layer)\.(tsx?|jsx?)$/, "");
|
|
96
|
-
if (layerDir === "/")
|
|
97
|
-
return true;
|
|
98
|
-
return route.modulePath.startsWith(layerDir + "/");
|
|
99
|
-
};
|
|
100
|
-
// Build entries for each route path
|
|
101
|
-
const entries = [];
|
|
102
|
-
for (const [path, { route }] of routesByPath) {
|
|
103
|
-
if (!route)
|
|
104
|
-
continue;
|
|
105
|
-
// Collect all parent layers that match the route's groups
|
|
106
|
-
const allLayers = [];
|
|
107
|
-
let currentPath = path;
|
|
108
|
-
while (true) {
|
|
109
|
-
const pathData = routesByPath.get(currentPath);
|
|
110
|
-
if (pathData?.layers) {
|
|
111
|
-
const matchingLayers = pathData.layers.filter((layer) => layerMatchesRoute(layer, route));
|
|
112
|
-
allLayers.unshift(...matchingLayers);
|
|
113
|
-
}
|
|
114
|
-
if (currentPath === "/")
|
|
115
|
-
break;
|
|
116
|
-
const parentPath = currentPath.substring(0, currentPath.lastIndexOf("/"));
|
|
117
|
-
currentPath = parentPath || "/";
|
|
118
|
-
}
|
|
119
|
-
// Convert file-style path to colon-style PathPattern
|
|
120
|
-
const pathPatternResult = FilePathPattern.toPathPattern(path);
|
|
121
|
-
if (Either.isLeft(pathPatternResult)) {
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
const pathPattern = pathPatternResult.right;
|
|
125
|
-
// Order: route first, then layers from innermost to outermost
|
|
126
|
-
const loaders = [
|
|
127
|
-
`() => import(".${route.modulePath}")`,
|
|
128
|
-
...allLayers.reverse().map((layer) => `() => import(".${layer.modulePath}")`),
|
|
129
|
-
];
|
|
130
|
-
entries.push({ path: pathPattern, loaders });
|
|
131
|
-
}
|
|
132
|
-
// No routes found - don't create file
|
|
133
|
-
if (entries.length === 0) {
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
const routeEntries = entries
|
|
137
|
-
.map(({ path, loaders }) => {
|
|
138
|
-
const loadersCode = loaders.join(",\n ");
|
|
139
|
-
return ` "${path}": [\n ${loadersCode},\n ]`;
|
|
140
|
-
})
|
|
141
|
-
.join(",\n");
|
|
142
|
-
return `/**
|
|
143
|
-
* Auto-generated by effect-start.
|
|
144
|
-
*/
|
|
145
|
-
|
|
146
|
-
export default {
|
|
147
|
-
${routeEntries},
|
|
148
|
-
} satisfies import("effect-start/FileRouter").FileRoutes
|
|
149
|
-
`;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Updates the tree file only if the generated content differs from the existing file.
|
|
153
|
-
* This prevents infinite loops when watching for file changes.
|
|
154
|
-
*/
|
|
155
|
-
export function update(routesPath, treePath = "server.gen.ts") {
|
|
156
|
-
return Effect.gen(function* () {
|
|
157
|
-
treePath = NPath.resolve(routesPath, treePath);
|
|
158
|
-
const fs = yield* FileSystem.FileSystem;
|
|
159
|
-
const files = yield* fs.readDirectory(routesPath, { recursive: true }).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
|
|
160
|
-
reason: "FileSystem",
|
|
161
|
-
cause,
|
|
162
|
-
path: routesPath,
|
|
163
|
-
})));
|
|
164
|
-
const fileRoutes = yield* FileRouter.getFileRoutes(files);
|
|
165
|
-
// Validate route modules
|
|
166
|
-
yield* validateRouteModules(routesPath, fileRoutes);
|
|
167
|
-
const newCode = generateCode(fileRoutes);
|
|
168
|
-
// Check if file exists (ok to fail - means file doesn't exist)
|
|
169
|
-
const existingCode = yield* fs
|
|
170
|
-
.readFileString(treePath)
|
|
171
|
-
.pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
172
|
-
// No routes found
|
|
173
|
-
if (newCode === null) {
|
|
174
|
-
// If gen file exists, write empty export
|
|
175
|
-
if (existingCode !== null) {
|
|
176
|
-
const emptyCode = "export default {}\n";
|
|
177
|
-
if (existingCode !== emptyCode) {
|
|
178
|
-
yield* Effect.logDebug(`Clearing file routes tree: ${treePath}`);
|
|
179
|
-
yield* fs.writeFileString(treePath, emptyCode).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
|
|
180
|
-
reason: "FileSystem",
|
|
181
|
-
cause,
|
|
182
|
-
path: treePath,
|
|
183
|
-
})));
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
// Write if content differs
|
|
189
|
-
if (existingCode !== newCode) {
|
|
190
|
-
yield* Effect.logDebug(`Updating file routes tree: ${treePath}`);
|
|
191
|
-
yield* fs.writeFileString(treePath, newCode).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
|
|
192
|
-
reason: "FileSystem",
|
|
193
|
-
cause,
|
|
194
|
-
path: treePath,
|
|
195
|
-
})));
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
yield* Effect.logDebug(`File routes tree unchanged: ${treePath}`);
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
export function dump(routesPath, treePath = "server.gen.ts") {
|
|
203
|
-
return Effect.gen(function* () {
|
|
204
|
-
treePath = NPath.resolve(routesPath, treePath);
|
|
205
|
-
const fs = yield* FileSystem.FileSystem;
|
|
206
|
-
const files = yield* fs.readDirectory(routesPath, { recursive: true }).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
|
|
207
|
-
reason: "FileSystem",
|
|
208
|
-
cause,
|
|
209
|
-
path: routesPath,
|
|
210
|
-
})));
|
|
211
|
-
const fileRoutes = yield* FileRouter.getFileRoutes(files);
|
|
212
|
-
// Validate route modules
|
|
213
|
-
yield* validateRouteModules(routesPath, fileRoutes);
|
|
214
|
-
const code = generateCode(fileRoutes);
|
|
215
|
-
// No routes found - don't create file
|
|
216
|
-
if (code === null) {
|
|
217
|
-
yield* Effect.logDebug(`No routes found, skipping: ${treePath}`);
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
yield* Effect.logDebug(`Generating file routes tree: ${treePath}`);
|
|
221
|
-
yield* fs.writeFileString(treePath, code).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
|
|
222
|
-
reason: "FileSystem",
|
|
223
|
-
cause,
|
|
224
|
-
path: treePath,
|
|
225
|
-
})));
|
|
226
|
-
});
|
|
227
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import * as RouterPattern from "./RouterPattern.ts";
|
|
2
|
-
export type GroupSegment<Name extends string = string> = {
|
|
3
|
-
_tag: "GroupSegment";
|
|
4
|
-
name: Name;
|
|
5
|
-
};
|
|
6
|
-
export type Segment = RouterPattern.Segment | GroupSegment;
|
|
7
|
-
export declare function parse(pattern: string): Segment[];
|
|
8
|
-
export declare function formatSegment(seg: Segment): string;
|
|
9
|
-
export declare function format(segments: Segment[]): `/${string}`;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import * as RouterPattern from "./RouterPattern.js";
|
|
2
|
-
export function parse(pattern) {
|
|
3
|
-
const trimmedPath = pattern.replace(/(^\/)|(\/$)/g, "");
|
|
4
|
-
if (trimmedPath === "") {
|
|
5
|
-
return [];
|
|
6
|
-
}
|
|
7
|
-
const segmentStrings = trimmedPath
|
|
8
|
-
.split("/")
|
|
9
|
-
.filter(s => s !== "");
|
|
10
|
-
if (segmentStrings.length === 0) {
|
|
11
|
-
return [];
|
|
12
|
-
}
|
|
13
|
-
const segments = segmentStrings.map((s) => {
|
|
14
|
-
// (group) - Groups (FileRouter-specific)
|
|
15
|
-
const groupMatch = s.match(/^\((\w+)\)$/);
|
|
16
|
-
if (groupMatch) {
|
|
17
|
-
return { _tag: "GroupSegment", name: groupMatch[1] };
|
|
18
|
-
}
|
|
19
|
-
// Delegate to RouterPattern for all other segment types
|
|
20
|
-
return RouterPattern.parseSegment(s);
|
|
21
|
-
});
|
|
22
|
-
if (segments.some((seg) => seg === null)) {
|
|
23
|
-
throw new Error(`Invalid path segment in "${pattern}": contains invalid characters or format`);
|
|
24
|
-
}
|
|
25
|
-
return segments;
|
|
26
|
-
}
|
|
27
|
-
export function formatSegment(seg) {
|
|
28
|
-
if (seg._tag === "GroupSegment")
|
|
29
|
-
return `(${seg.name})`;
|
|
30
|
-
return RouterPattern.formatSegment(seg);
|
|
31
|
-
}
|
|
32
|
-
export function format(segments) {
|
|
33
|
-
const joined = segments.map(formatSegment).join("/");
|
|
34
|
-
return (joined ? `/${joined}` : "/");
|
|
35
|
-
}
|