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
package/dist/PathPattern.js
CHANGED
|
@@ -1,104 +1,124 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
1
3
|
function isValidSegment(segment) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
return rest !== "" && /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(rest);
|
|
4
|
+
if (segment.startsWith(":")) {
|
|
5
|
+
const rest = segment.slice(1)
|
|
6
|
+
if (rest.endsWith("*") || rest.endsWith("+") || rest.endsWith("?")) {
|
|
7
|
+
const name = rest.slice(0, -1)
|
|
8
|
+
return name !== "" && /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)
|
|
9
9
|
}
|
|
10
|
-
return /^[
|
|
10
|
+
return rest !== "" && /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(rest)
|
|
11
|
+
}
|
|
12
|
+
return /^[\p{L}\p{N}._~-]+$/u.test(segment)
|
|
11
13
|
}
|
|
14
|
+
|
|
12
15
|
export function validate(path) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
16
|
+
const segments = path.split("/").filter(Boolean)
|
|
17
|
+
for (const segment of segments) {
|
|
18
|
+
if (!isValidSegment(segment)) {
|
|
19
|
+
return {
|
|
20
|
+
ok: false,
|
|
21
|
+
error: `Invalid segment "${segment}" in "${path}"`,
|
|
22
|
+
}
|
|
21
23
|
}
|
|
22
|
-
|
|
24
|
+
}
|
|
25
|
+
return { ok: true, segments }
|
|
23
26
|
}
|
|
27
|
+
|
|
24
28
|
export function match(pattern, path) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
if (rest.endsWith("*")) {
|
|
44
|
-
const name = rest.slice(0, -1);
|
|
45
|
-
const remaining = pathSegments.slice(pathIndex);
|
|
46
|
-
if (remaining.length > 0) {
|
|
47
|
-
params[name] = remaining.join("/");
|
|
48
|
-
}
|
|
49
|
-
return params;
|
|
50
|
-
}
|
|
51
|
-
if (rest.endsWith("?")) {
|
|
52
|
-
const name = rest.slice(0, -1);
|
|
53
|
-
if (pathIndex < pathSegments.length) {
|
|
54
|
-
params[name] = pathSegments[pathIndex];
|
|
55
|
-
pathIndex++;
|
|
56
|
-
}
|
|
57
|
-
patternIndex++;
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
if (pathIndex >= pathSegments.length) {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
params[rest] = pathSegments[pathIndex];
|
|
64
|
-
pathIndex++;
|
|
65
|
-
patternIndex++;
|
|
66
|
-
continue;
|
|
29
|
+
const patternSegments = pattern.split("/").filter(Boolean)
|
|
30
|
+
const pathSegments = path.split("/").filter(Boolean)
|
|
31
|
+
const params = {}
|
|
32
|
+
let patternIndex = 0
|
|
33
|
+
let pathIndex = 0
|
|
34
|
+
|
|
35
|
+
while (patternIndex < patternSegments.length) {
|
|
36
|
+
const seg = patternSegments[patternIndex]
|
|
37
|
+
|
|
38
|
+
if (seg.startsWith(":")) {
|
|
39
|
+
const rest = seg.slice(1)
|
|
40
|
+
|
|
41
|
+
if (rest.endsWith("+")) {
|
|
42
|
+
const name = rest.slice(0, -1)
|
|
43
|
+
const remaining = pathSegments.slice(pathIndex)
|
|
44
|
+
if (remaining.length === 0) {
|
|
45
|
+
return null
|
|
67
46
|
}
|
|
68
|
-
|
|
69
|
-
|
|
47
|
+
params[name] = remaining.join("/")
|
|
48
|
+
return params
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (rest.endsWith("*")) {
|
|
52
|
+
const name = rest.slice(0, -1)
|
|
53
|
+
const remaining = pathSegments.slice(pathIndex)
|
|
54
|
+
if (remaining.length > 0) {
|
|
55
|
+
params[name] = remaining.join("/")
|
|
70
56
|
}
|
|
71
|
-
|
|
72
|
-
|
|
57
|
+
return params
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (rest.endsWith("?")) {
|
|
61
|
+
const name = rest.slice(0, -1)
|
|
62
|
+
if (pathIndex < pathSegments.length) {
|
|
63
|
+
params[name] = pathSegments[pathIndex]
|
|
64
|
+
pathIndex++
|
|
73
65
|
}
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
patternIndex++
|
|
67
|
+
continue
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (pathIndex >= pathSegments.length) {
|
|
71
|
+
return null
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
params[rest] = pathSegments[pathIndex]
|
|
75
|
+
pathIndex++
|
|
76
|
+
patternIndex++
|
|
77
|
+
continue
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (pathIndex >= pathSegments.length) {
|
|
81
|
+
return null
|
|
76
82
|
}
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
|
|
84
|
+
if (seg !== pathSegments[pathIndex]) {
|
|
85
|
+
return null
|
|
79
86
|
}
|
|
80
|
-
|
|
87
|
+
|
|
88
|
+
pathIndex++
|
|
89
|
+
patternIndex++
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (pathIndex !== pathSegments.length) {
|
|
93
|
+
return null
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return params
|
|
81
97
|
}
|
|
98
|
+
|
|
82
99
|
export function toRegex(path) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
100
|
+
const result = path
|
|
101
|
+
.replace(/\/+(\/|$)/g, "$1")
|
|
102
|
+
.replace(/\./g, "\\.")
|
|
103
|
+
.replace(/(\/?):(\w+)\+/g, "($1(?<$2>*))")
|
|
104
|
+
.replace(/(\/?):(\w+)\*/g, "(?:\\/(?<$2>.*))?")
|
|
105
|
+
.replace(/(\/?):(\w+)/g, "($1(?<$2>[^$1/]+?))")
|
|
106
|
+
.replace(/(\/?)\*/g, "($1.*)?")
|
|
107
|
+
|
|
108
|
+
return new RegExp(`^${result}/*$`)
|
|
91
109
|
}
|
|
110
|
+
|
|
92
111
|
function getModifier(seg) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return "";
|
|
112
|
+
const last = seg[seg.length - 1]
|
|
113
|
+
if (last === "?" || last === "*" || last === "+") return last
|
|
114
|
+
return ""
|
|
97
115
|
}
|
|
116
|
+
|
|
98
117
|
function getParamName(seg) {
|
|
99
|
-
|
|
100
|
-
|
|
118
|
+
const modifier = getModifier(seg)
|
|
119
|
+
return modifier ? seg.slice(1, -1) : seg.slice(1)
|
|
101
120
|
}
|
|
121
|
+
|
|
102
122
|
/**
|
|
103
123
|
* Converts to Express path pattern.
|
|
104
124
|
*
|
|
@@ -110,45 +130,47 @@ function getParamName(seg) {
|
|
|
110
130
|
* - `:param*` → `/`, `/*param`
|
|
111
131
|
*/
|
|
112
132
|
export function toExpress(path) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
133
|
+
const segments = path.split("/").filter(Boolean)
|
|
134
|
+
const optionalWildcardIndex = segments.findIndex((s) => s.startsWith(":") && s.endsWith("*"))
|
|
135
|
+
|
|
136
|
+
if (optionalWildcardIndex !== -1) {
|
|
137
|
+
const before = segments.slice(0, optionalWildcardIndex)
|
|
138
|
+
const rest = segments[optionalWildcardIndex]
|
|
139
|
+
const name = getParamName(rest)
|
|
140
|
+
const beforeJoined = before
|
|
141
|
+
.map((s) => (s.startsWith(":") ? `:${getParamName(s)}` : s))
|
|
142
|
+
.join("/")
|
|
143
|
+
const basePath = beforeJoined ? "/" + beforeJoined : "/"
|
|
144
|
+
const withWildcard = basePath === "/" ? `/*${name}` : basePath + `/*${name}`
|
|
145
|
+
return [basePath, withWildcard]
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
let result = ""
|
|
149
|
+
for (const seg of segments) {
|
|
150
|
+
if (!seg.startsWith(":")) {
|
|
151
|
+
result += "/" + seg
|
|
152
|
+
} else {
|
|
153
|
+
const name = getParamName(seg)
|
|
154
|
+
const modifier = getModifier(seg)
|
|
155
|
+
switch (modifier) {
|
|
156
|
+
case "":
|
|
157
|
+
result += `/:${name}`
|
|
158
|
+
break
|
|
159
|
+
case "?":
|
|
160
|
+
result += `{/:${name}}`
|
|
161
|
+
break
|
|
162
|
+
case "+":
|
|
163
|
+
result += `/*${name}`
|
|
164
|
+
break
|
|
165
|
+
case "*":
|
|
166
|
+
result += `/*${name}`
|
|
167
|
+
break
|
|
168
|
+
}
|
|
149
169
|
}
|
|
150
|
-
|
|
170
|
+
}
|
|
171
|
+
return [result || "/"]
|
|
151
172
|
}
|
|
173
|
+
|
|
152
174
|
/**
|
|
153
175
|
* Converts to URLPattern path pattern.
|
|
154
176
|
*
|
|
@@ -160,18 +182,18 @@ export function toExpress(path) {
|
|
|
160
182
|
* - `:param*` → `:param*`
|
|
161
183
|
*/
|
|
162
184
|
export function toURLPattern(path) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return `:${name}${modifier}`;
|
|
185
|
+
const segments = path.split("/").filter(Boolean)
|
|
186
|
+
const joined = segments
|
|
187
|
+
.map((seg) => {
|
|
188
|
+
if (!seg.startsWith(":")) return seg
|
|
189
|
+
const name = getParamName(seg)
|
|
190
|
+
const modifier = getModifier(seg)
|
|
191
|
+
return `:${name}${modifier}`
|
|
171
192
|
})
|
|
172
|
-
|
|
173
|
-
|
|
193
|
+
.join("/")
|
|
194
|
+
return [joined ? "/" + joined : "/"]
|
|
174
195
|
}
|
|
196
|
+
|
|
175
197
|
/**
|
|
176
198
|
* Converts to React Router path pattern.
|
|
177
199
|
*
|
|
@@ -183,48 +205,50 @@ export function toURLPattern(path) {
|
|
|
183
205
|
* - `:param*` → `/`, `/*` (splat, optional - two routes)
|
|
184
206
|
*/
|
|
185
207
|
export function toReactRouter(path) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
208
|
+
const segments = path.split("/").filter(Boolean)
|
|
209
|
+
const optionalWildcardIndex = segments.findIndex((s) => s.startsWith(":") && s.endsWith("*"))
|
|
210
|
+
|
|
211
|
+
if (optionalWildcardIndex !== -1) {
|
|
212
|
+
const before = segments.slice(0, optionalWildcardIndex)
|
|
213
|
+
const beforeJoined = before
|
|
214
|
+
.map((s) => {
|
|
215
|
+
if (!s.startsWith(":")) return s
|
|
216
|
+
const name = getParamName(s)
|
|
217
|
+
const modifier = getModifier(s)
|
|
218
|
+
return modifier === "?" ? `:${name}?` : `:${name}`
|
|
219
|
+
})
|
|
220
|
+
.join("/")
|
|
221
|
+
const basePath = beforeJoined ? "/" + beforeJoined : "/"
|
|
222
|
+
const withWildcard = basePath === "/" ? "/*" : basePath + "/*"
|
|
223
|
+
return [basePath, withWildcard]
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const joined = segments
|
|
227
|
+
.map((s) => {
|
|
228
|
+
if (!s.startsWith(":")) return s
|
|
229
|
+
const name = getParamName(s)
|
|
230
|
+
const modifier = getModifier(s)
|
|
231
|
+
switch (modifier) {
|
|
232
|
+
case "":
|
|
233
|
+
return `:${name}`
|
|
234
|
+
case "?":
|
|
235
|
+
return `:${name}?`
|
|
236
|
+
case "+":
|
|
237
|
+
case "*":
|
|
238
|
+
return "*"
|
|
239
|
+
}
|
|
218
240
|
})
|
|
219
|
-
|
|
220
|
-
|
|
241
|
+
.join("/")
|
|
242
|
+
return [joined ? "/" + joined : "/"]
|
|
221
243
|
}
|
|
244
|
+
|
|
222
245
|
/**
|
|
223
246
|
* Alias for toReactRouter.
|
|
224
247
|
*
|
|
225
248
|
* @see https://reactrouter.com/start/framework/routing
|
|
226
249
|
*/
|
|
227
|
-
export const toRemix = toReactRouter
|
|
250
|
+
export const toRemix = toReactRouter
|
|
251
|
+
|
|
228
252
|
/**
|
|
229
253
|
* Converts to Remix file-based route naming convention.
|
|
230
254
|
*
|
|
@@ -239,25 +263,27 @@ export const toRemix = toReactRouter;
|
|
|
239
263
|
* - `:param*` → `($)` (optional splat) - Note: not officially supported
|
|
240
264
|
*/
|
|
241
265
|
export function toRemixFile(path) {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
266
|
+
const segments = path.split("/").filter(Boolean)
|
|
267
|
+
|
|
268
|
+
const mapped = segments.map((seg) => {
|
|
269
|
+
if (!seg.startsWith(":")) return seg
|
|
270
|
+
const name = getParamName(seg)
|
|
271
|
+
const modifier = getModifier(seg)
|
|
272
|
+
switch (modifier) {
|
|
273
|
+
case "":
|
|
274
|
+
return `$${name}`
|
|
275
|
+
case "?":
|
|
276
|
+
return `($${name})`
|
|
277
|
+
case "+":
|
|
278
|
+
return "$"
|
|
279
|
+
case "*":
|
|
280
|
+
return "($)"
|
|
281
|
+
}
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
return mapped.join(".")
|
|
260
285
|
}
|
|
286
|
+
|
|
261
287
|
/**
|
|
262
288
|
* Converts to TanStack Router path/file pattern.
|
|
263
289
|
*
|
|
@@ -273,25 +299,27 @@ export function toRemixFile(path) {
|
|
|
273
299
|
* - `:param*` → `$` (splat, optional not supported - treated as required)
|
|
274
300
|
*/
|
|
275
301
|
export function toTanStack(path) {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
302
|
+
const segments = path.split("/").filter(Boolean)
|
|
303
|
+
|
|
304
|
+
const mapped = segments.map((seg) => {
|
|
305
|
+
if (!seg.startsWith(":")) return seg
|
|
306
|
+
const name = getParamName(seg)
|
|
307
|
+
const modifier = getModifier(seg)
|
|
308
|
+
switch (modifier) {
|
|
309
|
+
case "":
|
|
310
|
+
return `$${name}`
|
|
311
|
+
case "?":
|
|
312
|
+
return `{-$${name}}`
|
|
313
|
+
case "+":
|
|
314
|
+
return "$"
|
|
315
|
+
case "*":
|
|
316
|
+
return "$"
|
|
317
|
+
}
|
|
318
|
+
})
|
|
319
|
+
|
|
320
|
+
return mapped.join(".")
|
|
294
321
|
}
|
|
322
|
+
|
|
295
323
|
/**
|
|
296
324
|
* Converts to Hono path pattern.
|
|
297
325
|
*
|
|
@@ -306,42 +334,43 @@ export function toTanStack(path) {
|
|
|
306
334
|
* - `:param*` → `/`, `/*` (unnamed, optional - two routes)
|
|
307
335
|
*/
|
|
308
336
|
export function toHono(path) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
337
|
+
const segments = path.split("/").filter(Boolean)
|
|
338
|
+
const optionalWildcardIndex = segments.findIndex((s) => s.startsWith(":") && s.endsWith("*"))
|
|
339
|
+
|
|
340
|
+
if (optionalWildcardIndex !== -1) {
|
|
341
|
+
const before = segments.slice(0, optionalWildcardIndex)
|
|
342
|
+
const beforeJoined = before
|
|
343
|
+
.map((s) => {
|
|
344
|
+
if (!s.startsWith(":")) return s
|
|
345
|
+
const name = getParamName(s)
|
|
346
|
+
const modifier = getModifier(s)
|
|
347
|
+
return modifier === "?" ? `:${name}?` : `:${name}`
|
|
348
|
+
})
|
|
349
|
+
.join("/")
|
|
350
|
+
const basePath = beforeJoined ? "/" + beforeJoined : "/"
|
|
351
|
+
const withWildcard = basePath === "/" ? "/*" : basePath + "/*"
|
|
352
|
+
return [basePath, withWildcard]
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
const joined = segments
|
|
356
|
+
.map((s) => {
|
|
357
|
+
if (!s.startsWith(":")) return s
|
|
358
|
+
const name = getParamName(s)
|
|
359
|
+
const modifier = getModifier(s)
|
|
360
|
+
switch (modifier) {
|
|
361
|
+
case "":
|
|
362
|
+
return `:${name}`
|
|
363
|
+
case "?":
|
|
364
|
+
return `:${name}?`
|
|
365
|
+
case "+":
|
|
366
|
+
case "*":
|
|
367
|
+
return "*"
|
|
368
|
+
}
|
|
341
369
|
})
|
|
342
|
-
|
|
343
|
-
|
|
370
|
+
.join("/")
|
|
371
|
+
return [joined ? "/" + joined : "/"]
|
|
344
372
|
}
|
|
373
|
+
|
|
345
374
|
/**
|
|
346
375
|
* Converts to Effect HttpRouter / find-my-way path pattern.
|
|
347
376
|
*
|
|
@@ -355,8 +384,9 @@ export function toHono(path) {
|
|
|
355
384
|
* - `:param*` → `/`, `/*` (two routes)
|
|
356
385
|
*/
|
|
357
386
|
export function toEffect(path) {
|
|
358
|
-
|
|
387
|
+
return toHono(path)
|
|
359
388
|
}
|
|
389
|
+
|
|
360
390
|
/**
|
|
361
391
|
* Converts to Bun.serve path pattern.
|
|
362
392
|
*
|
|
@@ -371,43 +401,51 @@ export function toEffect(path) {
|
|
|
371
401
|
* - `:param*` → `/`, `/*` (two routes)
|
|
372
402
|
*/
|
|
373
403
|
export function toBun(path) {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
return
|
|
404
|
+
const segments = path.split("/").filter(Boolean)
|
|
405
|
+
|
|
406
|
+
const optionalIndex = segments.findIndex(
|
|
407
|
+
(s) => s.startsWith(":") && (s.endsWith("?") || s.endsWith("*")),
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
if (optionalIndex === -1) {
|
|
411
|
+
const joined = segments
|
|
412
|
+
.map((s) => {
|
|
413
|
+
if (!s.startsWith(":")) return s
|
|
414
|
+
const modifier = getModifier(s)
|
|
415
|
+
const name = getParamName(s)
|
|
416
|
+
return modifier === "+" || modifier === "*" ? "*" : `:${name}`
|
|
417
|
+
})
|
|
418
|
+
.join("/")
|
|
419
|
+
return [joined ? `/${joined}` : "/"]
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const before = segments.slice(0, optionalIndex)
|
|
423
|
+
const optional = segments[optionalIndex]
|
|
424
|
+
const after = segments.slice(optionalIndex + 1)
|
|
425
|
+
|
|
426
|
+
const formatSegment = (s) => {
|
|
427
|
+
if (!s.startsWith(":")) return s
|
|
428
|
+
const modifier = getModifier(s)
|
|
429
|
+
const name = getParamName(s)
|
|
430
|
+
switch (modifier) {
|
|
431
|
+
case "":
|
|
432
|
+
case "?":
|
|
433
|
+
return `:${name}`
|
|
434
|
+
case "+":
|
|
435
|
+
case "*":
|
|
436
|
+
return "*"
|
|
387
437
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
case "*":
|
|
402
|
-
return "*";
|
|
403
|
-
}
|
|
404
|
-
};
|
|
405
|
-
const beforePath = before.map(formatSegment).join("/");
|
|
406
|
-
const basePath = beforePath ? `/${beforePath}` : "/";
|
|
407
|
-
const optionalModifier = getModifier(optional);
|
|
408
|
-
const optionalName = getParamName(optional);
|
|
409
|
-
const requiredOptional = optionalModifier === "*" ? `:${optionalName}+` : `:${optionalName}`;
|
|
410
|
-
const withOptionalSegments = [...before, requiredOptional, ...after];
|
|
411
|
-
const withOptionalPath = `/${withOptionalSegments.map(formatSegment).join("/")}`;
|
|
412
|
-
return [...toBun(basePath), ...toBun(withOptionalPath)];
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const beforePath = before.map(formatSegment).join("/")
|
|
441
|
+
const basePath = beforePath ? `/${beforePath}` : "/"
|
|
442
|
+
|
|
443
|
+
const optionalModifier = getModifier(optional)
|
|
444
|
+
const optionalName = getParamName(optional)
|
|
445
|
+
const requiredOptional = optionalModifier === "*" ? `:${optionalName}+` : `:${optionalName}`
|
|
446
|
+
|
|
447
|
+
const withOptionalSegments = [...before, requiredOptional, ...after]
|
|
448
|
+
const withOptionalPath = `/${withOptionalSegments.map(formatSegment).join("/")}`
|
|
449
|
+
|
|
450
|
+
return [...toBun(basePath), ...toBun(withOptionalPath)]
|
|
413
451
|
}
|