alink-cli 0.6.2 → 0.7.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.
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env node
2
+
3
+ import * as Effect from "effect/Effect";
4
+ import * as Layer from "effect/Layer";
5
+ import * as Context from "effect/Context";
6
+ import * as Schema from "effect/Schema";
7
+ import * as Duration from "effect/Duration";
8
+ import * as Stream from "effect/Stream";
9
+ import * as Client from "effect/unstable/sql/SqlClient";
10
+ import * as Config from "effect/Config";
11
+ import { identity } from "effect/Function";
12
+ import * as Cache from "effect/Cache";
13
+ import * as Scope from "effect/Scope";
14
+ import * as Semaphore from "effect/Semaphore";
15
+ import * as Fiber from "effect/Fiber";
16
+ import * as NodeSqlite from "node:sqlite";
17
+ import * as Reactivity from "effect/unstable/reactivity/Reactivity";
18
+ import { SqlError, classifySqliteError } from "effect/unstable/sql/SqlError";
19
+ import * as Statement from "effect/unstable/sql/Statement";
20
+ //#region src/persistence/NodeSqliteClient.ts
21
+ /**
22
+ * Port of `@effect/sql-sqlite-node` that uses the native `node:sqlite`
23
+ * bindings instead of `better-sqlite3`.
24
+ *
25
+ * @module SqliteClient
26
+ */
27
+ const ATTR_DB_SYSTEM_NAME = "db.system.name";
28
+ const TypeId = "~local/sqlite-node/SqliteClient";
29
+ var UnsupportedNodeSqliteVersionError = class extends Schema.TaggedErrorClass()("UnsupportedNodeSqliteVersionError", {
30
+ nodeVersion: Schema.String,
31
+ requirement: Schema.String
32
+ }) {
33
+ get message() {
34
+ return `Node.js ${this.nodeVersion} is missing required node:sqlite APIs. Upgrade to ${this.requirement}.`;
35
+ }
36
+ };
37
+ var UnsupportedNodeSqliteOperationError = class extends Schema.TaggedErrorClass()("UnsupportedNodeSqliteOperationError", {}) {
38
+ get message() {
39
+ return "Node SQLite does not support executeStream.";
40
+ }
41
+ };
42
+ /**
43
+ * Verify that the current Node.js version includes the `node:sqlite` APIs
44
+ * used by `NodeSqliteClient` — specifically `StatementSync.columns()` (added
45
+ * in Node 22.16.0 / 23.11.0).
46
+ *
47
+ * @see https://github.com/nodejs/node/pull/57490
48
+ */
49
+ const checkNodeSqliteCompat = () => {
50
+ const parts = process.versions.node.split(".").map(Number);
51
+ const major = parts[0] ?? 0;
52
+ const minor = parts[1] ?? 0;
53
+ if (!(major === 22 && minor >= 16 || major === 23 && minor >= 11 || major >= 24)) return Effect.die(new UnsupportedNodeSqliteVersionError({
54
+ nodeVersion: process.versions.node,
55
+ requirement: "Node.js >=22.16, >=23.11, or >=24"
56
+ }));
57
+ return Effect.void;
58
+ };
59
+ const makeWithDatabase = Effect.fn("makeWithDatabase")(function* (options, openDatabase) {
60
+ yield* checkNodeSqliteCompat();
61
+ const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);
62
+ const transformRows = options.transformResultNames ? Statement.defaultTransforms(options.transformResultNames).array : void 0;
63
+ const makeConnection = Effect.gen(function* () {
64
+ const scope = yield* Effect.scope;
65
+ const db = yield* Effect.try({
66
+ try: openDatabase,
67
+ catch: (cause) => new SqlError({ reason: classifySqliteError(cause, {
68
+ message: "Failed to open database",
69
+ operation: "open"
70
+ }) })
71
+ });
72
+ yield* Scope.addFinalizer(scope, Effect.try({
73
+ try: () => db.close(),
74
+ catch: (cause) => new SqlError({ reason: classifySqliteError(cause, {
75
+ message: "Failed to close database",
76
+ operation: "close"
77
+ }) })
78
+ }).pipe(Effect.orDie));
79
+ const statementReaderCache = /* @__PURE__ */ new WeakMap();
80
+ const hasRows = (statement) => {
81
+ const cached = statementReaderCache.get(statement);
82
+ if (cached !== void 0) return cached;
83
+ const value = statement.columns().length > 0;
84
+ statementReaderCache.set(statement, value);
85
+ return value;
86
+ };
87
+ const prepare = (sql) => Effect.try({
88
+ try: () => db.prepare(sql),
89
+ catch: (cause) => new SqlError({ reason: classifySqliteError(cause, {
90
+ message: "Failed to prepare statement",
91
+ operation: "prepare"
92
+ }) })
93
+ });
94
+ const prepareCache = yield* Cache.make({
95
+ capacity: options.prepareCacheSize ?? 200,
96
+ timeToLive: options.prepareCacheTTL ?? Duration.minutes(10),
97
+ lookup: prepare
98
+ });
99
+ const runStatement = (statement, params, raw) => Effect.withFiber((fiber) => {
100
+ try {
101
+ statement.setReadBigInts(Boolean(Context.get(fiber.context, Client.SafeIntegers)));
102
+ if (hasRows(statement)) return Effect.succeed(statement.all(...params));
103
+ const result = statement.run(...params);
104
+ return Effect.succeed(raw ? result : []);
105
+ } catch (cause) {
106
+ return Effect.fail(new SqlError({ reason: classifySqliteError(cause, {
107
+ message: "Failed to execute statement",
108
+ operation: "execute"
109
+ }) }));
110
+ }
111
+ });
112
+ const run = (sql, params, raw = false) => Effect.flatMap(Cache.get(prepareCache, sql), (s) => runStatement(s, params, raw));
113
+ const runStatementValues = (statement, params) => Effect.acquireUseRelease(Effect.succeed(statement), (statement) => Effect.try({
114
+ try: () => {
115
+ if (hasRows(statement)) {
116
+ statement.setReturnArrays(true);
117
+ return statement.all(...params);
118
+ }
119
+ statement.run(...params);
120
+ return [];
121
+ },
122
+ catch: (cause) => new SqlError({ reason: classifySqliteError(cause, {
123
+ message: "Failed to execute statement",
124
+ operation: "execute"
125
+ }) })
126
+ }), (statement) => Effect.try({
127
+ try: () => {
128
+ if (hasRows(statement)) statement.setReturnArrays(false);
129
+ },
130
+ catch: (cause) => new SqlError({ reason: classifySqliteError(cause, {
131
+ message: "Failed to reset statement result mode",
132
+ operation: "resetResultMode"
133
+ }) })
134
+ }).pipe(Effect.orDie));
135
+ const runValues = (sql, params) => Effect.flatMap(Cache.get(prepareCache, sql), (statement) => runStatementValues(statement, params));
136
+ return identity({
137
+ execute(sql, params, rowTransform) {
138
+ return rowTransform ? Effect.map(run(sql, params), rowTransform) : run(sql, params);
139
+ },
140
+ executeRaw(sql, params) {
141
+ return run(sql, params, true);
142
+ },
143
+ executeValues(sql, params) {
144
+ return runValues(sql, params);
145
+ },
146
+ executeValuesUnprepared(sql, params) {
147
+ return Effect.flatMap(prepare(sql), (statement) => runStatementValues(statement, params ?? []));
148
+ },
149
+ executeUnprepared(sql, params, rowTransform) {
150
+ const effect = prepare(sql).pipe(Effect.flatMap((statement) => runStatement(statement, params ?? [], false)));
151
+ return rowTransform ? Effect.map(effect, rowTransform) : effect;
152
+ },
153
+ executeStream(_sql, _params) {
154
+ return Stream.die(new UnsupportedNodeSqliteOperationError());
155
+ }
156
+ });
157
+ });
158
+ const semaphore = yield* Semaphore.make(1);
159
+ const connection = yield* makeConnection;
160
+ const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));
161
+ const transactionAcquirer = Effect.uninterruptibleMask((restore) => {
162
+ const fiber = Fiber.getCurrent();
163
+ const scope = Context.getUnsafe(fiber.context, Scope.Scope);
164
+ return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);
165
+ });
166
+ return yield* Client.make({
167
+ acquirer,
168
+ compiler,
169
+ transactionAcquirer,
170
+ spanAttributes: [...options.spanAttributes ? Object.entries(options.spanAttributes) : [], [ATTR_DB_SYSTEM_NAME, "sqlite"]],
171
+ transformRows
172
+ });
173
+ });
174
+ const make = (options) => makeWithDatabase(options, () => new NodeSqlite.DatabaseSync(options.filename, {
175
+ readOnly: options.readonly ?? false,
176
+ allowExtension: options.allowExtension ?? false
177
+ }));
178
+ const makeMemory = (config = {}) => makeWithDatabase({
179
+ ...config,
180
+ filename: ":memory:",
181
+ readonly: false
182
+ }, () => {
183
+ return new NodeSqlite.DatabaseSync(":memory:", { allowExtension: config.allowExtension ?? false });
184
+ });
185
+ const layerConfig = (config) => Layer.effect(Client.SqlClient, Config.unwrap(config).pipe(Effect.flatMap(make))).pipe(Layer.provide(Reactivity.layer));
186
+ const layer = (config) => Layer.effect(Client.SqlClient, make(config)).pipe(Layer.provide(Reactivity.layer));
187
+ const layerMemory = (config = {}) => Layer.effect(Client.SqlClient, makeMemory(config)).pipe(Layer.provide(Reactivity.layer));
188
+ //#endregion
189
+ export { TypeId, UnsupportedNodeSqliteOperationError, UnsupportedNodeSqliteVersionError, layer, layerConfig, layerMemory };
190
+
191
+ //# sourceMappingURL=NodeSqliteClient-BUlNQAY0.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSqliteClient-BUlNQAY0.mjs","names":[],"sources":["../src/persistence/NodeSqliteClient.ts"],"sourcesContent":["/**\n * Port of `@effect/sql-sqlite-node` that uses the native `node:sqlite`\n * bindings instead of `better-sqlite3`.\n *\n * @module SqliteClient\n */\nimport * as NodeSqlite from \"node:sqlite\";\n\nimport * as Cache from \"effect/Cache\";\nimport * as Config from \"effect/Config\";\nimport * as Duration from \"effect/Duration\";\nimport * as Effect from \"effect/Effect\";\nimport * as Fiber from \"effect/Fiber\";\nimport { identity } from \"effect/Function\";\nimport * as Layer from \"effect/Layer\";\nimport * as Schema from \"effect/Schema\";\nimport * as Scope from \"effect/Scope\";\nimport * as Semaphore from \"effect/Semaphore\";\nimport * as Context from \"effect/Context\";\nimport * as Stream from \"effect/Stream\";\nimport * as Reactivity from \"effect/unstable/reactivity/Reactivity\";\nimport * as Client from \"effect/unstable/sql/SqlClient\";\nimport type { Connection } from \"effect/unstable/sql/SqlConnection\";\nimport { SqlError, classifySqliteError } from \"effect/unstable/sql/SqlError\";\nimport * as Statement from \"effect/unstable/sql/Statement\";\n\nconst ATTR_DB_SYSTEM_NAME = \"db.system.name\";\n\nexport const TypeId: TypeId = \"~local/sqlite-node/SqliteClient\";\n\nexport type TypeId = \"~local/sqlite-node/SqliteClient\";\n\nexport interface SqliteClientConfig {\n readonly filename: string;\n readonly readonly?: boolean | undefined;\n readonly allowExtension?: boolean | undefined;\n readonly prepareCacheSize?: number | undefined;\n readonly prepareCacheTTL?: Duration.Input | undefined;\n readonly spanAttributes?: Record<string, unknown> | undefined;\n readonly transformResultNames?: ((str: string) => string) | undefined;\n readonly transformQueryNames?: ((str: string) => string) | undefined;\n}\n\nexport interface SqliteMemoryClientConfig extends Omit<\n SqliteClientConfig,\n \"filename\" | \"readonly\"\n> {}\n\nexport class UnsupportedNodeSqliteVersionError extends Schema.TaggedErrorClass<UnsupportedNodeSqliteVersionError>()(\n \"UnsupportedNodeSqliteVersionError\",\n {\n nodeVersion: Schema.String,\n requirement: Schema.String,\n },\n) {\n override get message(): string {\n return `Node.js ${this.nodeVersion} is missing required node:sqlite APIs. Upgrade to ${this.requirement}.`;\n }\n}\n\nexport class UnsupportedNodeSqliteOperationError extends Schema.TaggedErrorClass<UnsupportedNodeSqliteOperationError>()(\n \"UnsupportedNodeSqliteOperationError\",\n {},\n) {\n override get message(): string {\n return \"Node SQLite does not support executeStream.\";\n }\n}\n\n/**\n * Verify that the current Node.js version includes the `node:sqlite` APIs\n * used by `NodeSqliteClient` — specifically `StatementSync.columns()` (added\n * in Node 22.16.0 / 23.11.0).\n *\n * @see https://github.com/nodejs/node/pull/57490\n */\nconst checkNodeSqliteCompat = () => {\n const parts = process.versions.node.split(\".\").map(Number);\n const major = parts[0] ?? 0;\n const minor = parts[1] ?? 0;\n const supported = (major === 22 && minor >= 16) || (major === 23 && minor >= 11) || major >= 24;\n\n if (!supported) {\n return Effect.die(\n new UnsupportedNodeSqliteVersionError({\n nodeVersion: process.versions.node,\n requirement: \"Node.js >=22.16, >=23.11, or >=24\",\n }),\n );\n }\n return Effect.void;\n};\n\nconst makeWithDatabase = Effect.fn(\"makeWithDatabase\")(function* (\n options: SqliteClientConfig,\n openDatabase: () => NodeSqlite.DatabaseSync,\n): Effect.fn.Return<Client.SqlClient, SqlError, Scope.Scope | Reactivity.Reactivity> {\n yield* checkNodeSqliteCompat();\n\n const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);\n const transformRows = options.transformResultNames\n ? Statement.defaultTransforms(options.transformResultNames).array\n : undefined;\n\n const makeConnection = Effect.gen(function* () {\n const scope = yield* Effect.scope;\n const db = yield* Effect.try({\n try: openDatabase,\n catch: (cause) =>\n new SqlError({\n reason: classifySqliteError(cause, {\n message: \"Failed to open database\",\n operation: \"open\",\n }),\n }),\n });\n yield* Scope.addFinalizer(\n scope,\n Effect.try({\n try: () => db.close(),\n catch: (cause) =>\n new SqlError({\n reason: classifySqliteError(cause, {\n message: \"Failed to close database\",\n operation: \"close\",\n }),\n }),\n }).pipe(Effect.orDie),\n );\n\n const statementReaderCache = new WeakMap<NodeSqlite.StatementSync, boolean>();\n const hasRows = (statement: NodeSqlite.StatementSync): boolean => {\n const cached = statementReaderCache.get(statement);\n if (cached !== undefined) {\n return cached;\n }\n const value = statement.columns().length > 0;\n statementReaderCache.set(statement, value);\n return value;\n };\n\n const prepare = (sql: string) =>\n Effect.try({\n try: () => db.prepare(sql),\n catch: (cause) =>\n new SqlError({\n reason: classifySqliteError(cause, {\n message: \"Failed to prepare statement\",\n operation: \"prepare\",\n }),\n }),\n });\n\n const prepareCache = yield* Cache.make({\n capacity: options.prepareCacheSize ?? 200,\n timeToLive: options.prepareCacheTTL ?? Duration.minutes(10),\n lookup: prepare,\n });\n\n const runStatement = (\n statement: NodeSqlite.StatementSync,\n params: ReadonlyArray<unknown>,\n raw: boolean,\n ) =>\n Effect.withFiber<ReadonlyArray<any>, SqlError>((fiber) => {\n try {\n statement.setReadBigInts(Boolean(Context.get(fiber.context, Client.SafeIntegers)));\n if (hasRows(statement)) {\n return Effect.succeed(statement.all(...(params as any)));\n }\n const result = statement.run(...(params as any));\n return Effect.succeed(raw ? (result as unknown as ReadonlyArray<any>) : []);\n } catch (cause) {\n return Effect.fail(\n new SqlError({\n reason: classifySqliteError(cause, {\n message: \"Failed to execute statement\",\n operation: \"execute\",\n }),\n }),\n );\n }\n });\n\n const run = (sql: string, params: ReadonlyArray<unknown>, raw = false) =>\n Effect.flatMap(Cache.get(prepareCache, sql), (s) => runStatement(s, params, raw));\n\n const runStatementValues = (\n statement: NodeSqlite.StatementSync,\n params: ReadonlyArray<unknown>,\n ) =>\n Effect.acquireUseRelease(\n Effect.succeed(statement),\n (statement) =>\n Effect.try({\n try: () => {\n if (hasRows(statement)) {\n statement.setReturnArrays(true);\n // Safe to cast to array after we've setReturnArrays(true)\n return statement.all(...(params as any)) as unknown as ReadonlyArray<\n ReadonlyArray<unknown>\n >;\n }\n statement.run(...(params as any));\n return [];\n },\n catch: (cause) =>\n new SqlError({\n reason: classifySqliteError(cause, {\n message: \"Failed to execute statement\",\n operation: \"execute\",\n }),\n }),\n }),\n (statement) =>\n Effect.try({\n try: () => {\n if (hasRows(statement)) {\n statement.setReturnArrays(false);\n }\n },\n catch: (cause) =>\n new SqlError({\n reason: classifySqliteError(cause, {\n message: \"Failed to reset statement result mode\",\n operation: \"resetResultMode\",\n }),\n }),\n }).pipe(Effect.orDie),\n );\n\n const runValues = (sql: string, params: ReadonlyArray<unknown>) =>\n Effect.flatMap(Cache.get(prepareCache, sql), (statement) =>\n runStatementValues(statement, params),\n );\n\n return identity<Connection>({\n execute(sql, params, rowTransform) {\n return rowTransform ? Effect.map(run(sql, params), rowTransform) : run(sql, params);\n },\n executeRaw(sql, params) {\n return run(sql, params, true);\n },\n executeValues(sql, params) {\n return runValues(sql, params);\n },\n executeValuesUnprepared(sql, params) {\n return Effect.flatMap(prepare(sql), (statement) =>\n runStatementValues(statement, params ?? []),\n );\n },\n executeUnprepared(sql, params, rowTransform) {\n const effect = prepare(sql).pipe(\n Effect.flatMap((statement) => runStatement(statement, params ?? [], false)),\n );\n return rowTransform ? Effect.map(effect, rowTransform) : effect;\n },\n executeStream(_sql, _params) {\n return Stream.die(new UnsupportedNodeSqliteOperationError());\n },\n });\n });\n\n const semaphore = yield* Semaphore.make(1);\n const connection = yield* makeConnection;\n\n const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));\n const transactionAcquirer = Effect.uninterruptibleMask((restore) => {\n const fiber = Fiber.getCurrent()!;\n const scope = Context.getUnsafe(fiber.context, Scope.Scope);\n return Effect.as(\n Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))),\n connection,\n );\n });\n\n return yield* Client.make({\n acquirer,\n compiler,\n transactionAcquirer,\n spanAttributes: [\n ...(options.spanAttributes ? Object.entries(options.spanAttributes) : []),\n [ATTR_DB_SYSTEM_NAME, \"sqlite\"],\n ],\n transformRows,\n });\n});\n\nconst make = (\n options: SqliteClientConfig,\n): Effect.Effect<Client.SqlClient, SqlError, Scope.Scope | Reactivity.Reactivity> =>\n makeWithDatabase(\n options,\n () =>\n new NodeSqlite.DatabaseSync(options.filename, {\n readOnly: options.readonly ?? false,\n allowExtension: options.allowExtension ?? false,\n }),\n );\n\nconst makeMemory = (\n config: SqliteMemoryClientConfig = {},\n): Effect.Effect<Client.SqlClient, SqlError, Scope.Scope | Reactivity.Reactivity> =>\n makeWithDatabase(\n {\n ...config,\n filename: \":memory:\",\n readonly: false,\n },\n () => {\n const database = new NodeSqlite.DatabaseSync(\":memory:\", {\n allowExtension: config.allowExtension ?? false,\n });\n return database;\n },\n );\n\nexport const layerConfig = (\n config: Config.Wrap<SqliteClientConfig>,\n): Layer.Layer<Client.SqlClient, Config.ConfigError | SqlError> =>\n Layer.effect(Client.SqlClient, Config.unwrap(config).pipe(Effect.flatMap(make))).pipe(\n Layer.provide(Reactivity.layer),\n );\n\nexport const layer = (config: SqliteClientConfig): Layer.Layer<Client.SqlClient, SqlError> =>\n Layer.effect(Client.SqlClient, make(config)).pipe(Layer.provide(Reactivity.layer));\n\nexport const layerMemory = (\n config: SqliteMemoryClientConfig = {},\n): Layer.Layer<Client.SqlClient, SqlError> =>\n Layer.effect(Client.SqlClient, makeMemory(config)).pipe(Layer.provide(Reactivity.layer));\n"],"mappings":"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"}