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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "effect-start",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"src/",
|
|
@@ -12,92 +12,24 @@
|
|
|
12
12
|
],
|
|
13
13
|
"type": "module",
|
|
14
14
|
"exports": {
|
|
15
|
-
".":
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"./
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"./
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"default": "./dist/client/index.js"
|
|
29
|
-
},
|
|
30
|
-
"./testing": {
|
|
31
|
-
"types": "./dist/testing/index.d.ts",
|
|
32
|
-
"bun": "./src/testing/index.ts",
|
|
33
|
-
"default": "./dist/testing/index.js"
|
|
34
|
-
},
|
|
35
|
-
"./console": {
|
|
36
|
-
"types": "./dist/console/index.d.ts",
|
|
37
|
-
"bun": "./src/console/index.ts",
|
|
38
|
-
"default": "./dist/console/index.js"
|
|
39
|
-
},
|
|
40
|
-
"./sql/*": {
|
|
41
|
-
"types": "./dist/sql/*/index.d.ts",
|
|
42
|
-
"bun": "./src/sql/*/index.ts",
|
|
43
|
-
"default": "./dist/sql/*/index.js"
|
|
44
|
-
},
|
|
45
|
-
"./x/*": {
|
|
46
|
-
"types": "./dist/x/*/index.d.ts",
|
|
47
|
-
"bun": "./src/x/*/index.ts",
|
|
48
|
-
"default": "./dist/x/*/index.js"
|
|
49
|
-
},
|
|
50
|
-
"./x/tailwind/plugin": {
|
|
51
|
-
"types": "./dist/x/tailwind/plugin.d.ts",
|
|
52
|
-
"bun": "./src/x/tailwind/plugin.ts",
|
|
53
|
-
"default": "./dist/x/tailwind/plugin.js"
|
|
54
|
-
},
|
|
55
|
-
"./System": {
|
|
56
|
-
"types": "./dist/System.d.ts",
|
|
57
|
-
"bun": "./src/System.ts",
|
|
58
|
-
"default": "./dist/System.js"
|
|
59
|
-
},
|
|
60
|
-
"./Unique": {
|
|
61
|
-
"types": "./dist/Unique.d.ts",
|
|
62
|
-
"bun": "./src/Unique.ts",
|
|
63
|
-
"default": "./dist/Unique.js"
|
|
64
|
-
},
|
|
65
|
-
"./FileRouter": {
|
|
66
|
-
"types": "./dist/FileRouter.d.ts",
|
|
67
|
-
"bun": "./src/FileRouter.ts",
|
|
68
|
-
"default": "./dist/FileRouter.js"
|
|
69
|
-
},
|
|
70
|
-
"./FileSystem": {
|
|
71
|
-
"types": "./dist/FileSystem.d.ts",
|
|
72
|
-
"bun": "./src/FileSystem.ts",
|
|
73
|
-
"default": "./dist/FileSystem.js"
|
|
74
|
-
},
|
|
75
|
-
"./experimental": {
|
|
76
|
-
"types": "./dist/experimental/index.d.ts",
|
|
77
|
-
"bun": "./src/experimental/index.ts",
|
|
78
|
-
"default": "./dist/experimental/index.js"
|
|
79
|
-
},
|
|
15
|
+
".": "./src/index.ts",
|
|
16
|
+
"./bun": "./src/bun/index.ts",
|
|
17
|
+
"./client": "./src/client/index.ts",
|
|
18
|
+
"./testing": "./src/testing/index.ts",
|
|
19
|
+
"./console": "./src/console/index.ts",
|
|
20
|
+
"./sql/*": "./src/sql/*/index.ts",
|
|
21
|
+
"./x/*": "./src/x/*/index.ts",
|
|
22
|
+
"./x/tailwind/plugin": "./src/x/tailwind/plugin.ts",
|
|
23
|
+
"./System": "./src/System.ts",
|
|
24
|
+
"./Unique": "./src/Unique.ts",
|
|
25
|
+
"./FileRouter": "./src/FileRouter.ts",
|
|
26
|
+
"./FileSystem": "./src/FileSystem.ts",
|
|
27
|
+
"./experimental": "./src/experimental/index.ts",
|
|
80
28
|
"./client/assets.d.ts": "./src/assets.d.ts",
|
|
81
|
-
"./hyper":
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
},
|
|
86
|
-
"./jsx-runtime": {
|
|
87
|
-
"types": "./src/hyper/jsx-runtime.ts",
|
|
88
|
-
"bun": "./src/hyper/jsx-runtime.ts",
|
|
89
|
-
"default": "./dist/hyper/jsx-runtime.js"
|
|
90
|
-
},
|
|
91
|
-
"./jsx-dev-runtime": {
|
|
92
|
-
"types": "./src/hyper/jsx-runtime.ts",
|
|
93
|
-
"bun": "./src/hyper/jsx-runtime.ts",
|
|
94
|
-
"default": "./dist/hyper/jsx-runtime.js"
|
|
95
|
-
},
|
|
96
|
-
"./datastar": {
|
|
97
|
-
"types": "./dist/datastar/index.d.ts",
|
|
98
|
-
"bun": "./src/datastar/index.ts",
|
|
99
|
-
"default": "./dist/datastar/index.js"
|
|
100
|
-
},
|
|
29
|
+
"./hyper": "./src/hyper/index.ts",
|
|
30
|
+
"./jsx-runtime": "./src/hyper/jsx-runtime.ts",
|
|
31
|
+
"./jsx-dev-runtime": "./src/hyper/jsx-runtime.ts",
|
|
32
|
+
"./datastar": "./src/datastar/index.ts",
|
|
101
33
|
"./lint/plugin": "./src/lint/plugin.js",
|
|
102
34
|
"./package.json": "./package.json"
|
|
103
35
|
},
|
package/src/Development.ts
CHANGED
|
@@ -104,10 +104,12 @@ export const layerWatch = (opts?: {
|
|
|
104
104
|
filter?: (event: FileSystem.WatchEvent) => boolean
|
|
105
105
|
}) => Layer.scoped(Development, watch(opts))
|
|
106
106
|
|
|
107
|
+
export const option = Effect.serviceOption(Development)
|
|
108
|
+
|
|
107
109
|
export const stream = (): Stream.Stream<DevelopmentEvent> =>
|
|
108
110
|
Stream.unwrap(
|
|
109
111
|
Function.pipe(
|
|
110
|
-
|
|
112
|
+
option,
|
|
111
113
|
Effect.map(
|
|
112
114
|
Option.match({
|
|
113
115
|
onNone: () => Stream.empty,
|
package/src/Entity.ts
CHANGED
|
@@ -325,6 +325,23 @@ export function length(self: Entity): number | undefined {
|
|
|
325
325
|
return undefined
|
|
326
326
|
}
|
|
327
327
|
|
|
328
|
+
export function fromResponse(
|
|
329
|
+
response: Response,
|
|
330
|
+
request?: Request,
|
|
331
|
+
): Entity<Effect.Effect<Uint8Array, Error, never>, Error> {
|
|
332
|
+
return make(
|
|
333
|
+
Effect.tryPromise({
|
|
334
|
+
try: () => response.arrayBuffer().then((buf) => new Uint8Array(buf)),
|
|
335
|
+
catch: (e) => (e instanceof Error ? e : new Error(String(e))),
|
|
336
|
+
}),
|
|
337
|
+
{
|
|
338
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
339
|
+
status: response.status,
|
|
340
|
+
url: response.url || request?.url,
|
|
341
|
+
},
|
|
342
|
+
)
|
|
343
|
+
}
|
|
344
|
+
|
|
328
345
|
function mismatch(expected: Schema.Schema.Any, actual: unknown): ParseResult.ParseError {
|
|
329
346
|
return new ParseResult.ParseError({
|
|
330
347
|
issue: new ParseResult.Type(expected.ast, actual),
|
package/src/Fetch.ts
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import * as Data from "effect/Data"
|
|
2
|
+
import * as Effect from "effect/Effect"
|
|
3
|
+
import * as Schedule from "effect/Schedule"
|
|
4
|
+
import * as Entity from "./Entity.ts"
|
|
5
|
+
|
|
6
|
+
const TypeId: unique symbol = Symbol.for("effect-start/FetchClient")
|
|
7
|
+
type TypeId = typeof TypeId
|
|
8
|
+
|
|
9
|
+
export type FetchEntity = Entity.Entity<Effect.Effect<Uint8Array, FetchError, never>, FetchError>
|
|
10
|
+
|
|
11
|
+
export class FetchError extends Data.TaggedError("FetchError")<{
|
|
12
|
+
readonly reason: "Network" | "Status"
|
|
13
|
+
readonly cause?: unknown
|
|
14
|
+
readonly request?: Request
|
|
15
|
+
readonly response?: FetchEntity
|
|
16
|
+
}> {}
|
|
17
|
+
|
|
18
|
+
type Next = (request: Request) => Effect.Effect<FetchEntity, FetchError, never>
|
|
19
|
+
|
|
20
|
+
export type Middleware<E = never, R = never> = (
|
|
21
|
+
request: Request,
|
|
22
|
+
next: Next,
|
|
23
|
+
) => Effect.Effect<FetchEntity, FetchError | E, R>
|
|
24
|
+
|
|
25
|
+
const tryFetch: Middleware = (request) =>
|
|
26
|
+
Effect.map(
|
|
27
|
+
Effect.tryPromise({
|
|
28
|
+
try: () => globalThis.fetch(request),
|
|
29
|
+
catch: (e) => new FetchError({ reason: "Network", cause: e, request }),
|
|
30
|
+
}),
|
|
31
|
+
(response) => Entity.fromResponse(response, request) as FetchEntity,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
const defaultMiddleware: ReadonlyArray<Middleware> = [tryFetch]
|
|
35
|
+
const noopNext: Next = () => Effect.die("no middleware")
|
|
36
|
+
|
|
37
|
+
function withTrace<E, R>(
|
|
38
|
+
request: Request,
|
|
39
|
+
effect: Effect.Effect<FetchEntity, E, R>,
|
|
40
|
+
): Effect.Effect<FetchEntity, E, R> {
|
|
41
|
+
const url = new URL(request.url)
|
|
42
|
+
|
|
43
|
+
return Effect.useSpan(
|
|
44
|
+
`http.client ${request.method}`,
|
|
45
|
+
{ kind: "client", captureStackTrace: false },
|
|
46
|
+
(span) => {
|
|
47
|
+
span.attribute("http.request.method", request.method)
|
|
48
|
+
span.attribute("url.full", url.toString())
|
|
49
|
+
span.attribute("url.path", url.pathname)
|
|
50
|
+
const query = url.search.slice(1)
|
|
51
|
+
if (query !== "") {
|
|
52
|
+
span.attribute("url.query", query)
|
|
53
|
+
}
|
|
54
|
+
span.attribute("url.scheme", url.protocol.slice(0, -1))
|
|
55
|
+
|
|
56
|
+
return Effect.flatMap(Effect.exit(Effect.withParentSpan(effect, span)), (exit) => {
|
|
57
|
+
if (exit._tag === "Success") {
|
|
58
|
+
span.attribute("http.response.status_code", exit.value.status ?? 0)
|
|
59
|
+
}
|
|
60
|
+
return exit
|
|
61
|
+
})
|
|
62
|
+
},
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface FetchClient<E = never, R = never> {
|
|
67
|
+
readonly [TypeId]: TypeId
|
|
68
|
+
readonly middleware: ReadonlyArray<Middleware<any, any>>
|
|
69
|
+
readonly fetch: (
|
|
70
|
+
input: string | URL | Request,
|
|
71
|
+
init?: RequestInit,
|
|
72
|
+
) => Effect.Effect<FetchEntity, FetchError | E, R>
|
|
73
|
+
readonly get: (
|
|
74
|
+
input: string | URL | Request,
|
|
75
|
+
init?: Omit<RequestInit, "method">,
|
|
76
|
+
) => Effect.Effect<FetchEntity, FetchError | E, R>
|
|
77
|
+
readonly post: (
|
|
78
|
+
input: string | URL | Request,
|
|
79
|
+
init?: Omit<RequestInit, "method">,
|
|
80
|
+
) => Effect.Effect<FetchEntity, FetchError | E, R>
|
|
81
|
+
readonly use: <E2, R2>(
|
|
82
|
+
...middleware: ReadonlyArray<Middleware<E2, R2>>
|
|
83
|
+
) => FetchClient<E | E2, R | R2>
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function fetch(
|
|
87
|
+
input: string | URL | Request,
|
|
88
|
+
init?: RequestInit,
|
|
89
|
+
): Effect.Effect<FetchEntity, FetchError>
|
|
90
|
+
export function fetch<E, R>(
|
|
91
|
+
this: FetchClient<E, R>,
|
|
92
|
+
input: string | URL | Request,
|
|
93
|
+
init?: RequestInit,
|
|
94
|
+
): Effect.Effect<FetchEntity, FetchError | E, R>
|
|
95
|
+
export function fetch(
|
|
96
|
+
this: void | FetchClient<any, any>,
|
|
97
|
+
input: string | URL | Request,
|
|
98
|
+
init?: RequestInit,
|
|
99
|
+
): Effect.Effect<FetchEntity, any, any> {
|
|
100
|
+
const middleware: ReadonlyArray<Middleware<any, any>> =
|
|
101
|
+
(this as any)?.middleware ?? defaultMiddleware
|
|
102
|
+
return Effect.gen(function* () {
|
|
103
|
+
const request = new Request(input, init)
|
|
104
|
+
|
|
105
|
+
let handler: Next = noopNext as Next
|
|
106
|
+
for (let i = middleware.length - 1; i >= 0; i--) {
|
|
107
|
+
const nextHandler = handler
|
|
108
|
+
handler = ((req: Request) => middleware[i](req, nextHandler)) as Next
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return yield* withTrace(request, handler(request))
|
|
112
|
+
}) as any
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function get(
|
|
116
|
+
input: string | URL | Request,
|
|
117
|
+
init?: Omit<RequestInit, "method">,
|
|
118
|
+
): Effect.Effect<FetchEntity, FetchError>
|
|
119
|
+
export function get<E, R>(
|
|
120
|
+
this: FetchClient<E, R>,
|
|
121
|
+
input: string | URL | Request,
|
|
122
|
+
init?: Omit<RequestInit, "method">,
|
|
123
|
+
): Effect.Effect<FetchEntity, FetchError | E, R>
|
|
124
|
+
export function get(
|
|
125
|
+
this: void | FetchClient<any, any>,
|
|
126
|
+
input: string | URL | Request,
|
|
127
|
+
init?: Omit<RequestInit, "method">,
|
|
128
|
+
): Effect.Effect<FetchEntity, any, any> {
|
|
129
|
+
return fetch.call(this as any, input, { ...init, method: "GET" }) as any
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function post(
|
|
133
|
+
input: string | URL | Request,
|
|
134
|
+
init?: Omit<RequestInit, "method">,
|
|
135
|
+
): Effect.Effect<FetchEntity, FetchError>
|
|
136
|
+
export function post<E, R>(
|
|
137
|
+
this: FetchClient<E, R>,
|
|
138
|
+
input: string | URL | Request,
|
|
139
|
+
init?: Omit<RequestInit, "method">,
|
|
140
|
+
): Effect.Effect<FetchEntity, FetchError | E, R>
|
|
141
|
+
export function post(
|
|
142
|
+
this: void | FetchClient<any, any>,
|
|
143
|
+
input: string | URL | Request,
|
|
144
|
+
init?: Omit<RequestInit, "method">,
|
|
145
|
+
): Effect.Effect<FetchEntity, any, any> {
|
|
146
|
+
return fetch.call(this as any, input, { ...init, method: "POST" }) as any
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function use<E2, R2>(...middleware: ReadonlyArray<Middleware<E2, R2>>): FetchClient<E2, R2>
|
|
150
|
+
export function use<E, R, E2, R2>(
|
|
151
|
+
this: FetchClient<E, R>,
|
|
152
|
+
...middleware: ReadonlyArray<Middleware<E2, R2>>
|
|
153
|
+
): FetchClient<E | E2, R | R2>
|
|
154
|
+
export function use(
|
|
155
|
+
this: void | FetchClient<any, any>,
|
|
156
|
+
...middleware: ReadonlyArray<Middleware<any, any>>
|
|
157
|
+
): FetchClient<any, any> {
|
|
158
|
+
const base = (this as any)?.middleware ?? defaultMiddleware
|
|
159
|
+
const transport = base[base.length - 1]
|
|
160
|
+
const existing = base.slice(0, -1)
|
|
161
|
+
return Object.create(ClientProto, {
|
|
162
|
+
middleware: { value: [...existing, ...middleware, transport] },
|
|
163
|
+
}) as FetchClient<any, any>
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const ClientProto: any = {
|
|
167
|
+
[TypeId]: TypeId,
|
|
168
|
+
middleware: defaultMiddleware,
|
|
169
|
+
fetch,
|
|
170
|
+
get,
|
|
171
|
+
post,
|
|
172
|
+
use,
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export function filterStatus(
|
|
176
|
+
predicate: (status: number) => boolean,
|
|
177
|
+
options?: {
|
|
178
|
+
readonly orElse?: (entity: FetchEntity) => Effect.Effect<FetchEntity, any, any>
|
|
179
|
+
},
|
|
180
|
+
): Middleware<FetchError> {
|
|
181
|
+
return ((_request: Request, next: Next) =>
|
|
182
|
+
Effect.gen(function* () {
|
|
183
|
+
const entity = yield* next(_request)
|
|
184
|
+
const status = entity.status ?? 0
|
|
185
|
+
if (predicate(status)) {
|
|
186
|
+
return entity
|
|
187
|
+
}
|
|
188
|
+
if (options?.orElse) {
|
|
189
|
+
return yield* options.orElse(entity)
|
|
190
|
+
}
|
|
191
|
+
return yield* Effect.fail(new FetchError({ reason: "Status", response: entity }))
|
|
192
|
+
})) as Middleware<FetchError>
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function filterStatusOk(options?: {
|
|
196
|
+
readonly orElse?: (entity: FetchEntity) => Effect.Effect<FetchEntity, any, any>
|
|
197
|
+
}): Middleware<FetchError> {
|
|
198
|
+
return filterStatus((status) => status >= 200 && status < 300, options)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function followRedirects(options?: { readonly maxRedirects?: number }): Middleware {
|
|
202
|
+
const maxRedirects = options?.maxRedirects ?? 10
|
|
203
|
+
|
|
204
|
+
return (request: Request, next: Next) =>
|
|
205
|
+
Effect.gen(function* () {
|
|
206
|
+
let currentRequest = new Request(request.url, {
|
|
207
|
+
...request,
|
|
208
|
+
redirect: "manual",
|
|
209
|
+
})
|
|
210
|
+
let redirectCount = 0
|
|
211
|
+
|
|
212
|
+
while (true) {
|
|
213
|
+
const entity = yield* next(currentRequest)
|
|
214
|
+
const status = entity.status ?? 0
|
|
215
|
+
|
|
216
|
+
if (status >= 300 && status < 400) {
|
|
217
|
+
if (redirectCount >= maxRedirects) {
|
|
218
|
+
return entity
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const location = entity.headers["location"]
|
|
222
|
+
if (!location) {
|
|
223
|
+
return entity
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
redirectCount++
|
|
227
|
+
const nextUrl = new URL(location, currentRequest.url)
|
|
228
|
+
|
|
229
|
+
if (status === 303) {
|
|
230
|
+
currentRequest = new Request(nextUrl.toString(), {
|
|
231
|
+
method: "GET",
|
|
232
|
+
headers: currentRequest.headers,
|
|
233
|
+
redirect: "manual",
|
|
234
|
+
})
|
|
235
|
+
} else {
|
|
236
|
+
currentRequest = new Request(nextUrl.toString(), {
|
|
237
|
+
method: currentRequest.method,
|
|
238
|
+
headers: currentRequest.headers,
|
|
239
|
+
body: currentRequest.body,
|
|
240
|
+
redirect: "manual",
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
return entity
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
})
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export function retry(options: {
|
|
251
|
+
readonly times?: number
|
|
252
|
+
readonly delay?: number
|
|
253
|
+
readonly schedule?: Schedule.Schedule<any, any, any>
|
|
254
|
+
}): Middleware {
|
|
255
|
+
return ((request: Request, next: Next) => {
|
|
256
|
+
if (options.schedule) {
|
|
257
|
+
return Effect.retry(
|
|
258
|
+
Effect.suspend(() => next(request)),
|
|
259
|
+
options.schedule,
|
|
260
|
+
)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const times = options.times ?? 3
|
|
264
|
+
const delay = options.delay ?? 1000
|
|
265
|
+
|
|
266
|
+
return Effect.retry(
|
|
267
|
+
Effect.suspend(() => next(request)),
|
|
268
|
+
Schedule.intersect(Schedule.recurs(times), Schedule.exponential(delay)),
|
|
269
|
+
)
|
|
270
|
+
}) as Middleware
|
|
271
|
+
}
|
package/src/SqlIntrospect.ts
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect"
|
|
2
2
|
import * as Schema from "effect/Schema"
|
|
3
|
-
import * as Sql from "./Sql.ts"
|
|
4
|
-
|
|
5
|
-
// ---------------------------------------------------------------------------
|
|
6
|
-
// Types
|
|
7
|
-
// ---------------------------------------------------------------------------
|
|
3
|
+
import * as Sql from "./sql/Sql.ts"
|
|
8
4
|
|
|
9
5
|
export interface Column {
|
|
10
6
|
readonly tableSchema: string
|
|
@@ -58,10 +54,6 @@ export interface IntrospectOptions {
|
|
|
58
54
|
readonly indexes?: boolean
|
|
59
55
|
}
|
|
60
56
|
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
62
|
-
// SQLite
|
|
63
|
-
// ---------------------------------------------------------------------------
|
|
64
|
-
|
|
65
57
|
const sqliteColumns = `
|
|
66
58
|
SELECT
|
|
67
59
|
'' as tableSchema,
|
|
@@ -115,10 +107,6 @@ const sqliteIndexes = `
|
|
|
115
107
|
ORDER BY m.name, il.name, ii.seqno
|
|
116
108
|
`
|
|
117
109
|
|
|
118
|
-
// ---------------------------------------------------------------------------
|
|
119
|
-
// PostgreSQL
|
|
120
|
-
// ---------------------------------------------------------------------------
|
|
121
|
-
|
|
122
110
|
const postgresColumns = `
|
|
123
111
|
SELECT
|
|
124
112
|
c.table_schema as "tableSchema",
|
|
@@ -191,10 +179,6 @@ const postgresIndexes = `
|
|
|
191
179
|
ORDER BY n.nspname, t.relname, i.relname, array_position(ix.indkey, a.attnum)
|
|
192
180
|
`
|
|
193
181
|
|
|
194
|
-
// ---------------------------------------------------------------------------
|
|
195
|
-
// SQL Server (MSSQL)
|
|
196
|
-
// ---------------------------------------------------------------------------
|
|
197
|
-
|
|
198
182
|
const mssqlColumns = `
|
|
199
183
|
SELECT
|
|
200
184
|
s.name as tableSchema,
|
|
@@ -265,10 +249,6 @@ const mssqlIndexes = `
|
|
|
265
249
|
ORDER BY s.name, t.name, i.name, ic.key_ordinal
|
|
266
250
|
`
|
|
267
251
|
|
|
268
|
-
// ---------------------------------------------------------------------------
|
|
269
|
-
// Dialect resolution
|
|
270
|
-
// ---------------------------------------------------------------------------
|
|
271
|
-
|
|
272
252
|
export type Dialect = "sqlite" | "postgres" | "mssql"
|
|
273
253
|
|
|
274
254
|
const dialectQueries: Record<Dialect, { columns: string; foreignKeys: string; indexes: string }> = {
|
|
@@ -281,10 +261,6 @@ const dialectQueries: Record<Dialect, { columns: string; foreignKeys: string; in
|
|
|
281
261
|
mssql: { columns: mssqlColumns, foreignKeys: mssqlForeignKeys, indexes: mssqlIndexes },
|
|
282
262
|
}
|
|
283
263
|
|
|
284
|
-
// ---------------------------------------------------------------------------
|
|
285
|
-
// Introspect
|
|
286
|
-
// ---------------------------------------------------------------------------
|
|
287
|
-
|
|
288
264
|
const singleColumnIndexes = (indexes: ReadonlyArray<Index>): Set<string> => {
|
|
289
265
|
const countByIndex = new Map<string, { count: number; columnName: string }>()
|
|
290
266
|
for (const idx of indexes) {
|
|
@@ -377,10 +353,6 @@ export const introspect = (
|
|
|
377
353
|
return { tables: groupByTable(columns, foreignKeys, indexes) }
|
|
378
354
|
})
|
|
379
355
|
|
|
380
|
-
// ---------------------------------------------------------------------------
|
|
381
|
-
// Column → Schema mapping
|
|
382
|
-
// ---------------------------------------------------------------------------
|
|
383
|
-
|
|
384
356
|
const dataTypeToSchema = (dataType: string): Schema.Schema.Any | null => {
|
|
385
357
|
const t = dataType.toLowerCase()
|
|
386
358
|
if (
|
|
@@ -452,10 +424,6 @@ const columnToSchema = (col: Column): Schema.Schema.Any | Schema.PropertySignatu
|
|
|
452
424
|
return base
|
|
453
425
|
}
|
|
454
426
|
|
|
455
|
-
// ---------------------------------------------------------------------------
|
|
456
|
-
// Table → Schema.Struct
|
|
457
|
-
// ---------------------------------------------------------------------------
|
|
458
|
-
|
|
459
427
|
export interface TableSchema {
|
|
460
428
|
readonly tableName: string
|
|
461
429
|
readonly tableSchema: string
|
|
@@ -487,10 +455,6 @@ export const toSchemas = (db: DatabaseSchema): ReadonlyArray<TableSchema> =>
|
|
|
487
455
|
return s ? [s] : []
|
|
488
456
|
})
|
|
489
457
|
|
|
490
|
-
// ---------------------------------------------------------------------------
|
|
491
|
-
// Read-only table access
|
|
492
|
-
// ---------------------------------------------------------------------------
|
|
493
|
-
|
|
494
458
|
export interface SortOrder {
|
|
495
459
|
readonly column: string
|
|
496
460
|
readonly reverse?: boolean
|
|
@@ -531,28 +495,51 @@ export interface DatabaseReader {
|
|
|
531
495
|
|
|
532
496
|
const escapeIdentifier = (id: string): string => `"${id.replace(/"/g, '""')}"`
|
|
533
497
|
|
|
534
|
-
const
|
|
498
|
+
const concatSql = (
|
|
499
|
+
sql: Sql.SqlQuery,
|
|
500
|
+
fragments: Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }>,
|
|
501
|
+
): Effect.Effect<ReadonlyArray<unknown>, Sql.SqlError> => {
|
|
502
|
+
const strings: Array<string> = []
|
|
503
|
+
const values: Array<unknown> = []
|
|
504
|
+
for (let i = 0; i < fragments.length; i++) {
|
|
505
|
+
const frag = fragments[i]
|
|
506
|
+
for (let j = 0; j < frag.strings.length; j++) {
|
|
507
|
+
if (j === 0 && strings.length > 0) {
|
|
508
|
+
strings[strings.length - 1] += frag.strings[j]
|
|
509
|
+
} else {
|
|
510
|
+
strings.push(frag.strings[j])
|
|
511
|
+
}
|
|
512
|
+
if (j < frag.values.length) values.push(frag.values[j])
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
const tsa = Object.assign([...strings], { raw: strings }) as unknown as TemplateStringsArray
|
|
516
|
+
return sql(tsa, ...values)
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
const literal = (text: string) => ({ strings: [text], values: [] as Array<unknown> })
|
|
520
|
+
|
|
521
|
+
const param = (value: unknown) => ({ strings: ["", ""], values: [value] })
|
|
522
|
+
|
|
523
|
+
const buildWhereFragments = (
|
|
535
524
|
filters: ReadonlyArray<Filter>,
|
|
536
525
|
columnSet: Set<string>,
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
const
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
526
|
+
): Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }> => {
|
|
527
|
+
const parts: Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }> = []
|
|
528
|
+
const valid = filters.filter((f) => columnSet.has(f.column))
|
|
529
|
+
if (valid.length === 0) return parts
|
|
530
|
+
parts.push(literal(" WHERE "))
|
|
531
|
+
for (let i = 0; i < valid.length; i++) {
|
|
532
|
+
if (i > 0) parts.push(literal(" AND "))
|
|
533
|
+
const f = valid[i]
|
|
543
534
|
const col = escapeIdentifier(f.column)
|
|
544
|
-
const paramIndex = paramOffset + values.length + 1
|
|
545
535
|
if (f.value === null) {
|
|
546
|
-
|
|
536
|
+
parts.push(literal(f.op === "eq" ? `${col} IS NULL` : `${col} IS NOT NULL`))
|
|
547
537
|
} else {
|
|
548
|
-
|
|
549
|
-
|
|
538
|
+
parts.push(literal(`${col} ${f.op === "eq" ? "=" : "!="} `))
|
|
539
|
+
parts.push(param(f.value))
|
|
550
540
|
}
|
|
551
541
|
}
|
|
552
|
-
return
|
|
553
|
-
clause: conditions.length > 0 ? ` WHERE ${conditions.join(" AND ")}` : "",
|
|
554
|
-
values,
|
|
555
|
-
}
|
|
542
|
+
return parts
|
|
556
543
|
}
|
|
557
544
|
|
|
558
545
|
const makeTableReader = (ts: TableSchema): TableReader => {
|
|
@@ -573,39 +560,46 @@ const makeTableReader = (ts: TableSchema): TableReader => {
|
|
|
573
560
|
findAll: (options) =>
|
|
574
561
|
Effect.gen(function* () {
|
|
575
562
|
const sql = yield* Sql.SqlClient
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
563
|
+
const fragments: Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }> = [
|
|
564
|
+
literal(`SELECT ${selectCols} FROM ${qualifiedName}`),
|
|
565
|
+
]
|
|
566
|
+
if (options?.filters) {
|
|
567
|
+
fragments.push(...buildWhereFragments(options.filters, columnSet))
|
|
568
|
+
}
|
|
581
569
|
if (options?.sort && options.sort.length > 0) {
|
|
582
570
|
const sortClauses = options.sort
|
|
583
571
|
.filter((s) => sortableSet.has(s.column))
|
|
584
572
|
.map((s) => `${escapeIdentifier(s.column)} ${s.reverse ? "DESC" : "ASC"}`)
|
|
585
|
-
if (sortClauses.length > 0)
|
|
573
|
+
if (sortClauses.length > 0) fragments.push(literal(` ORDER BY ${sortClauses.join(", ")}`))
|
|
586
574
|
}
|
|
587
|
-
if (options?.limit !== undefined)
|
|
588
|
-
|
|
589
|
-
|
|
575
|
+
if (options?.limit !== undefined)
|
|
576
|
+
fragments.push(literal(` LIMIT ${Math.trunc(Number(options.limit))}`))
|
|
577
|
+
if (options?.offset !== undefined)
|
|
578
|
+
fragments.push(literal(` OFFSET ${Math.trunc(Number(options.offset))}`))
|
|
579
|
+
return yield* concatSql(sql, fragments)
|
|
590
580
|
}),
|
|
591
581
|
findById: (id) =>
|
|
592
582
|
Effect.gen(function* () {
|
|
593
583
|
if (!primaryKey) return null
|
|
594
584
|
const sql = yield* Sql.SqlClient
|
|
595
|
-
const
|
|
596
|
-
const rows = yield* sql
|
|
585
|
+
const pkCol = escapeIdentifier(primaryKey.columnName)
|
|
586
|
+
const rows = yield* concatSql(sql, [
|
|
587
|
+
literal(`SELECT ${selectCols} FROM ${qualifiedName} WHERE ${pkCol} = `),
|
|
588
|
+
param(id),
|
|
589
|
+
])
|
|
597
590
|
return rows[0] ?? null
|
|
598
591
|
}),
|
|
599
592
|
count: (options) =>
|
|
600
593
|
Effect.gen(function* () {
|
|
601
594
|
const sql = yield* Sql.SqlClient
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
595
|
+
const fragments: Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }> = [
|
|
596
|
+
literal(`SELECT COUNT(*) as count FROM ${qualifiedName}`),
|
|
597
|
+
]
|
|
598
|
+
if (options?.filters) {
|
|
599
|
+
fragments.push(...buildWhereFragments(options.filters, columnSet))
|
|
600
|
+
}
|
|
601
|
+
const rows = yield* concatSql(sql, fragments)
|
|
602
|
+
return Number((rows[0] as any).count)
|
|
609
603
|
}),
|
|
610
604
|
}
|
|
611
605
|
}
|