@maria_rcks/t1code 0.0.5 → 0.0.6
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/bin/t1code.js +38 -4
- package/dist/index.mjs +879 -29527
- package/dist/server/{BunPTY-BulfMn1P.cjs → BunPTY-3FAOkA1C.cjs} +4 -5
- package/dist/server/BunPTY-3FAOkA1C.cjs.map +1 -0
- package/dist/server/{BunPTY-Cueq2gzZ.mjs → BunPTY-B9Pc7ndx.mjs} +5 -6
- package/dist/server/BunPTY-B9Pc7ndx.mjs.map +1 -0
- package/dist/server/{NodePTY-AdcStdsu.mjs → NodePTY-CZNVLBpq.mjs} +15 -16
- package/dist/server/NodePTY-CZNVLBpq.mjs.map +1 -0
- package/dist/server/{NodePTY-DmqnQV86.cjs → NodePTY-CbnaoLlj.cjs} +14 -15
- package/dist/server/NodePTY-CbnaoLlj.cjs.map +1 -0
- package/dist/server/NodeSqliteClient-C5fYhtpO.cjs +147 -0
- package/dist/server/NodeSqliteClient-C5fYhtpO.cjs.map +1 -0
- package/dist/server/NodeSqliteClient-COEUidVC.mjs +143 -0
- package/dist/server/NodeSqliteClient-COEUidVC.mjs.map +1 -0
- package/dist/server/SqlError-7DUB2NkG.mjs +43 -0
- package/dist/server/SqlError-7DUB2NkG.mjs.map +1 -0
- package/dist/server/SqlError-CAzXmpza.cjs +48 -0
- package/dist/server/SqlError-CAzXmpza.cjs.map +1 -0
- package/dist/server/SqliteClient-BMlcF9O1.cjs +133 -0
- package/dist/server/SqliteClient-BMlcF9O1.cjs.map +1 -0
- package/dist/server/SqliteClient-MZci3yRi.mjs +129 -0
- package/dist/server/SqliteClient-MZci3yRi.mjs.map +1 -0
- package/dist/server/index.cjs +96505 -14779
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.mjs +96491 -14777
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/open-BGXDmMPQ.cjs +501 -0
- package/dist/server/open-BGXDmMPQ.cjs.map +1 -0
- package/dist/server/open-BvXvp1QV.mjs +492 -0
- package/dist/server/open-BvXvp1QV.mjs.map +1 -0
- package/package.json +9 -2
- package/dist/server/BunPTY-BulfMn1P.cjs.map +0 -1
- package/dist/server/BunPTY-Cueq2gzZ.mjs.map +0 -1
- package/dist/server/NodePTY-AdcStdsu.mjs.map +0 -1
- package/dist/server/NodePTY-DmqnQV86.cjs.map +0 -1
- package/dist/server/NodeSqliteClient-BTK-dUey.mjs +0 -156
- package/dist/server/NodeSqliteClient-BTK-dUey.mjs.map +0 -1
- package/dist/server/NodeSqliteClient-ViK8pcdH.cjs +0 -174
- package/dist/server/NodeSqliteClient-ViK8pcdH.cjs.map +0 -1
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import * as Effect from "effect/Effect";
|
|
4
|
-
import * as Layer from "effect/Layer";
|
|
5
|
-
import * as Client from "effect/unstable/sql/SqlClient";
|
|
6
|
-
import * as Semaphore from "effect/Semaphore";
|
|
7
|
-
import { DatabaseSync } from "node:sqlite";
|
|
8
|
-
import * as Cache from "effect/Cache";
|
|
9
|
-
import * as Config from "effect/Config";
|
|
10
|
-
import * as Duration from "effect/Duration";
|
|
11
|
-
import * as Fiber from "effect/Fiber";
|
|
12
|
-
import { identity } from "effect/Function";
|
|
13
|
-
import * as Scope from "effect/Scope";
|
|
14
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
15
|
-
import * as Stream from "effect/Stream";
|
|
16
|
-
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
17
|
-
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
18
|
-
import * as Statement from "effect/unstable/sql/Statement";
|
|
19
|
-
|
|
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
|
-
/**
|
|
30
|
-
* SqliteClient - Effect service tag for the sqlite SQL client.
|
|
31
|
-
*/
|
|
32
|
-
const SqliteClient = ServiceMap.Service("t3/persistence/NodeSqliteClient");
|
|
33
|
-
/**
|
|
34
|
-
* Verify that the current Node.js version includes the `node:sqlite` APIs
|
|
35
|
-
* used by `NodeSqliteClient` — specifically `StatementSync.columns()` (added
|
|
36
|
-
* in Node 22.16.0 / 23.11.0).
|
|
37
|
-
*
|
|
38
|
-
* @see https://github.com/nodejs/node/pull/57490
|
|
39
|
-
*/
|
|
40
|
-
const checkNodeSqliteCompat = () => {
|
|
41
|
-
const parts = process.versions.node.split(".").map(Number);
|
|
42
|
-
const major = parts[0] ?? 0;
|
|
43
|
-
const minor = parts[1] ?? 0;
|
|
44
|
-
if (!(major === 22 && minor >= 16 || major === 23 && minor >= 11 || major >= 24)) return Effect.die(`Node.js ${process.versions.node} is missing required node:sqlite APIs (StatementSync.columns). Upgrade to Node.js >=22.16, >=23.11, or >=24.`);
|
|
45
|
-
return Effect.void;
|
|
46
|
-
};
|
|
47
|
-
const makeWithDatabase = (options, openDatabase) => Effect.gen(function* () {
|
|
48
|
-
yield* checkNodeSqliteCompat();
|
|
49
|
-
const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);
|
|
50
|
-
const transformRows = options.transformResultNames ? Statement.defaultTransforms(options.transformResultNames).array : void 0;
|
|
51
|
-
const makeConnection = Effect.gen(function* () {
|
|
52
|
-
const scope = yield* Effect.scope;
|
|
53
|
-
const db = openDatabase();
|
|
54
|
-
yield* Scope.addFinalizer(scope, Effect.sync(() => db.close()));
|
|
55
|
-
const statementReaderCache = /* @__PURE__ */ new WeakMap();
|
|
56
|
-
const hasRows = (statement) => {
|
|
57
|
-
const cached = statementReaderCache.get(statement);
|
|
58
|
-
if (cached !== void 0) return cached;
|
|
59
|
-
const value = statement.columns().length > 0;
|
|
60
|
-
statementReaderCache.set(statement, value);
|
|
61
|
-
return value;
|
|
62
|
-
};
|
|
63
|
-
const prepareCache = yield* Cache.make({
|
|
64
|
-
capacity: options.prepareCacheSize ?? 200,
|
|
65
|
-
timeToLive: options.prepareCacheTTL ?? Duration.minutes(10),
|
|
66
|
-
lookup: (sql) => Effect.try({
|
|
67
|
-
try: () => db.prepare(sql),
|
|
68
|
-
catch: (cause) => new SqlError({
|
|
69
|
-
cause,
|
|
70
|
-
message: "Failed to prepare statement"
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
});
|
|
74
|
-
const runStatement = (statement, params, raw) => Effect.withFiber((fiber) => {
|
|
75
|
-
statement.setReadBigInts(Boolean(ServiceMap.get(fiber.services, Client.SafeIntegers)));
|
|
76
|
-
try {
|
|
77
|
-
if (hasRows(statement)) return Effect.succeed(statement.all(...params));
|
|
78
|
-
const result = statement.run(...params);
|
|
79
|
-
return Effect.succeed(raw ? result : []);
|
|
80
|
-
} catch (cause) {
|
|
81
|
-
return Effect.fail(new SqlError({
|
|
82
|
-
cause,
|
|
83
|
-
message: "Failed to execute statement"
|
|
84
|
-
}));
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
const run = (sql, params, raw = false) => Effect.flatMap(Cache.get(prepareCache, sql), (s) => runStatement(s, params, raw));
|
|
88
|
-
const runValues = (sql, params) => Effect.acquireUseRelease(Cache.get(prepareCache, sql), (statement) => Effect.try({
|
|
89
|
-
try: () => {
|
|
90
|
-
if (hasRows(statement)) {
|
|
91
|
-
statement.setReturnArrays(true);
|
|
92
|
-
return statement.all(...params);
|
|
93
|
-
}
|
|
94
|
-
statement.run(...params);
|
|
95
|
-
return [];
|
|
96
|
-
},
|
|
97
|
-
catch: (cause) => new SqlError({
|
|
98
|
-
cause,
|
|
99
|
-
message: "Failed to execute statement"
|
|
100
|
-
})
|
|
101
|
-
}), (statement) => Effect.sync(() => {
|
|
102
|
-
if (hasRows(statement)) statement.setReturnArrays(false);
|
|
103
|
-
}));
|
|
104
|
-
return identity({
|
|
105
|
-
execute(sql, params, rowTransform) {
|
|
106
|
-
return rowTransform ? Effect.map(run(sql, params), rowTransform) : run(sql, params);
|
|
107
|
-
},
|
|
108
|
-
executeRaw(sql, params) {
|
|
109
|
-
return run(sql, params, true);
|
|
110
|
-
},
|
|
111
|
-
executeValues(sql, params) {
|
|
112
|
-
return runValues(sql, params);
|
|
113
|
-
},
|
|
114
|
-
executeUnprepared(sql, params, rowTransform) {
|
|
115
|
-
const effect = runStatement(db.prepare(sql), params ?? [], false);
|
|
116
|
-
return rowTransform ? Effect.map(effect, rowTransform) : effect;
|
|
117
|
-
},
|
|
118
|
-
executeStream(_sql, _params) {
|
|
119
|
-
return Stream.die("executeStream not implemented");
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
const semaphore = yield* Semaphore.make(1);
|
|
124
|
-
const connection = yield* makeConnection;
|
|
125
|
-
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));
|
|
126
|
-
const transactionAcquirer = Effect.uninterruptibleMask((restore) => {
|
|
127
|
-
const fiber = Fiber.getCurrent();
|
|
128
|
-
const scope = ServiceMap.getUnsafe(fiber.services, Scope.Scope);
|
|
129
|
-
return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);
|
|
130
|
-
});
|
|
131
|
-
return yield* Client.make({
|
|
132
|
-
acquirer,
|
|
133
|
-
compiler,
|
|
134
|
-
transactionAcquirer,
|
|
135
|
-
spanAttributes: [...options.spanAttributes ? Object.entries(options.spanAttributes) : [], [ATTR_DB_SYSTEM_NAME, "sqlite"]],
|
|
136
|
-
transformRows
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
const make = (options) => makeWithDatabase(options, () => new DatabaseSync(options.filename, {
|
|
140
|
-
readOnly: options.readonly ?? false,
|
|
141
|
-
allowExtension: options.allowExtension ?? false
|
|
142
|
-
}));
|
|
143
|
-
const makeMemory = (config = {}) => makeWithDatabase({
|
|
144
|
-
...config,
|
|
145
|
-
filename: ":memory:",
|
|
146
|
-
readonly: false
|
|
147
|
-
}, () => {
|
|
148
|
-
return new DatabaseSync(":memory:", { allowExtension: config.allowExtension ?? false });
|
|
149
|
-
});
|
|
150
|
-
const layerConfig = (config) => Layer.effectServices(Config.unwrap(config).asEffect().pipe(Effect.flatMap(make), Effect.map((client) => ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
|
|
151
|
-
const layer = (config) => Layer.effectServices(Effect.map(make(config), (client) => ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
|
|
152
|
-
const layerMemory = (config = {}) => Layer.effectServices(Effect.map(makeMemory(config), (client) => ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
|
|
153
|
-
|
|
154
|
-
//#endregion
|
|
155
|
-
export { SqliteClient, TypeId, layer, layerConfig, layerMemory };
|
|
156
|
-
//# sourceMappingURL=NodeSqliteClient-BTK-dUey.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NodeSqliteClient-BTK-dUey.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 { DatabaseSync, type StatementSync } 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 Scope from \"effect/Scope\";\nimport * as Semaphore from \"effect/Semaphore\";\nimport * as ServiceMap from \"effect/ServiceMap\";\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 } 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\n/**\n * SqliteClient - Effect service tag for the sqlite SQL client.\n */\nexport const SqliteClient = ServiceMap.Service<Client.SqlClient>(\"t3/persistence/NodeSqliteClient\");\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\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 `Node.js ${process.versions.node} is missing required node:sqlite APIs ` +\n `(StatementSync.columns). Upgrade to Node.js >=22.16, >=23.11, or >=24.`,\n );\n }\n return Effect.void;\n};\n\nconst makeWithDatabase = (\n options: SqliteClientConfig,\n openDatabase: () => DatabaseSync,\n): Effect.Effect<Client.SqlClient, never, Scope.Scope | Reactivity.Reactivity> =>\n Effect.gen(function* () {\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 = openDatabase();\n yield* Scope.addFinalizer(\n scope,\n Effect.sync(() => db.close()),\n );\n\n const statementReaderCache = new WeakMap<StatementSync, boolean>();\n const hasRows = (statement: 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 prepareCache = yield* Cache.make({\n capacity: options.prepareCacheSize ?? 200,\n timeToLive: options.prepareCacheTTL ?? Duration.minutes(10),\n lookup: (sql: string) =>\n Effect.try({\n try: () => db.prepare(sql),\n catch: (cause) => new SqlError({ cause, message: \"Failed to prepare statement\" }),\n }),\n });\n\n const runStatement = (\n statement: StatementSync,\n params: ReadonlyArray<unknown>,\n raw: boolean,\n ) =>\n Effect.withFiber<ReadonlyArray<any>, SqlError>((fiber) => {\n statement.setReadBigInts(Boolean(ServiceMap.get(fiber.services, Client.SafeIntegers)));\n try {\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(new SqlError({ cause, message: \"Failed to execute statement\" }));\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 runValues = (sql: string, params: ReadonlyArray<unknown>) =>\n Effect.acquireUseRelease(\n Cache.get(prepareCache, sql),\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) => new SqlError({ cause, message: \"Failed to execute statement\" }),\n }),\n (statement) =>\n Effect.sync(() => {\n if (hasRows(statement)) {\n statement.setReturnArrays(false);\n }\n }),\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 executeUnprepared(sql, params, rowTransform) {\n const effect = runStatement(db.prepare(sql), params ?? [], false);\n return rowTransform ? Effect.map(effect, rowTransform) : effect;\n },\n executeStream(_sql, _params) {\n return Stream.die(\"executeStream not implemented\");\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 = ServiceMap.getUnsafe(fiber.services, Scope.Scope);\n return Effect.as(\n Effect.tap(restore(semaphore.take(1)), () =>\n Scope.addFinalizer(scope, semaphore.release(1)),\n ),\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, never, Scope.Scope | Reactivity.Reactivity> =>\n makeWithDatabase(\n options,\n () =>\n new 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, never, Scope.Scope | Reactivity.Reactivity> =>\n makeWithDatabase(\n {\n ...config,\n filename: \":memory:\",\n readonly: false,\n },\n () => {\n const database = new 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> =>\n Layer.effectServices(\n Config.unwrap(config)\n .asEffect()\n .pipe(\n Effect.flatMap(make),\n Effect.map((client) =>\n ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)),\n ),\n ),\n ).pipe(Layer.provide(Reactivity.layer));\n\nexport const layer = (config: SqliteClientConfig): Layer.Layer<Client.SqlClient> =>\n Layer.effectServices(\n Effect.map(make(config), (client) =>\n ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)),\n ),\n ).pipe(Layer.provide(Reactivity.layer));\n\nexport const layerMemory = (config: SqliteMemoryClientConfig = {}): Layer.Layer<Client.SqlClient> =>\n Layer.effectServices(\n Effect.map(makeMemory(config), (client) =>\n ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)),\n ),\n ).pipe(Layer.provide(Reactivity.layer));\n"],"mappings":"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"}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const require_index = require('./index.cjs');
|
|
4
|
-
let effect_Effect = require("effect/Effect");
|
|
5
|
-
effect_Effect = require_index.__toESM(effect_Effect);
|
|
6
|
-
let effect_Layer = require("effect/Layer");
|
|
7
|
-
effect_Layer = require_index.__toESM(effect_Layer);
|
|
8
|
-
let effect_unstable_sql_SqlClient = require("effect/unstable/sql/SqlClient");
|
|
9
|
-
effect_unstable_sql_SqlClient = require_index.__toESM(effect_unstable_sql_SqlClient);
|
|
10
|
-
let effect_Semaphore = require("effect/Semaphore");
|
|
11
|
-
effect_Semaphore = require_index.__toESM(effect_Semaphore);
|
|
12
|
-
let node_sqlite = require("node:sqlite");
|
|
13
|
-
let effect_Cache = require("effect/Cache");
|
|
14
|
-
effect_Cache = require_index.__toESM(effect_Cache);
|
|
15
|
-
let effect_Config = require("effect/Config");
|
|
16
|
-
effect_Config = require_index.__toESM(effect_Config);
|
|
17
|
-
let effect_Duration = require("effect/Duration");
|
|
18
|
-
effect_Duration = require_index.__toESM(effect_Duration);
|
|
19
|
-
let effect_Fiber = require("effect/Fiber");
|
|
20
|
-
effect_Fiber = require_index.__toESM(effect_Fiber);
|
|
21
|
-
let effect_Function = require("effect/Function");
|
|
22
|
-
let effect_Scope = require("effect/Scope");
|
|
23
|
-
effect_Scope = require_index.__toESM(effect_Scope);
|
|
24
|
-
let effect_ServiceMap = require("effect/ServiceMap");
|
|
25
|
-
effect_ServiceMap = require_index.__toESM(effect_ServiceMap);
|
|
26
|
-
let effect_Stream = require("effect/Stream");
|
|
27
|
-
effect_Stream = require_index.__toESM(effect_Stream);
|
|
28
|
-
let effect_unstable_reactivity_Reactivity = require("effect/unstable/reactivity/Reactivity");
|
|
29
|
-
effect_unstable_reactivity_Reactivity = require_index.__toESM(effect_unstable_reactivity_Reactivity);
|
|
30
|
-
let effect_unstable_sql_SqlError = require("effect/unstable/sql/SqlError");
|
|
31
|
-
let effect_unstable_sql_Statement = require("effect/unstable/sql/Statement");
|
|
32
|
-
effect_unstable_sql_Statement = require_index.__toESM(effect_unstable_sql_Statement);
|
|
33
|
-
|
|
34
|
-
//#region src/persistence/NodeSqliteClient.ts
|
|
35
|
-
/**
|
|
36
|
-
* Port of `@effect/sql-sqlite-node` that uses the native `node:sqlite`
|
|
37
|
-
* bindings instead of `better-sqlite3`.
|
|
38
|
-
*
|
|
39
|
-
* @module SqliteClient
|
|
40
|
-
*/
|
|
41
|
-
const ATTR_DB_SYSTEM_NAME = "db.system.name";
|
|
42
|
-
const TypeId = "~local/sqlite-node/SqliteClient";
|
|
43
|
-
/**
|
|
44
|
-
* SqliteClient - Effect service tag for the sqlite SQL client.
|
|
45
|
-
*/
|
|
46
|
-
const SqliteClient = effect_ServiceMap.Service("t3/persistence/NodeSqliteClient");
|
|
47
|
-
/**
|
|
48
|
-
* Verify that the current Node.js version includes the `node:sqlite` APIs
|
|
49
|
-
* used by `NodeSqliteClient` — specifically `StatementSync.columns()` (added
|
|
50
|
-
* in Node 22.16.0 / 23.11.0).
|
|
51
|
-
*
|
|
52
|
-
* @see https://github.com/nodejs/node/pull/57490
|
|
53
|
-
*/
|
|
54
|
-
const checkNodeSqliteCompat = () => {
|
|
55
|
-
const parts = process.versions.node.split(".").map(Number);
|
|
56
|
-
const major = parts[0] ?? 0;
|
|
57
|
-
const minor = parts[1] ?? 0;
|
|
58
|
-
if (!(major === 22 && minor >= 16 || major === 23 && minor >= 11 || major >= 24)) return effect_Effect.die(`Node.js ${process.versions.node} is missing required node:sqlite APIs (StatementSync.columns). Upgrade to Node.js >=22.16, >=23.11, or >=24.`);
|
|
59
|
-
return effect_Effect.void;
|
|
60
|
-
};
|
|
61
|
-
const makeWithDatabase = (options, openDatabase) => effect_Effect.gen(function* () {
|
|
62
|
-
yield* checkNodeSqliteCompat();
|
|
63
|
-
const compiler = effect_unstable_sql_Statement.makeCompilerSqlite(options.transformQueryNames);
|
|
64
|
-
const transformRows = options.transformResultNames ? effect_unstable_sql_Statement.defaultTransforms(options.transformResultNames).array : void 0;
|
|
65
|
-
const makeConnection = effect_Effect.gen(function* () {
|
|
66
|
-
const scope = yield* effect_Effect.scope;
|
|
67
|
-
const db = openDatabase();
|
|
68
|
-
yield* effect_Scope.addFinalizer(scope, effect_Effect.sync(() => db.close()));
|
|
69
|
-
const statementReaderCache = /* @__PURE__ */ new WeakMap();
|
|
70
|
-
const hasRows = (statement) => {
|
|
71
|
-
const cached = statementReaderCache.get(statement);
|
|
72
|
-
if (cached !== void 0) return cached;
|
|
73
|
-
const value = statement.columns().length > 0;
|
|
74
|
-
statementReaderCache.set(statement, value);
|
|
75
|
-
return value;
|
|
76
|
-
};
|
|
77
|
-
const prepareCache = yield* effect_Cache.make({
|
|
78
|
-
capacity: options.prepareCacheSize ?? 200,
|
|
79
|
-
timeToLive: options.prepareCacheTTL ?? effect_Duration.minutes(10),
|
|
80
|
-
lookup: (sql) => effect_Effect.try({
|
|
81
|
-
try: () => db.prepare(sql),
|
|
82
|
-
catch: (cause) => new effect_unstable_sql_SqlError.SqlError({
|
|
83
|
-
cause,
|
|
84
|
-
message: "Failed to prepare statement"
|
|
85
|
-
})
|
|
86
|
-
})
|
|
87
|
-
});
|
|
88
|
-
const runStatement = (statement, params, raw) => effect_Effect.withFiber((fiber) => {
|
|
89
|
-
statement.setReadBigInts(Boolean(effect_ServiceMap.get(fiber.services, effect_unstable_sql_SqlClient.SafeIntegers)));
|
|
90
|
-
try {
|
|
91
|
-
if (hasRows(statement)) return effect_Effect.succeed(statement.all(...params));
|
|
92
|
-
const result = statement.run(...params);
|
|
93
|
-
return effect_Effect.succeed(raw ? result : []);
|
|
94
|
-
} catch (cause) {
|
|
95
|
-
return effect_Effect.fail(new effect_unstable_sql_SqlError.SqlError({
|
|
96
|
-
cause,
|
|
97
|
-
message: "Failed to execute statement"
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
const run = (sql, params, raw = false) => effect_Effect.flatMap(effect_Cache.get(prepareCache, sql), (s) => runStatement(s, params, raw));
|
|
102
|
-
const runValues = (sql, params) => effect_Effect.acquireUseRelease(effect_Cache.get(prepareCache, sql), (statement) => effect_Effect.try({
|
|
103
|
-
try: () => {
|
|
104
|
-
if (hasRows(statement)) {
|
|
105
|
-
statement.setReturnArrays(true);
|
|
106
|
-
return statement.all(...params);
|
|
107
|
-
}
|
|
108
|
-
statement.run(...params);
|
|
109
|
-
return [];
|
|
110
|
-
},
|
|
111
|
-
catch: (cause) => new effect_unstable_sql_SqlError.SqlError({
|
|
112
|
-
cause,
|
|
113
|
-
message: "Failed to execute statement"
|
|
114
|
-
})
|
|
115
|
-
}), (statement) => effect_Effect.sync(() => {
|
|
116
|
-
if (hasRows(statement)) statement.setReturnArrays(false);
|
|
117
|
-
}));
|
|
118
|
-
return (0, effect_Function.identity)({
|
|
119
|
-
execute(sql, params, rowTransform) {
|
|
120
|
-
return rowTransform ? effect_Effect.map(run(sql, params), rowTransform) : run(sql, params);
|
|
121
|
-
},
|
|
122
|
-
executeRaw(sql, params) {
|
|
123
|
-
return run(sql, params, true);
|
|
124
|
-
},
|
|
125
|
-
executeValues(sql, params) {
|
|
126
|
-
return runValues(sql, params);
|
|
127
|
-
},
|
|
128
|
-
executeUnprepared(sql, params, rowTransform) {
|
|
129
|
-
const effect = runStatement(db.prepare(sql), params ?? [], false);
|
|
130
|
-
return rowTransform ? effect_Effect.map(effect, rowTransform) : effect;
|
|
131
|
-
},
|
|
132
|
-
executeStream(_sql, _params) {
|
|
133
|
-
return effect_Stream.die("executeStream not implemented");
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
const semaphore = yield* effect_Semaphore.make(1);
|
|
138
|
-
const connection = yield* makeConnection;
|
|
139
|
-
const acquirer = semaphore.withPermits(1)(effect_Effect.succeed(connection));
|
|
140
|
-
const transactionAcquirer = effect_Effect.uninterruptibleMask((restore) => {
|
|
141
|
-
const fiber = effect_Fiber.getCurrent();
|
|
142
|
-
const scope = effect_ServiceMap.getUnsafe(fiber.services, effect_Scope.Scope);
|
|
143
|
-
return effect_Effect.as(effect_Effect.tap(restore(semaphore.take(1)), () => effect_Scope.addFinalizer(scope, semaphore.release(1))), connection);
|
|
144
|
-
});
|
|
145
|
-
return yield* effect_unstable_sql_SqlClient.make({
|
|
146
|
-
acquirer,
|
|
147
|
-
compiler,
|
|
148
|
-
transactionAcquirer,
|
|
149
|
-
spanAttributes: [...options.spanAttributes ? Object.entries(options.spanAttributes) : [], [ATTR_DB_SYSTEM_NAME, "sqlite"]],
|
|
150
|
-
transformRows
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
const make = (options) => makeWithDatabase(options, () => new node_sqlite.DatabaseSync(options.filename, {
|
|
154
|
-
readOnly: options.readonly ?? false,
|
|
155
|
-
allowExtension: options.allowExtension ?? false
|
|
156
|
-
}));
|
|
157
|
-
const makeMemory = (config = {}) => makeWithDatabase({
|
|
158
|
-
...config,
|
|
159
|
-
filename: ":memory:",
|
|
160
|
-
readonly: false
|
|
161
|
-
}, () => {
|
|
162
|
-
return new node_sqlite.DatabaseSync(":memory:", { allowExtension: config.allowExtension ?? false });
|
|
163
|
-
});
|
|
164
|
-
const layerConfig = (config) => effect_Layer.effectServices(effect_Config.unwrap(config).asEffect().pipe(effect_Effect.flatMap(make), effect_Effect.map((client) => effect_ServiceMap.make(SqliteClient, client).pipe(effect_ServiceMap.add(effect_unstable_sql_SqlClient.SqlClient, client))))).pipe(effect_Layer.provide(effect_unstable_reactivity_Reactivity.layer));
|
|
165
|
-
const layer = (config) => effect_Layer.effectServices(effect_Effect.map(make(config), (client) => effect_ServiceMap.make(SqliteClient, client).pipe(effect_ServiceMap.add(effect_unstable_sql_SqlClient.SqlClient, client)))).pipe(effect_Layer.provide(effect_unstable_reactivity_Reactivity.layer));
|
|
166
|
-
const layerMemory = (config = {}) => effect_Layer.effectServices(effect_Effect.map(makeMemory(config), (client) => effect_ServiceMap.make(SqliteClient, client).pipe(effect_ServiceMap.add(effect_unstable_sql_SqlClient.SqlClient, client)))).pipe(effect_Layer.provide(effect_unstable_reactivity_Reactivity.layer));
|
|
167
|
-
|
|
168
|
-
//#endregion
|
|
169
|
-
exports.SqliteClient = SqliteClient;
|
|
170
|
-
exports.TypeId = TypeId;
|
|
171
|
-
exports.layer = layer;
|
|
172
|
-
exports.layerConfig = layerConfig;
|
|
173
|
-
exports.layerMemory = layerMemory;
|
|
174
|
-
//# sourceMappingURL=NodeSqliteClient-ViK8pcdH.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NodeSqliteClient-ViK8pcdH.cjs","names":["ServiceMap","Effect","Statement","Scope","Cache","Duration","SqlError","Client","Stream","Semaphore","Fiber","DatabaseSync","Layer","Config","Reactivity"],"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 { DatabaseSync, type StatementSync } 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 Scope from \"effect/Scope\";\nimport * as Semaphore from \"effect/Semaphore\";\nimport * as ServiceMap from \"effect/ServiceMap\";\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 } 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\n/**\n * SqliteClient - Effect service tag for the sqlite SQL client.\n */\nexport const SqliteClient = ServiceMap.Service<Client.SqlClient>(\"t3/persistence/NodeSqliteClient\");\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\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 `Node.js ${process.versions.node} is missing required node:sqlite APIs ` +\n `(StatementSync.columns). Upgrade to Node.js >=22.16, >=23.11, or >=24.`,\n );\n }\n return Effect.void;\n};\n\nconst makeWithDatabase = (\n options: SqliteClientConfig,\n openDatabase: () => DatabaseSync,\n): Effect.Effect<Client.SqlClient, never, Scope.Scope | Reactivity.Reactivity> =>\n Effect.gen(function* () {\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 = openDatabase();\n yield* Scope.addFinalizer(\n scope,\n Effect.sync(() => db.close()),\n );\n\n const statementReaderCache = new WeakMap<StatementSync, boolean>();\n const hasRows = (statement: 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 prepareCache = yield* Cache.make({\n capacity: options.prepareCacheSize ?? 200,\n timeToLive: options.prepareCacheTTL ?? Duration.minutes(10),\n lookup: (sql: string) =>\n Effect.try({\n try: () => db.prepare(sql),\n catch: (cause) => new SqlError({ cause, message: \"Failed to prepare statement\" }),\n }),\n });\n\n const runStatement = (\n statement: StatementSync,\n params: ReadonlyArray<unknown>,\n raw: boolean,\n ) =>\n Effect.withFiber<ReadonlyArray<any>, SqlError>((fiber) => {\n statement.setReadBigInts(Boolean(ServiceMap.get(fiber.services, Client.SafeIntegers)));\n try {\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(new SqlError({ cause, message: \"Failed to execute statement\" }));\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 runValues = (sql: string, params: ReadonlyArray<unknown>) =>\n Effect.acquireUseRelease(\n Cache.get(prepareCache, sql),\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) => new SqlError({ cause, message: \"Failed to execute statement\" }),\n }),\n (statement) =>\n Effect.sync(() => {\n if (hasRows(statement)) {\n statement.setReturnArrays(false);\n }\n }),\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 executeUnprepared(sql, params, rowTransform) {\n const effect = runStatement(db.prepare(sql), params ?? [], false);\n return rowTransform ? Effect.map(effect, rowTransform) : effect;\n },\n executeStream(_sql, _params) {\n return Stream.die(\"executeStream not implemented\");\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 = ServiceMap.getUnsafe(fiber.services, Scope.Scope);\n return Effect.as(\n Effect.tap(restore(semaphore.take(1)), () =>\n Scope.addFinalizer(scope, semaphore.release(1)),\n ),\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, never, Scope.Scope | Reactivity.Reactivity> =>\n makeWithDatabase(\n options,\n () =>\n new 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, never, Scope.Scope | Reactivity.Reactivity> =>\n makeWithDatabase(\n {\n ...config,\n filename: \":memory:\",\n readonly: false,\n },\n () => {\n const database = new 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> =>\n Layer.effectServices(\n Config.unwrap(config)\n .asEffect()\n .pipe(\n Effect.flatMap(make),\n Effect.map((client) =>\n ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)),\n ),\n ),\n ).pipe(Layer.provide(Reactivity.layer));\n\nexport const layer = (config: SqliteClientConfig): Layer.Layer<Client.SqlClient> =>\n Layer.effectServices(\n Effect.map(make(config), (client) =>\n ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)),\n ),\n ).pipe(Layer.provide(Reactivity.layer));\n\nexport const layerMemory = (config: SqliteMemoryClientConfig = {}): Layer.Layer<Client.SqlClient> =>\n Layer.effectServices(\n Effect.map(makeMemory(config), (client) =>\n ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)),\n ),\n ).pipe(Layer.provide(Reactivity.layer));\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,sBAAsB;AAE5B,MAAa,SAAiB;;;;AAO9B,MAAa,eAAeA,kBAAW,QAA0B,kCAAkC;;;;;;;;AAyBnG,MAAM,8BAA8B;CAClC,MAAM,QAAQ,QAAQ,SAAS,KAAK,MAAM,IAAI,CAAC,IAAI,OAAO;CAC1D,MAAM,QAAQ,MAAM,MAAM;CAC1B,MAAM,QAAQ,MAAM,MAAM;AAG1B,KAAI,EAFe,UAAU,MAAM,SAAS,MAAQ,UAAU,MAAM,SAAS,MAAO,SAAS,IAG3F,QAAOC,cAAO,IACZ,WAAW,QAAQ,SAAS,KAAK,8GAElC;AAEH,QAAOA,cAAO;;AAGhB,MAAM,oBACJ,SACA,iBAEAA,cAAO,IAAI,aAAa;AACtB,QAAO,uBAAuB;CAE9B,MAAM,WAAWC,8BAAU,mBAAmB,QAAQ,oBAAoB;CAC1E,MAAM,gBAAgB,QAAQ,uBAC1BA,8BAAU,kBAAkB,QAAQ,qBAAqB,CAAC,QAC1D;CAEJ,MAAM,iBAAiBD,cAAO,IAAI,aAAa;EAC7C,MAAM,QAAQ,OAAOA,cAAO;EAC5B,MAAM,KAAK,cAAc;AACzB,SAAOE,aAAM,aACX,OACAF,cAAO,WAAW,GAAG,OAAO,CAAC,CAC9B;EAED,MAAM,uCAAuB,IAAI,SAAiC;EAClE,MAAM,WAAW,cAAsC;GACrD,MAAM,SAAS,qBAAqB,IAAI,UAAU;AAClD,OAAI,WAAW,OACb,QAAO;GAET,MAAM,QAAQ,UAAU,SAAS,CAAC,SAAS;AAC3C,wBAAqB,IAAI,WAAW,MAAM;AAC1C,UAAO;;EAGT,MAAM,eAAe,OAAOG,aAAM,KAAK;GACrC,UAAU,QAAQ,oBAAoB;GACtC,YAAY,QAAQ,mBAAmBC,gBAAS,QAAQ,GAAG;GAC3D,SAAS,QACPJ,cAAO,IAAI;IACT,WAAW,GAAG,QAAQ,IAAI;IAC1B,QAAQ,UAAU,IAAIK,sCAAS;KAAE;KAAO,SAAS;KAA+B,CAAC;IAClF,CAAC;GACL,CAAC;EAEF,MAAM,gBACJ,WACA,QACA,QAEAL,cAAO,WAAyC,UAAU;AACxD,aAAU,eAAe,QAAQD,kBAAW,IAAI,MAAM,UAAUO,8BAAO,aAAa,CAAC,CAAC;AACtF,OAAI;AACF,QAAI,QAAQ,UAAU,CACpB,QAAON,cAAO,QAAQ,UAAU,IAAI,GAAI,OAAe,CAAC;IAE1D,MAAM,SAAS,UAAU,IAAI,GAAI,OAAe;AAChD,WAAOA,cAAO,QAAQ,MAAO,SAA2C,EAAE,CAAC;YACpE,OAAO;AACd,WAAOA,cAAO,KAAK,IAAIK,sCAAS;KAAE;KAAO,SAAS;KAA+B,CAAC,CAAC;;IAErF;EAEJ,MAAM,OAAO,KAAa,QAAgC,MAAM,UAC9DL,cAAO,QAAQG,aAAM,IAAI,cAAc,IAAI,GAAG,MAAM,aAAa,GAAG,QAAQ,IAAI,CAAC;EAEnF,MAAM,aAAa,KAAa,WAC9BH,cAAO,kBACLG,aAAM,IAAI,cAAc,IAAI,GAC3B,cACCH,cAAO,IAAI;GACT,WAAW;AACT,QAAI,QAAQ,UAAU,EAAE;AACtB,eAAU,gBAAgB,KAAK;AAE/B,YAAO,UAAU,IAAI,GAAI,OAAe;;AAI1C,cAAU,IAAI,GAAI,OAAe;AACjC,WAAO,EAAE;;GAEX,QAAQ,UAAU,IAAIK,sCAAS;IAAE;IAAO,SAAS;IAA+B,CAAC;GAClF,CAAC,GACH,cACCL,cAAO,WAAW;AAChB,OAAI,QAAQ,UAAU,CACpB,WAAU,gBAAgB,MAAM;IAElC,CACL;AAEH,uCAA4B;GAC1B,QAAQ,KAAK,QAAQ,cAAc;AACjC,WAAO,eAAeA,cAAO,IAAI,IAAI,KAAK,OAAO,EAAE,aAAa,GAAG,IAAI,KAAK,OAAO;;GAErF,WAAW,KAAK,QAAQ;AACtB,WAAO,IAAI,KAAK,QAAQ,KAAK;;GAE/B,cAAc,KAAK,QAAQ;AACzB,WAAO,UAAU,KAAK,OAAO;;GAE/B,kBAAkB,KAAK,QAAQ,cAAc;IAC3C,MAAM,SAAS,aAAa,GAAG,QAAQ,IAAI,EAAE,UAAU,EAAE,EAAE,MAAM;AACjE,WAAO,eAAeA,cAAO,IAAI,QAAQ,aAAa,GAAG;;GAE3D,cAAc,MAAM,SAAS;AAC3B,WAAOO,cAAO,IAAI,gCAAgC;;GAErD,CAAC;GACF;CAEF,MAAM,YAAY,OAAOC,iBAAU,KAAK,EAAE;CAC1C,MAAM,aAAa,OAAO;CAE1B,MAAM,WAAW,UAAU,YAAY,EAAE,CAACR,cAAO,QAAQ,WAAW,CAAC;CACrE,MAAM,sBAAsBA,cAAO,qBAAqB,YAAY;EAClE,MAAM,QAAQS,aAAM,YAAY;EAChC,MAAM,QAAQV,kBAAW,UAAU,MAAM,UAAUG,aAAM,MAAM;AAC/D,SAAOF,cAAO,GACZA,cAAO,IAAI,QAAQ,UAAU,KAAK,EAAE,CAAC,QACnCE,aAAM,aAAa,OAAO,UAAU,QAAQ,EAAE,CAAC,CAChD,EACD,WACD;GACD;AAEF,QAAO,OAAOI,8BAAO,KAAK;EACxB;EACA;EACA;EACA,gBAAgB,CACd,GAAI,QAAQ,iBAAiB,OAAO,QAAQ,QAAQ,eAAe,GAAG,EAAE,EACxE,CAAC,qBAAqB,SAAS,CAChC;EACD;EACD,CAAC;EACF;AAEJ,MAAM,QACJ,YAEA,iBACE,eAEE,IAAII,yBAAa,QAAQ,UAAU;CACjC,UAAU,QAAQ,YAAY;CAC9B,gBAAgB,QAAQ,kBAAkB;CAC3C,CAAC,CACL;AAEH,MAAM,cACJ,SAAmC,EAAE,KAErC,iBACE;CACE,GAAG;CACH,UAAU;CACV,UAAU;CACX,QACK;AAIJ,QAHiB,IAAIA,yBAAa,YAAY,EAC5C,gBAAgB,OAAO,kBAAkB,OAC1C,CAAC;EAGL;AAEH,MAAa,eACX,WAEAC,aAAM,eACJC,cAAO,OAAO,OAAO,CAClB,UAAU,CACV,KACCZ,cAAO,QAAQ,KAAK,EACpBA,cAAO,KAAK,WACVD,kBAAW,KAAK,cAAc,OAAO,CAAC,KAAKA,kBAAW,IAAIO,8BAAO,WAAW,OAAO,CAAC,CACrF,CACF,CACJ,CAAC,KAAKK,aAAM,QAAQE,sCAAW,MAAM,CAAC;AAEzC,MAAa,SAAS,WACpBF,aAAM,eACJX,cAAO,IAAI,KAAK,OAAO,GAAG,WACxBD,kBAAW,KAAK,cAAc,OAAO,CAAC,KAAKA,kBAAW,IAAIO,8BAAO,WAAW,OAAO,CAAC,CACrF,CACF,CAAC,KAAKK,aAAM,QAAQE,sCAAW,MAAM,CAAC;AAEzC,MAAa,eAAe,SAAmC,EAAE,KAC/DF,aAAM,eACJX,cAAO,IAAI,WAAW,OAAO,GAAG,WAC9BD,kBAAW,KAAK,cAAc,OAAO,CAAC,KAAKA,kBAAW,IAAIO,8BAAO,WAAW,OAAO,CAAC,CACrF,CACF,CAAC,KAAKK,aAAM,QAAQE,sCAAW,MAAM,CAAC"}
|