@effect/sql-d1 4.0.0-beta.8 → 4.0.0-beta.81
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/D1Client.d.ts +45 -15
- package/dist/D1Client.d.ts.map +1 -1
- package/dist/D1Client.js +36 -19
- package/dist/D1Client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/package.json +5 -5
- package/src/D1Client.ts +59 -26
- package/src/index.ts +2 -2
package/dist/D1Client.d.ts
CHANGED
|
@@ -1,28 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Cloudflare D1 client implementation for Effect SQL, backed by a Workers `D1Database` binding.
|
|
3
|
+
*
|
|
4
|
+
* This module adapts a Cloudflare D1 database binding into both the
|
|
5
|
+
* D1-specific `D1Client` service and the generic Effect `SqlClient` service.
|
|
6
|
+
* It uses the SQLite statement compiler, caches prepared statements, maps D1
|
|
7
|
+
* failures to `SqlError`, and provides direct or config-backed layers.
|
|
8
|
+
* Transactions, streaming queries, and `updateValues` are not supported by this
|
|
9
|
+
* driver.
|
|
10
|
+
*
|
|
11
|
+
* @since 4.0.0
|
|
3
12
|
*/
|
|
4
13
|
import type { D1Database } from "@cloudflare/workers-types";
|
|
5
14
|
import * as Config from "effect/Config";
|
|
15
|
+
import * as Context from "effect/Context";
|
|
6
16
|
import * as Duration from "effect/Duration";
|
|
7
17
|
import * as Effect from "effect/Effect";
|
|
8
18
|
import * as Layer from "effect/Layer";
|
|
9
19
|
import type * as Scope from "effect/Scope";
|
|
10
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
11
20
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
12
21
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
13
22
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
23
|
+
* Unique runtime identifier used to tag `D1Client` values.
|
|
24
|
+
*
|
|
25
|
+
* @category type IDs
|
|
26
|
+
* @since 4.0.0
|
|
16
27
|
*/
|
|
17
28
|
export declare const TypeId: TypeId;
|
|
18
29
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
30
|
+
* Type-level literal for the `D1Client` runtime identifier.
|
|
31
|
+
*
|
|
32
|
+
* @category type IDs
|
|
33
|
+
* @since 4.0.0
|
|
21
34
|
*/
|
|
22
35
|
export type TypeId = "~@effect/sql-d1/D1Client";
|
|
23
36
|
/**
|
|
37
|
+
* Cloudflare D1 SQL client service, extending `SqlClient` with its D1 configuration and no `updateValues` support.
|
|
38
|
+
*
|
|
24
39
|
* @category models
|
|
25
|
-
* @since
|
|
40
|
+
* @since 4.0.0
|
|
26
41
|
*/
|
|
27
42
|
export interface D1Client extends Client.SqlClient {
|
|
28
43
|
readonly [TypeId]: TypeId;
|
|
@@ -31,13 +46,22 @@ export interface D1Client extends Client.SqlClient {
|
|
|
31
46
|
readonly updateValues: never;
|
|
32
47
|
}
|
|
33
48
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
49
|
+
* Service tag for the Cloudflare D1 SQL client.
|
|
50
|
+
*
|
|
51
|
+
* **When to use**
|
|
52
|
+
*
|
|
53
|
+
* Use to access or provide a Cloudflare D1 SQL client through the Effect
|
|
54
|
+
* context.
|
|
55
|
+
*
|
|
56
|
+
* @category services
|
|
57
|
+
* @since 4.0.0
|
|
36
58
|
*/
|
|
37
|
-
export declare const D1Client:
|
|
59
|
+
export declare const D1Client: Context.Service<D1Client, D1Client>;
|
|
38
60
|
/**
|
|
61
|
+
* Configuration for a Cloudflare D1 client, including the `D1Database`, prepared statement cache settings, span attributes, and query/result name transforms.
|
|
62
|
+
*
|
|
39
63
|
* @category models
|
|
40
|
-
* @since
|
|
64
|
+
* @since 4.0.0
|
|
41
65
|
*/
|
|
42
66
|
export interface D1ClientConfig {
|
|
43
67
|
readonly db: D1Database;
|
|
@@ -48,18 +72,24 @@ export interface D1ClientConfig {
|
|
|
48
72
|
readonly transformQueryNames?: ((str: string) => string) | undefined;
|
|
49
73
|
}
|
|
50
74
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
75
|
+
* Creates a scoped Cloudflare D1 SQL client. Prepared statements are cached, while transactions and streaming queries are not supported by this driver.
|
|
76
|
+
*
|
|
77
|
+
* @category constructors
|
|
78
|
+
* @since 4.0.0
|
|
53
79
|
*/
|
|
54
80
|
export declare const make: (options: D1ClientConfig) => Effect.Effect<D1Client, never, Scope.Scope | Reactivity.Reactivity>;
|
|
55
81
|
/**
|
|
82
|
+
* Creates a layer from a `Config`-wrapped D1 client configuration, providing both `D1Client` and `SqlClient`.
|
|
83
|
+
*
|
|
56
84
|
* @category layers
|
|
57
|
-
* @since
|
|
85
|
+
* @since 4.0.0
|
|
58
86
|
*/
|
|
59
87
|
export declare const layerConfig: (config: Config.Wrap<D1ClientConfig>) => Layer.Layer<D1Client | Client.SqlClient, Config.ConfigError>;
|
|
60
88
|
/**
|
|
89
|
+
* Creates a layer from a concrete D1 client configuration, providing both `D1Client` and `SqlClient`.
|
|
90
|
+
*
|
|
61
91
|
* @category layers
|
|
62
|
-
* @since
|
|
92
|
+
* @since 4.0.0
|
|
63
93
|
*/
|
|
64
94
|
export declare const layer: (config: D1ClientConfig) => Layer.Layer<D1Client | Client.SqlClient, Config.ConfigError>;
|
|
65
95
|
//# sourceMappingURL=D1Client.d.ts.map
|
package/dist/D1Client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1Client.d.ts","sourceRoot":"","sources":["../src/D1Client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"D1Client.d.ts","sourceRoot":"","sources":["../src/D1Client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,UAAU,EAAuB,MAAM,2BAA2B,CAAA;AAEhF,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAE1C,OAAO,KAAK,UAAU,MAAM,uCAAuC,CAAA;AACnE,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAUvD;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MAAmC,CAAA;AAExD;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,0BAA0B,CAAA;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,QAAS,SAAQ,MAAM,CAAC,SAAS;IAChD,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAE/B,0BAA0B;IAC1B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAA;CAC7B;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,qCAAuD,CAAA;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAE7D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;CACrE;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GACf,SAAS,cAAc,KACtB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAgHjE,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAClC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAUrB,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAChB,QAAQ,cAAc,KACrB,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAMrB,CAAA"}
|
package/dist/D1Client.js
CHANGED
|
@@ -1,29 +1,45 @@
|
|
|
1
1
|
import * as Cache from "effect/Cache";
|
|
2
2
|
import * as Config from "effect/Config";
|
|
3
|
+
import * as Context from "effect/Context";
|
|
3
4
|
import * as Duration from "effect/Duration";
|
|
4
5
|
import * as Effect from "effect/Effect";
|
|
5
6
|
import { identity } from "effect/Function";
|
|
6
7
|
import * as Layer from "effect/Layer";
|
|
7
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
8
8
|
import * as Stream from "effect/Stream";
|
|
9
9
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
10
10
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
11
|
-
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
11
|
+
import { SqlError, UnknownError } from "effect/unstable/sql/SqlError";
|
|
12
12
|
import * as Statement from "effect/unstable/sql/Statement";
|
|
13
13
|
const ATTR_DB_SYSTEM_NAME = "db.system.name";
|
|
14
|
+
const classifyError = (cause, message, operation) => new UnknownError({
|
|
15
|
+
cause,
|
|
16
|
+
message,
|
|
17
|
+
operation
|
|
18
|
+
});
|
|
14
19
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
20
|
+
* Unique runtime identifier used to tag `D1Client` values.
|
|
21
|
+
*
|
|
22
|
+
* @category type IDs
|
|
23
|
+
* @since 4.0.0
|
|
17
24
|
*/
|
|
18
25
|
export const TypeId = "~@effect/sql-d1/D1Client";
|
|
19
26
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
27
|
+
* Service tag for the Cloudflare D1 SQL client.
|
|
28
|
+
*
|
|
29
|
+
* **When to use**
|
|
30
|
+
*
|
|
31
|
+
* Use to access or provide a Cloudflare D1 SQL client through the Effect
|
|
32
|
+
* context.
|
|
33
|
+
*
|
|
34
|
+
* @category services
|
|
35
|
+
* @since 4.0.0
|
|
22
36
|
*/
|
|
23
|
-
export const D1Client = /*#__PURE__*/
|
|
37
|
+
export const D1Client = /*#__PURE__*/Context.Service("@effect/sql-d1/D1Client");
|
|
24
38
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
39
|
+
* Creates a scoped Cloudflare D1 SQL client. Prepared statements are cached, while transactions and streaming queries are not supported by this driver.
|
|
40
|
+
*
|
|
41
|
+
* @category constructors
|
|
42
|
+
* @since 4.0.0
|
|
27
43
|
*/
|
|
28
44
|
export const make = options => Effect.gen(function* () {
|
|
29
45
|
const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);
|
|
@@ -36,8 +52,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
36
52
|
lookup: sql => Effect.try({
|
|
37
53
|
try: () => db.prepare(sql),
|
|
38
54
|
catch: cause => new SqlError({
|
|
39
|
-
cause,
|
|
40
|
-
message: `Failed to prepare statement`
|
|
55
|
+
reason: classifyError(cause, "Failed to prepare statement", "prepare")
|
|
41
56
|
})
|
|
42
57
|
})
|
|
43
58
|
});
|
|
@@ -50,8 +65,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
50
65
|
return response.results || [];
|
|
51
66
|
},
|
|
52
67
|
catch: cause => new SqlError({
|
|
53
|
-
cause,
|
|
54
|
-
message: `Failed to execute statement`
|
|
68
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
55
69
|
})
|
|
56
70
|
});
|
|
57
71
|
const runRaw = (sql, params = []) => runStatement(db.prepare(sql), params);
|
|
@@ -62,8 +76,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
62
76
|
return statement.bind(...params).raw();
|
|
63
77
|
},
|
|
64
78
|
catch: cause => new SqlError({
|
|
65
|
-
cause,
|
|
66
|
-
message: `Failed to execute statement`
|
|
79
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
67
80
|
})
|
|
68
81
|
}));
|
|
69
82
|
return identity({
|
|
@@ -99,13 +112,17 @@ export const make = options => Effect.gen(function* () {
|
|
|
99
112
|
});
|
|
100
113
|
});
|
|
101
114
|
/**
|
|
115
|
+
* Creates a layer from a `Config`-wrapped D1 client configuration, providing both `D1Client` and `SqlClient`.
|
|
116
|
+
*
|
|
102
117
|
* @category layers
|
|
103
|
-
* @since
|
|
118
|
+
* @since 4.0.0
|
|
104
119
|
*/
|
|
105
|
-
export const layerConfig = config => Layer.
|
|
120
|
+
export const layerConfig = config => Layer.effectContext(Config.unwrap(config).pipe(Effect.flatMap(make), Effect.map(client => Context.make(D1Client, client).pipe(Context.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
|
|
106
121
|
/**
|
|
122
|
+
* Creates a layer from a concrete D1 client configuration, providing both `D1Client` and `SqlClient`.
|
|
123
|
+
*
|
|
107
124
|
* @category layers
|
|
108
|
-
* @since
|
|
125
|
+
* @since 4.0.0
|
|
109
126
|
*/
|
|
110
|
-
export const layer = config => Layer.
|
|
127
|
+
export const layer = config => Layer.effectContext(Effect.map(make(config), client => Context.make(D1Client, client).pipe(Context.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
|
|
111
128
|
//# sourceMappingURL=D1Client.js.map
|
package/dist/D1Client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1Client.js","names":["Cache","Config","Duration","Effect","identity","Layer","
|
|
1
|
+
{"version":3,"file":"D1Client.js","names":["Cache","Config","Context","Duration","Effect","identity","Layer","Stream","Reactivity","Client","SqlError","UnknownError","Statement","ATTR_DB_SYSTEM_NAME","classifyError","cause","message","operation","TypeId","D1Client","Service","make","options","gen","compiler","makeCompilerSqlite","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","makeConnection","db","prepareCache","capacity","prepareCacheSize","timeToLive","prepareCacheTTL","minutes","lookup","sql","try","prepare","catch","reason","runStatement","statement","params","tryPromise","response","bind","all","error","results","runRaw","runCached","flatMap","get","s","runUncached","runValues","raw","execute","map","executeRaw","executeValues","executeUnprepared","executeStream","_sql","_params","die","connection","acquirer","succeed","transactionAcquirer","Object","assign","spanAttributes","entries","config","layerConfig","effectContext","unwrap","pipe","client","add","SqlClient","provide","layer"],"sources":["../src/D1Client.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/sql-d1",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.81",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "A Cloudflare D1 integration for Effect",
|
|
@@ -47,14 +47,14 @@
|
|
|
47
47
|
"provenance": true
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"miniflare": "^4.
|
|
51
|
-
"effect": "^4.0.0-beta.
|
|
50
|
+
"miniflare": "^4.20260507.1",
|
|
51
|
+
"effect": "^4.0.0-beta.81"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
|
-
"effect": "^4.0.0-beta.
|
|
54
|
+
"effect": "^4.0.0-beta.81"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@cloudflare/workers-types": "^4.
|
|
57
|
+
"@cloudflare/workers-types": "^4.20260511.1"
|
|
58
58
|
},
|
|
59
59
|
"scripts": {
|
|
60
60
|
"codegen": "effect-utils codegen",
|
package/src/D1Client.ts
CHANGED
|
@@ -1,39 +1,57 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Cloudflare D1 client implementation for Effect SQL, backed by a Workers `D1Database` binding.
|
|
3
|
+
*
|
|
4
|
+
* This module adapts a Cloudflare D1 database binding into both the
|
|
5
|
+
* D1-specific `D1Client` service and the generic Effect `SqlClient` service.
|
|
6
|
+
* It uses the SQLite statement compiler, caches prepared statements, maps D1
|
|
7
|
+
* failures to `SqlError`, and provides direct or config-backed layers.
|
|
8
|
+
* Transactions, streaming queries, and `updateValues` are not supported by this
|
|
9
|
+
* driver.
|
|
10
|
+
*
|
|
11
|
+
* @since 4.0.0
|
|
3
12
|
*/
|
|
4
13
|
import type { D1Database, D1PreparedStatement } from "@cloudflare/workers-types"
|
|
5
14
|
import * as Cache from "effect/Cache"
|
|
6
15
|
import * as Config from "effect/Config"
|
|
16
|
+
import * as Context from "effect/Context"
|
|
7
17
|
import * as Duration from "effect/Duration"
|
|
8
18
|
import * as Effect from "effect/Effect"
|
|
9
19
|
import { identity } from "effect/Function"
|
|
10
20
|
import * as Layer from "effect/Layer"
|
|
11
21
|
import type * as Scope from "effect/Scope"
|
|
12
|
-
import * as ServiceMap from "effect/ServiceMap"
|
|
13
22
|
import * as Stream from "effect/Stream"
|
|
14
23
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
15
24
|
import * as Client from "effect/unstable/sql/SqlClient"
|
|
16
25
|
import type { Connection } from "effect/unstable/sql/SqlConnection"
|
|
17
|
-
import { SqlError } from "effect/unstable/sql/SqlError"
|
|
26
|
+
import { SqlError, UnknownError } from "effect/unstable/sql/SqlError"
|
|
18
27
|
import * as Statement from "effect/unstable/sql/Statement"
|
|
19
28
|
|
|
20
29
|
const ATTR_DB_SYSTEM_NAME = "db.system.name"
|
|
21
30
|
|
|
31
|
+
const classifyError = (cause: unknown, message: string, operation: string) =>
|
|
32
|
+
new UnknownError({ cause, message, operation })
|
|
33
|
+
|
|
22
34
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
35
|
+
* Unique runtime identifier used to tag `D1Client` values.
|
|
36
|
+
*
|
|
37
|
+
* @category type IDs
|
|
38
|
+
* @since 4.0.0
|
|
25
39
|
*/
|
|
26
40
|
export const TypeId: TypeId = "~@effect/sql-d1/D1Client"
|
|
27
41
|
|
|
28
42
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
43
|
+
* Type-level literal for the `D1Client` runtime identifier.
|
|
44
|
+
*
|
|
45
|
+
* @category type IDs
|
|
46
|
+
* @since 4.0.0
|
|
31
47
|
*/
|
|
32
48
|
export type TypeId = "~@effect/sql-d1/D1Client"
|
|
33
49
|
|
|
34
50
|
/**
|
|
51
|
+
* Cloudflare D1 SQL client service, extending `SqlClient` with its D1 configuration and no `updateValues` support.
|
|
52
|
+
*
|
|
35
53
|
* @category models
|
|
36
|
-
* @since
|
|
54
|
+
* @since 4.0.0
|
|
37
55
|
*/
|
|
38
56
|
export interface D1Client extends Client.SqlClient {
|
|
39
57
|
readonly [TypeId]: TypeId
|
|
@@ -44,14 +62,23 @@ export interface D1Client extends Client.SqlClient {
|
|
|
44
62
|
}
|
|
45
63
|
|
|
46
64
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
65
|
+
* Service tag for the Cloudflare D1 SQL client.
|
|
66
|
+
*
|
|
67
|
+
* **When to use**
|
|
68
|
+
*
|
|
69
|
+
* Use to access or provide a Cloudflare D1 SQL client through the Effect
|
|
70
|
+
* context.
|
|
71
|
+
*
|
|
72
|
+
* @category services
|
|
73
|
+
* @since 4.0.0
|
|
49
74
|
*/
|
|
50
|
-
export const D1Client =
|
|
75
|
+
export const D1Client = Context.Service<D1Client>("@effect/sql-d1/D1Client")
|
|
51
76
|
|
|
52
77
|
/**
|
|
78
|
+
* Configuration for a Cloudflare D1 client, including the `D1Database`, prepared statement cache settings, span attributes, and query/result name transforms.
|
|
79
|
+
*
|
|
53
80
|
* @category models
|
|
54
|
-
* @since
|
|
81
|
+
* @since 4.0.0
|
|
55
82
|
*/
|
|
56
83
|
export interface D1ClientConfig {
|
|
57
84
|
readonly db: D1Database
|
|
@@ -64,8 +91,10 @@ export interface D1ClientConfig {
|
|
|
64
91
|
}
|
|
65
92
|
|
|
66
93
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
94
|
+
* Creates a scoped Cloudflare D1 SQL client. Prepared statements are cached, while transactions and streaming queries are not supported by this driver.
|
|
95
|
+
*
|
|
96
|
+
* @category constructors
|
|
97
|
+
* @since 4.0.0
|
|
69
98
|
*/
|
|
70
99
|
export const make = (
|
|
71
100
|
options: D1ClientConfig
|
|
@@ -85,7 +114,7 @@ export const make = (
|
|
|
85
114
|
lookup: (sql: string) =>
|
|
86
115
|
Effect.try({
|
|
87
116
|
try: () => db.prepare(sql),
|
|
88
|
-
catch: (cause) => new SqlError({ cause,
|
|
117
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to prepare statement", "prepare") })
|
|
89
118
|
})
|
|
90
119
|
})
|
|
91
120
|
|
|
@@ -101,7 +130,7 @@ export const make = (
|
|
|
101
130
|
}
|
|
102
131
|
return response.results || []
|
|
103
132
|
},
|
|
104
|
-
catch: (cause) => new SqlError({ cause,
|
|
133
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
|
|
105
134
|
})
|
|
106
135
|
|
|
107
136
|
const runRaw = (
|
|
@@ -134,7 +163,7 @@ export const make = (
|
|
|
134
163
|
>
|
|
135
164
|
>
|
|
136
165
|
},
|
|
137
|
-
catch: (cause) => new SqlError({ cause,
|
|
166
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
|
|
138
167
|
})
|
|
139
168
|
)
|
|
140
169
|
|
|
@@ -184,33 +213,37 @@ export const make = (
|
|
|
184
213
|
})
|
|
185
214
|
|
|
186
215
|
/**
|
|
216
|
+
* Creates a layer from a `Config`-wrapped D1 client configuration, providing both `D1Client` and `SqlClient`.
|
|
217
|
+
*
|
|
187
218
|
* @category layers
|
|
188
|
-
* @since
|
|
219
|
+
* @since 4.0.0
|
|
189
220
|
*/
|
|
190
221
|
export const layerConfig = (
|
|
191
222
|
config: Config.Wrap<D1ClientConfig>
|
|
192
223
|
): Layer.Layer<D1Client | Client.SqlClient, Config.ConfigError> =>
|
|
193
|
-
Layer.
|
|
194
|
-
Config.unwrap(config).
|
|
224
|
+
Layer.effectContext(
|
|
225
|
+
Config.unwrap(config).pipe(
|
|
195
226
|
Effect.flatMap(make),
|
|
196
227
|
Effect.map((client) =>
|
|
197
|
-
|
|
198
|
-
|
|
228
|
+
Context.make(D1Client, client).pipe(
|
|
229
|
+
Context.add(Client.SqlClient, client)
|
|
199
230
|
)
|
|
200
231
|
)
|
|
201
232
|
)
|
|
202
233
|
).pipe(Layer.provide(Reactivity.layer))
|
|
203
234
|
|
|
204
235
|
/**
|
|
236
|
+
* Creates a layer from a concrete D1 client configuration, providing both `D1Client` and `SqlClient`.
|
|
237
|
+
*
|
|
205
238
|
* @category layers
|
|
206
|
-
* @since
|
|
239
|
+
* @since 4.0.0
|
|
207
240
|
*/
|
|
208
241
|
export const layer = (
|
|
209
242
|
config: D1ClientConfig
|
|
210
243
|
): Layer.Layer<D1Client | Client.SqlClient, Config.ConfigError> =>
|
|
211
|
-
Layer.
|
|
244
|
+
Layer.effectContext(
|
|
212
245
|
Effect.map(make(config), (client) =>
|
|
213
|
-
|
|
214
|
-
|
|
246
|
+
Context.make(D1Client, client).pipe(
|
|
247
|
+
Context.add(Client.SqlClient, client)
|
|
215
248
|
))
|
|
216
249
|
).pipe(Layer.provide(Reactivity.layer))
|