effect-start 0.23.0 → 0.25.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/ChildProcess.js +32 -20
- package/dist/Commander.js +377 -293
- package/dist/ContentNegotiation.js +424 -318
- package/dist/Cookies.js +340 -271
- package/dist/Development.js +85 -49
- package/dist/Effectify.js +22 -14
- package/dist/Entity.js +260 -195
- package/dist/Fetch.js +192 -0
- package/dist/FilePathPattern.js +88 -77
- package/dist/FileRouter.js +192 -136
- package/dist/FileRouterCodegen.js +262 -191
- package/dist/FileSystem.js +126 -64
- package/dist/Http.js +96 -77
- package/dist/PathPattern.js +311 -273
- package/dist/PlatformError.js +36 -21
- package/dist/PlatformRuntime.js +65 -40
- package/dist/Route.js +122 -79
- package/dist/RouteBody.js +83 -58
- package/dist/RouteError.js +46 -25
- package/dist/RouteHook.js +58 -34
- package/dist/RouteHttp.js +346 -237
- package/dist/RouteHttpTracer.js +86 -58
- package/dist/RouteMount.js +81 -58
- package/dist/RouteSchema.js +253 -170
- package/dist/RouteSse.js +87 -72
- package/dist/RouteTree.js +99 -73
- package/dist/RouteTrie.js +160 -133
- package/dist/SchemaExtra.js +87 -62
- package/dist/Socket.js +32 -21
- package/dist/SqlIntrospect.js +317 -268
- package/dist/Start.js +55 -25
- package/dist/StartApp.js +3 -21
- package/dist/StreamExtra.js +109 -74
- package/dist/System.js +37 -21
- package/dist/TuplePathPattern.js +64 -58
- package/dist/Unique.js +159 -120
- package/dist/Values.js +48 -32
- package/dist/bun/BunBundle.js +158 -109
- package/dist/bun/BunChildProcessSpawner.js +121 -82
- package/dist/bun/BunImportTrackerPlugin.js +85 -63
- package/dist/bun/BunRoute.js +135 -99
- package/dist/bun/BunRuntime.js +39 -29
- package/dist/bun/BunServer.js +268 -140
- package/dist/bun/BunVirtualFilesPlugin.js +47 -33
- package/dist/bun/_BunEnhancedResolve.js +107 -82
- package/dist/bun/index.js +5 -5
- package/dist/bundler/Bundle.js +82 -38
- package/dist/bundler/BundleFiles.js +140 -82
- package/dist/bundler/BundleRoute.js +49 -38
- package/dist/client/Overlay.js +29 -28
- package/dist/client/ScrollState.js +94 -82
- package/dist/client/index.js +79 -61
- package/dist/console/Console.js +40 -24
- package/dist/console/ConsoleErrors.js +189 -178
- package/dist/console/ConsoleLogger.js +52 -43
- package/dist/console/ConsoleMetrics.js +69 -58
- package/dist/console/ConsoleProcess.js +57 -47
- package/dist/console/ConsoleStore.js +56 -45
- package/dist/console/ConsoleTracer.js +101 -88
- package/dist/console/Simulation.js +714 -563
- package/dist/console/index.js +3 -3
- package/dist/console/routes/tree.js +29 -28
- package/dist/datastar/actions/fetch.js +514 -381
- package/dist/datastar/actions/peek.js +12 -12
- package/dist/datastar/actions/setAll.js +18 -11
- package/dist/datastar/actions/toggleAll.js +18 -11
- package/dist/datastar/attributes/attr.js +48 -47
- package/dist/datastar/attributes/bind.js +186 -167
- package/dist/datastar/attributes/class.js +51 -44
- package/dist/datastar/attributes/computed.js +23 -24
- package/dist/datastar/attributes/effect.js +9 -8
- package/dist/datastar/attributes/indicator.js +32 -29
- package/dist/datastar/attributes/init.js +26 -25
- package/dist/datastar/attributes/jsonSignals.js +32 -29
- package/dist/datastar/attributes/on.js +76 -73
- package/dist/datastar/attributes/onIntersect.js +51 -51
- package/dist/datastar/attributes/onInterval.js +30 -29
- package/dist/datastar/attributes/onSignalPatch.js +49 -40
- package/dist/datastar/attributes/ref.js +10 -9
- package/dist/datastar/attributes/show.js +31 -30
- package/dist/datastar/attributes/signals.js +17 -16
- package/dist/datastar/attributes/style.js +56 -49
- package/dist/datastar/attributes/text.js +28 -25
- package/dist/datastar/engine.js +1079 -933
- package/dist/datastar/index.js +25 -24
- package/dist/datastar/utils.js +203 -155
- package/dist/datastar/watchers/patchElements.js +459 -372
- package/dist/datastar/watchers/patchSignals.js +13 -13
- package/dist/experimental/EncryptedCookies.js +305 -189
- package/dist/experimental/index.js +1 -1
- package/dist/hyper/Hyper.js +22 -17
- package/dist/hyper/HyperHtml.js +138 -123
- package/dist/hyper/HyperNode.js +11 -9
- package/dist/hyper/HyperRoute.js +41 -28
- package/dist/hyper/html.js +27 -27
- package/dist/hyper/index.js +5 -5
- package/dist/hyper/jsx-runtime.js +11 -5
- package/dist/index.js +8 -8
- package/dist/node/NodeFileSystem.js +606 -341
- package/dist/node/NodeUtils.js +21 -18
- package/dist/sql/Sql.js +8 -0
- package/dist/sql/bun/index.js +134 -67
- package/dist/sql/index.js +1 -0
- package/dist/sql/libsql/index.js +156 -0
- package/dist/sql/mssql/docker.js +103 -60
- package/dist/sql/mssql/index.js +182 -101
- package/dist/testing/TestLogger.js +39 -29
- package/dist/testing/index.js +2 -2
- package/dist/testing/utils.js +45 -23
- package/dist/x/cloudflare/CloudflareTunnel.js +61 -28
- package/dist/x/cloudflare/index.js +1 -1
- package/dist/x/tailscale/TailscaleTunnel.js +86 -60
- package/dist/x/tailscale/index.js +1 -1
- package/dist/x/tailwind/TailwindPlugin.js +280 -205
- package/dist/x/tailwind/compile.js +185 -129
- package/dist/x/tailwind/plugin.js +13 -11
- package/package.json +1 -1
- 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 +24 -22
- package/src/StartApp.ts +11 -0
- package/src/bun/BunServer.ts +89 -16
- 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/src/x/tailscale/TailscaleTunnel.ts +7 -5
- package/dist/BlobStore.d.ts +0 -80
- package/dist/BlobStore.js +0 -19
- package/dist/ChildProcess.d.ts +0 -60
- package/dist/Commander.d.ts +0 -100
- package/dist/ContentNegotiation.d.ts +0 -12
- package/dist/Cookies.d.ts +0 -47
- package/dist/Development.d.ts +0 -39
- package/dist/Effectify.d.ts +0 -209
- package/dist/Entity.d.ts +0 -47
- package/dist/FilePathPattern.d.ts +0 -29
- package/dist/FileRouter.d.ts +0 -56
- package/dist/FileRouterCodegen.d.ts +0 -18
- package/dist/FileRouterPattern.d.ts +0 -9
- package/dist/FileRouterPattern.js +0 -35
- package/dist/FileSystem.d.ts +0 -158
- package/dist/Http.d.ts +0 -37
- 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/PlatformError.d.ts +0 -38
- package/dist/PlatformRuntime.d.ts +0 -27
- package/dist/Route.d.ts +0 -97
- package/dist/RouteBody.d.ts +0 -47
- package/dist/RouteError.d.ts +0 -98
- package/dist/RouteHook.d.ts +0 -12
- package/dist/RouteHttp.d.ts +0 -21
- package/dist/RouteHttpTracer.d.ts +0 -10
- package/dist/RouteMount.d.ts +0 -86
- package/dist/RouteSchema.d.ts +0 -86
- package/dist/RouteSse.d.ts +0 -21
- package/dist/RouteTree.d.ts +0 -57
- package/dist/RouteTrie.d.ts +0 -20
- package/dist/RouterPattern.d.ts +0 -118
- package/dist/RouterPattern.js +0 -269
- package/dist/SchemaExtra.d.ts +0 -7
- package/dist/Socket.d.ts +0 -27
- package/dist/Sql.d.ts +0 -34
- package/dist/Sql.js +0 -5
- package/dist/SqlIntrospect.d.ts +0 -91
- package/dist/Start.d.ts +0 -44
- package/dist/StartApp.d.ts +0 -19
- package/dist/StreamExtra.d.ts +0 -28
- package/dist/System.d.ts +0 -7
- package/dist/TuplePathPattern.d.ts +0 -9
- package/dist/Unique.d.ts +0 -50
- package/dist/Values.d.ts +0 -27
- 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/BunChildProcessSpawner.d.ts +0 -3
- 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/BunPlatformHttpServer.d.ts +0 -10
- package/dist/bun/BunPlatformHttpServer.js +0 -53
- package/dist/bun/BunRoute.d.ts +0 -48
- package/dist/bun/BunRuntime.d.ts +0 -2
- package/dist/bun/BunServer.d.ts +0 -40
- 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/_BunEnhancedResolve.d.ts +0 -45
- package/dist/bun/index.d.ts +0 -5
- package/dist/bundler/Bundle.d.ts +0 -61
- package/dist/bundler/BundleFiles.d.ts +0 -13
- 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/client/Overlay.d.ts +0 -2
- package/dist/client/ScrollState.d.ts +0 -6
- package/dist/client/index.d.ts +0 -6
- package/dist/console/Console.d.ts +0 -6
- package/dist/console/ConsoleErrors.d.ts +0 -3
- package/dist/console/ConsoleLogger.d.ts +0 -3
- package/dist/console/ConsoleMetrics.d.ts +0 -3
- package/dist/console/ConsoleProcess.d.ts +0 -3
- package/dist/console/ConsoleStore.d.ts +0 -144
- package/dist/console/ConsoleTracer.d.ts +0 -3
- package/dist/console/Simulation.d.ts +0 -2
- package/dist/console/index.d.ts +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/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/peek.d.ts +0 -1
- package/dist/datastar/actions/setAll.d.ts +0 -1
- package/dist/datastar/actions/toggleAll.d.ts +0 -1
- package/dist/datastar/attributes/attr.d.ts +0 -1
- package/dist/datastar/attributes/bind.d.ts +0 -1
- package/dist/datastar/attributes/class.d.ts +0 -1
- package/dist/datastar/attributes/computed.d.ts +0 -1
- package/dist/datastar/attributes/effect.d.ts +0 -1
- package/dist/datastar/attributes/indicator.d.ts +0 -1
- package/dist/datastar/attributes/init.d.ts +0 -1
- package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
- package/dist/datastar/attributes/on.d.ts +0 -1
- package/dist/datastar/attributes/onIntersect.d.ts +0 -1
- package/dist/datastar/attributes/onInterval.d.ts +0 -1
- package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
- package/dist/datastar/attributes/ref.d.ts +0 -1
- package/dist/datastar/attributes/show.d.ts +0 -1
- package/dist/datastar/attributes/signals.d.ts +0 -1
- package/dist/datastar/attributes/style.d.ts +0 -1
- package/dist/datastar/attributes/text.d.ts +0 -1
- package/dist/datastar/engine.d.ts +0 -162
- 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/load.d.ts +0 -24
- package/dist/datastar/load.js +0 -24
- package/dist/datastar/utils.d.ts +0 -51
- package/dist/datastar/watchers/patchElements.d.ts +0 -1
- package/dist/datastar/watchers/patchSignals.d.ts +0 -1
- package/dist/experimental/EncryptedCookies.d.ts +0 -48
- 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/hyper/Hyper.d.ts +0 -25
- package/dist/hyper/HyperHtml.d.ts +0 -23
- 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/HyperRoute.d.ts +0 -8
- 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/index.d.ts +0 -6
- package/dist/hyper/jsx-runtime.d.ts +0 -7
- package/dist/index.d.ts +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/NodeUtils.d.ts +0 -2
- 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/mssql/docker.d.ts +0 -2
- package/dist/sql/mssql/index.d.ts +0 -21
- 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/index.d.ts +0 -2
- package/dist/testing/utils.d.ts +0 -9
- package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
- package/dist/x/cloudflare/index.d.ts +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/index.d.ts +0 -1
- package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
- package/dist/x/tailwind/compile.d.ts +0 -19
- package/dist/x/tailwind/plugin.d.ts +0 -2
- /package/src/{Sql.ts → sql/Sql.ts} +0 -0
|
@@ -1,227 +1,298 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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";
|
|
1
|
+
import * as FileSystem from "./FileSystem.js"
|
|
2
|
+
import * as Effect from "effect/Effect"
|
|
3
|
+
import * as Either from "effect/Either"
|
|
4
|
+
import * as Schema from "effect/Schema"
|
|
5
|
+
import * as NPath from "node:path"
|
|
6
|
+
import * as FilePathPattern from "./FilePathPattern.js"
|
|
7
|
+
import * as FileRouter from "./FileRouter.js"
|
|
8
|
+
import * as SchemaExtra from "./SchemaExtra.js"
|
|
9
|
+
|
|
17
10
|
export function validateRouteModule(module) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
11
|
+
if (typeof module !== "object" || module === null) {
|
|
12
|
+
return false
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (!("default" in module)) {
|
|
16
|
+
return false
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// TODO: verify we're exporting a proper shape
|
|
20
|
+
return true
|
|
26
21
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return null;
|
|
22
|
+
|
|
23
|
+
export function generatePathParamsSchema(
|
|
24
|
+
segments,
|
|
25
|
+
) {
|
|
26
|
+
const fields = {}
|
|
27
|
+
|
|
28
|
+
for (const segment of segments) {
|
|
29
|
+
if (segment._tag === "ParamSegment") {
|
|
30
|
+
fields[segment.name] = Schema.String
|
|
31
|
+
} else if (segment._tag === "RestSegment") {
|
|
32
|
+
fields[segment.name] = Schema.optional(Schema.String)
|
|
39
33
|
}
|
|
40
|
-
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (Object.keys(fields).length === 0) {
|
|
37
|
+
return null
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return Schema.Struct(fields)
|
|
41
41
|
}
|
|
42
|
+
|
|
42
43
|
/**
|
|
43
44
|
* Validates all route modules in the given route handles.
|
|
44
45
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
46
|
+
|
|
47
|
+
export function validateRouteModules(
|
|
48
|
+
path,
|
|
49
|
+
routes,
|
|
50
|
+
) {
|
|
51
|
+
return Effect.gen(function* () {
|
|
52
|
+
const fs = yield* FileSystem.FileSystem
|
|
53
|
+
const routeHandles = routes.filter((h) => h.handle === "route")
|
|
54
|
+
|
|
55
|
+
for (const handle of routeHandles) {
|
|
56
|
+
const routeModulePath = NPath.resolve(path, handle.modulePath)
|
|
57
|
+
const expectedSchema = generatePathParamsSchema(handle.segments)
|
|
58
|
+
|
|
59
|
+
const fileExists = yield* fs
|
|
60
|
+
.exists(routeModulePath)
|
|
61
|
+
.pipe(Effect.catchAll(() => Effect.succeed(false)))
|
|
62
|
+
if (!fileExists) {
|
|
63
|
+
continue
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const module = yield* Effect.tryPromise({
|
|
67
|
+
try: () => import(routeModulePath),
|
|
68
|
+
catch: (cause) =>
|
|
69
|
+
new FileRouter.FileRouterError({
|
|
70
|
+
reason: "Import",
|
|
71
|
+
cause,
|
|
72
|
+
path: routeModulePath,
|
|
73
|
+
}),
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
if (!validateRouteModule(module)) {
|
|
77
|
+
yield* Effect.logWarning(`Route module ${routeModulePath} should export default Route`)
|
|
78
|
+
continue
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const routeSet = module.default
|
|
82
|
+
// extract user schema
|
|
83
|
+
const userSchema = undefined
|
|
84
|
+
|
|
85
|
+
if (expectedSchema && userSchema && !SchemaExtra.schemaEqual(userSchema, expectedSchema)) {
|
|
86
|
+
const relativeFilePath = NPath.relative(process.cwd(), routeModulePath)
|
|
87
|
+
yield* Effect.logError(
|
|
88
|
+
`Route '${relativeFilePath}' has incorrect PathParams schema, expected schemaPathParams(${SchemaExtra.formatSchemaCode(
|
|
89
|
+
expectedSchema,
|
|
90
|
+
)})`,
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
})
|
|
79
95
|
}
|
|
96
|
+
|
|
80
97
|
export function generateCode(fileRoutes) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
routesByPath.set(fileRoute.routePath, existing);
|
|
98
|
+
// Group routes by path to find layers
|
|
99
|
+
const routesByPath = new Map()
|
|
100
|
+
|
|
101
|
+
for (const fileRoute of fileRoutes) {
|
|
102
|
+
const existing = routesByPath.get(fileRoute.routePath) || { layers: [] }
|
|
103
|
+
if (fileRoute.handle === "route") {
|
|
104
|
+
existing.route = fileRoute
|
|
105
|
+
} else if (fileRoute.handle === "layer") {
|
|
106
|
+
existing.layers.push(fileRoute)
|
|
92
107
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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 });
|
|
108
|
+
routesByPath.set(fileRoute.routePath, existing)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Helper to check if layer's path is an ancestor of route's path
|
|
112
|
+
const layerMatchesRoute = (layer, route) => {
|
|
113
|
+
const layerDir = layer.modulePath.replace(/\/(layer)\.(tsx?|jsx?)$/, "")
|
|
114
|
+
if (layerDir === "/") return true
|
|
115
|
+
return route.modulePath.startsWith(layerDir + "/")
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Build entries for each route path
|
|
119
|
+
const entries = []
|
|
120
|
+
|
|
121
|
+
for (const [path, { route }] of routesByPath) {
|
|
122
|
+
if (!route) continue
|
|
123
|
+
|
|
124
|
+
// Collect all parent layers that match the route's groups
|
|
125
|
+
const allLayers = []
|
|
126
|
+
let currentPath = path
|
|
127
|
+
|
|
128
|
+
while (true) {
|
|
129
|
+
const pathData = routesByPath.get(currentPath)
|
|
130
|
+
if (pathData?.layers) {
|
|
131
|
+
const matchingLayers = pathData.layers.filter((layer) => layerMatchesRoute(layer, route))
|
|
132
|
+
allLayers.unshift(...matchingLayers)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (currentPath === "/") break
|
|
136
|
+
|
|
137
|
+
const parentPath = currentPath.substring(0, currentPath.lastIndexOf("/"))
|
|
138
|
+
currentPath = parentPath || "/"
|
|
131
139
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
140
|
+
|
|
141
|
+
// Convert file-style path to colon-style PathPattern
|
|
142
|
+
const pathPatternResult = FilePathPattern.toPathPattern(path)
|
|
143
|
+
if (Either.isLeft(pathPatternResult)) {
|
|
144
|
+
continue
|
|
135
145
|
}
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
146
|
+
const pathPattern = pathPatternResult.right
|
|
147
|
+
|
|
148
|
+
// Order: route first, then layers from innermost to outermost
|
|
149
|
+
const loaders = [
|
|
150
|
+
`() => import(".${route.modulePath}")`,
|
|
151
|
+
...allLayers.reverse().map((layer) => `() => import(".${layer.modulePath}")`),
|
|
152
|
+
]
|
|
153
|
+
|
|
154
|
+
entries.push({ path: pathPattern, loaders })
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// No routes found - don't create file
|
|
158
|
+
if (entries.length === 0) {
|
|
159
|
+
return null
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const routeEntries = entries
|
|
163
|
+
.map(({ path, loaders }) => {
|
|
164
|
+
const loadersCode = loaders.join(",\n ")
|
|
165
|
+
return ` "${path}": [\n ${loadersCode},\n ]`
|
|
140
166
|
})
|
|
141
|
-
|
|
142
|
-
|
|
167
|
+
.join(",\n")
|
|
168
|
+
|
|
169
|
+
return `/**
|
|
143
170
|
* Auto-generated by effect-start.
|
|
144
171
|
*/
|
|
145
172
|
|
|
146
173
|
export default {
|
|
147
174
|
${routeEntries},
|
|
148
175
|
} satisfies import("effect-start/FileRouter").FileRoutes
|
|
149
|
-
|
|
176
|
+
`
|
|
150
177
|
}
|
|
178
|
+
|
|
151
179
|
/**
|
|
152
180
|
* Updates the tree file only if the generated content differs from the existing file.
|
|
153
181
|
* This prevents infinite loops when watching for file changes.
|
|
154
182
|
*/
|
|
155
|
-
export function update(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
183
|
+
export function update(
|
|
184
|
+
routesPath,
|
|
185
|
+
treePath = "server.gen.ts",
|
|
186
|
+
) {
|
|
187
|
+
return Effect.gen(function* () {
|
|
188
|
+
treePath = NPath.resolve(routesPath, treePath)
|
|
189
|
+
|
|
190
|
+
const fs = yield* FileSystem.FileSystem
|
|
191
|
+
const files = yield* fs.readDirectory(routesPath, { recursive: true }).pipe(
|
|
192
|
+
Effect.mapError(
|
|
193
|
+
(cause) =>
|
|
194
|
+
new FileRouter.FileRouterError({
|
|
160
195
|
reason: "FileSystem",
|
|
161
196
|
cause,
|
|
162
197
|
path: routesPath,
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
})));
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
yield* Effect.logDebug(`File routes tree unchanged: ${treePath}`);
|
|
198
|
+
}),
|
|
199
|
+
),
|
|
200
|
+
)
|
|
201
|
+
const fileRoutes = yield* FileRouter.getFileRoutes(files)
|
|
202
|
+
|
|
203
|
+
// Validate route modules
|
|
204
|
+
yield* validateRouteModules(routesPath, fileRoutes)
|
|
205
|
+
|
|
206
|
+
const newCode = generateCode(fileRoutes)
|
|
207
|
+
|
|
208
|
+
// Check if file exists (ok to fail - means file doesn't exist)
|
|
209
|
+
const existingCode = yield* fs
|
|
210
|
+
.readFileString(treePath)
|
|
211
|
+
.pipe(Effect.catchAll(() => Effect.succeed(null)))
|
|
212
|
+
|
|
213
|
+
// No routes found
|
|
214
|
+
if (newCode === null) {
|
|
215
|
+
// If gen file exists, write empty export
|
|
216
|
+
if (existingCode !== null) {
|
|
217
|
+
const emptyCode = "export default {}\n"
|
|
218
|
+
if (existingCode !== emptyCode) {
|
|
219
|
+
yield* Effect.logDebug(`Clearing file routes tree: ${treePath}`)
|
|
220
|
+
yield* fs.writeFileString(treePath, emptyCode).pipe(
|
|
221
|
+
Effect.mapError(
|
|
222
|
+
(cause) =>
|
|
223
|
+
new FileRouter.FileRouterError({
|
|
224
|
+
reason: "FileSystem",
|
|
225
|
+
cause,
|
|
226
|
+
path: treePath,
|
|
227
|
+
}),
|
|
228
|
+
),
|
|
229
|
+
)
|
|
199
230
|
}
|
|
200
|
-
|
|
231
|
+
}
|
|
232
|
+
return
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Write if content differs
|
|
236
|
+
if (existingCode !== newCode) {
|
|
237
|
+
yield* Effect.logDebug(`Updating file routes tree: ${treePath}`)
|
|
238
|
+
yield* fs.writeFileString(treePath, newCode).pipe(
|
|
239
|
+
Effect.mapError(
|
|
240
|
+
(cause) =>
|
|
241
|
+
new FileRouter.FileRouterError({
|
|
242
|
+
reason: "FileSystem",
|
|
243
|
+
cause,
|
|
244
|
+
path: treePath,
|
|
245
|
+
}),
|
|
246
|
+
),
|
|
247
|
+
)
|
|
248
|
+
} else {
|
|
249
|
+
yield* Effect.logDebug(`File routes tree unchanged: ${treePath}`)
|
|
250
|
+
}
|
|
251
|
+
})
|
|
201
252
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
253
|
+
|
|
254
|
+
export function dump(
|
|
255
|
+
routesPath,
|
|
256
|
+
treePath = "server.gen.ts",
|
|
257
|
+
) {
|
|
258
|
+
return Effect.gen(function* () {
|
|
259
|
+
treePath = NPath.resolve(routesPath, treePath)
|
|
260
|
+
|
|
261
|
+
const fs = yield* FileSystem.FileSystem
|
|
262
|
+
const files = yield* fs.readDirectory(routesPath, { recursive: true }).pipe(
|
|
263
|
+
Effect.mapError(
|
|
264
|
+
(cause) =>
|
|
265
|
+
new FileRouter.FileRouterError({
|
|
207
266
|
reason: "FileSystem",
|
|
208
267
|
cause,
|
|
209
268
|
path: routesPath,
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
269
|
+
}),
|
|
270
|
+
),
|
|
271
|
+
)
|
|
272
|
+
const fileRoutes = yield* FileRouter.getFileRoutes(files)
|
|
273
|
+
|
|
274
|
+
// Validate route modules
|
|
275
|
+
yield* validateRouteModules(routesPath, fileRoutes)
|
|
276
|
+
|
|
277
|
+
const code = generateCode(fileRoutes)
|
|
278
|
+
|
|
279
|
+
// No routes found - don't create file
|
|
280
|
+
if (code === null) {
|
|
281
|
+
yield* Effect.logDebug(`No routes found, skipping: ${treePath}`)
|
|
282
|
+
return
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
yield* Effect.logDebug(`Generating file routes tree: ${treePath}`)
|
|
286
|
+
|
|
287
|
+
yield* fs.writeFileString(treePath, code).pipe(
|
|
288
|
+
Effect.mapError(
|
|
289
|
+
(cause) =>
|
|
290
|
+
new FileRouter.FileRouterError({
|
|
222
291
|
reason: "FileSystem",
|
|
223
292
|
cause,
|
|
224
293
|
path: treePath,
|
|
225
|
-
|
|
226
|
-
|
|
294
|
+
}),
|
|
295
|
+
),
|
|
296
|
+
)
|
|
297
|
+
})
|
|
227
298
|
}
|