oakbun 0.5.1 → 0.5.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/adapter/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEtF,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,OAAO,EAAG,UAAU,CAAS;IAItC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;gBAE5B,MAAM,EAAE,cAAc;IAe5B,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,YAAY,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAQhE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,YAAY,EAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IASzE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiB/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/adapter/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEtF,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAoBD,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,OAAO,EAAG,UAAU,CAAS;IAItC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;gBAE5B,MAAM,EAAE,cAAc;IAe5B,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,YAAY,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAOhE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,YAAY,EAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAQzE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiB/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PostgresAdapter,
3
3
  init_postgres
4
- } from "../chunk-HDJYYCSR.js";
4
+ } from "../chunk-GHTAYIFD.js";
5
5
  import "../chunk-Z6ZWNWWR.js";
6
6
  init_postgres();
7
7
  export {
@@ -8,6 +8,14 @@ var postgres_exports = {};
8
8
  __export(postgres_exports, {
9
9
  PostgresAdapter: () => PostgresAdapter
10
10
  });
11
+ function toPositional(sql) {
12
+ let i = 0;
13
+ return sql.replace(/\?/g, () => `$${++i}`);
14
+ }
15
+ function unsafeCall(client, sql, params) {
16
+ const positional = toPositional(sql);
17
+ return params.length > 0 ? client.unsafe(positional, params) : client.unsafe(positional);
18
+ }
11
19
  var PostgresAdapter;
12
20
  var init_postgres = __esm({
13
21
  "src/adapter/postgres.ts"() {
@@ -32,13 +40,13 @@ var init_postgres = __esm({
32
40
  }
33
41
  async query(sql, params = []) {
34
42
  const t0 = performance.now();
35
- const rows = await this.sql.unsafe(sql, params);
43
+ const rows = await unsafeCall(this.sql, sql, params);
36
44
  this.onQuery?.({ sql, params, durationMs: performance.now() - t0, type: "query" });
37
45
  return rows;
38
46
  }
39
47
  async execute(sql, params = []) {
40
48
  const t0 = performance.now();
41
- const result = await this.sql.unsafe(sql, params);
49
+ const result = await unsafeCall(this.sql, sql, params);
42
50
  this.onQuery?.({ sql, params, durationMs: performance.now() - t0, type: "execute" });
43
51
  const rowsAffected = typeof result?.count === "number" ? result.count : result?.length ?? 0;
44
52
  return { rowsAffected };
@@ -47,9 +55,9 @@ var init_postgres = __esm({
47
55
  return this.sql.begin(async (tx) => {
48
56
  const txAdapter = {
49
57
  dialect: "postgres",
50
- query: (s, p = []) => tx.unsafe(s, p),
58
+ query: (s, p = []) => unsafeCall(tx, s, p),
51
59
  execute: async (s, p = []) => {
52
- const r = await tx.unsafe(s, p);
60
+ const r = await unsafeCall(tx, s, p);
53
61
  const rowsAffected = typeof r?.count === "number" ? r.count : r?.length ?? 0;
54
62
  return { rowsAffected };
55
63
  },
@@ -74,4 +82,4 @@ export {
74
82
  postgres_exports,
75
83
  init_postgres
76
84
  };
77
- //# sourceMappingURL=chunk-HDJYYCSR.js.map
85
+ //# sourceMappingURL=chunk-GHTAYIFD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter/postgres.ts"],"sourcesContent":["import type { VelnAdapter, BindingValue, ExecuteResult, QueryLogEntry } from './types'\n\nexport interface PostgresConfig {\n url: string\n max?: number\n idleTimeout?: number\n}\n\n// Bun.SQL.unsafe() requires $1, $2, ... positional placeholders — not the ? style\n// used by SQLite. Convert before every call.\nfunction toPositional(sql: string): string {\n let i = 0\n return sql.replace(/\\?/g, () => `$${++i}`)\n}\n\n// When there are no params, call unsafe(sql) without a second argument.\n// Passing an empty array causes Bun.SQL to parse the SQL for placeholders,\n// which misinterprets commas inside type expressions like NUMERIC(12,2).\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction unsafeCall(client: any, sql: string, params: BindingValue[]): any {\n const positional = toPositional(sql)\n return params.length > 0\n ? client.unsafe(positional, params)\n : client.unsafe(positional)\n}\n\nexport class PostgresAdapter implements VelnAdapter {\n readonly dialect = 'postgres' as const\n // Typed as any: Bun.SQL's instance type is not reliably exported across\n // bun-types versions and the class is a Bun global — no stable import path.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly sql: any\n onQuery?: (entry: QueryLogEntry) => void\n\n constructor(config: PostgresConfig) {\n if (config.max !== undefined && config.max < 1) {\n throw new Error(`PostgresAdapter: max connections must be at least 1, got ${config.max}`)\n }\n // Set DATABASE_URL if not already set — Bun.sql reads from environment\n if (!process.env['DATABASE_URL']) {\n process.env['DATABASE_URL'] = config.url\n }\n // @ts-ignore — Bun.SQL is a Bun global constructor, not in all bun-types versions\n this.sql = new Bun.SQL(config.url, {\n max: config.max ?? 10,\n idleTimeout: config.idleTimeout ?? 30,\n })\n }\n\n async query<T>(sql: string, params: BindingValue[] = []): Promise<T[]> {\n const t0 = performance.now()\n const rows = await unsafeCall(this.sql, sql, params) as T[]\n this.onQuery?.({ sql, params, durationMs: performance.now() - t0, type: 'query' })\n return rows\n }\n\n async execute(sql: string, params: BindingValue[] = []): Promise<ExecuteResult> {\n const t0 = performance.now()\n const result = await unsafeCall(this.sql, sql, params)\n this.onQuery?.({ sql, params, durationMs: performance.now() - t0, type: 'execute' })\n const rowsAffected = typeof result?.count === 'number' ? result.count : (result?.length ?? 0)\n return { rowsAffected } // lastInsertId not available without RETURNING clause\n }\n\n async transaction<T>(fn: (tx: VelnAdapter) => Promise<T>): Promise<T> {\n return this.sql.begin(async (tx: any) => {\n const txAdapter: VelnAdapter = {\n dialect: 'postgres',\n query: (s, p = []) => unsafeCall(tx, s, p),\n execute: async (s, p = []) => {\n const r = await unsafeCall(tx, s, p)\n const rowsAffected = typeof r?.count === 'number' ? r.count : (r?.length ?? 0)\n return { rowsAffected }\n },\n transaction: (innerFn) => innerFn(txAdapter), // nested: reuse same tx\n close: async () => {}, // no-op inside transaction\n }\n return fn(txAdapter)\n })\n }\n\n async close(): Promise<void> {\n await this.sql.end?.()\n }\n}\n"],"mappings":";;;;;;AAAA;AAAA;AAAA;AAAA;AAUA,SAAS,aAAa,KAAqB;AACzC,MAAI,IAAI;AACR,SAAO,IAAI,QAAQ,OAAO,MAAM,IAAI,EAAE,CAAC,EAAE;AAC3C;AAMA,SAAS,WAAW,QAAa,KAAa,QAA6B;AACzE,QAAM,aAAa,aAAa,GAAG;AACnC,SAAO,OAAO,SAAS,IACnB,OAAO,OAAO,YAAY,MAAM,IAChC,OAAO,OAAO,UAAU;AAC9B;AAxBA,IA0Ba;AA1Bb;AAAA;AA0BO,IAAM,kBAAN,MAA6C;AAAA,MACzC,UAAU;AAAA;AAAA;AAAA;AAAA,MAIF;AAAA,MACjB;AAAA,MAEA,YAAY,QAAwB;AAClC,YAAI,OAAO,QAAQ,UAAa,OAAO,MAAM,GAAG;AAC9C,gBAAM,IAAI,MAAM,4DAA4D,OAAO,GAAG,EAAE;AAAA,QAC1F;AAEA,YAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAChC,kBAAQ,IAAI,cAAc,IAAI,OAAO;AAAA,QACvC;AAEA,aAAK,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK;AAAA,UACjC,KAAK,OAAO,OAAO;AAAA,UACnB,aAAa,OAAO,eAAe;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,MAAS,KAAa,SAAyB,CAAC,GAAiB;AACrE,cAAM,KAAK,YAAY,IAAI;AAC3B,cAAM,OAAO,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM;AACnD,aAAK,UAAU,EAAE,KAAK,QAAQ,YAAY,YAAY,IAAI,IAAI,IAAI,MAAM,QAAQ,CAAC;AACjF,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,QAAQ,KAAa,SAAyB,CAAC,GAA2B;AAC9E,cAAM,KAAK,YAAY,IAAI;AAC3B,cAAM,SAAS,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM;AACrD,aAAK,UAAU,EAAE,KAAK,QAAQ,YAAY,YAAY,IAAI,IAAI,IAAI,MAAM,UAAU,CAAC;AACnF,cAAM,eAAe,OAAO,QAAQ,UAAU,WAAW,OAAO,QAAS,QAAQ,UAAU;AAC3F,eAAO,EAAE,aAAa;AAAA,MACxB;AAAA,MAEA,MAAM,YAAe,IAAiD;AACpE,eAAO,KAAK,IAAI,MAAM,OAAO,OAAY;AACvC,gBAAM,YAAyB;AAAA,YAC7B,SAAa;AAAA,YACb,OAAa,CAAC,GAAG,IAAI,CAAC,MAAM,WAAW,IAAI,GAAG,CAAC;AAAA,YAC/C,SAAa,OAAO,GAAG,IAAI,CAAC,MAAM;AAChC,oBAAM,IAAI,MAAM,WAAW,IAAI,GAAG,CAAC;AACnC,oBAAM,eAAe,OAAO,GAAG,UAAU,WAAW,EAAE,QAAS,GAAG,UAAU;AAC5E,qBAAO,EAAE,aAAa;AAAA,YACxB;AAAA,YACA,aAAa,CAAC,YAAY,QAAQ,SAAS;AAAA;AAAA,YAC3C,OAAa,YAAY;AAAA,YAAC;AAAA;AAAA,UAC5B;AACA,iBAAO,GAAG,SAAS;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,QAAuB;AAC3B,cAAM,KAAK,IAAI,MAAM;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;","names":[]}
package/dist/cli/bin.js CHANGED
@@ -100,7 +100,7 @@ async function discoverCommands(config) {
100
100
 
101
101
  // src/cli/commands/migrate/run.ts
102
102
  async function migrateRun(_args, config) {
103
- const { createMigrator } = await import("../migrations-MWOFVTEL.js");
103
+ const { createMigrator } = await import("../migrations-WJ72RSDH.js");
104
104
  const migrationsDir = config.migrations ?? "./migrations";
105
105
  const adapter = await loadAdapter(config);
106
106
  const migrator = createMigrator(adapter, { migrationsDir });
@@ -120,7 +120,7 @@ async function migrateRun(_args, config) {
120
120
 
121
121
  // src/cli/commands/migrate/status.ts
122
122
  async function migrateStatus(_args, config) {
123
- const { createMigrator } = await import("../migrations-MWOFVTEL.js");
123
+ const { createMigrator } = await import("../migrations-WJ72RSDH.js");
124
124
  const migrationsDir = config.migrations ?? "./migrations";
125
125
  const adapter = await loadAdapter(config);
126
126
  const migrator = createMigrator(adapter, { migrationsDir });
@@ -175,7 +175,7 @@ async function discoverTables(config) {
175
175
 
176
176
  // src/cli/commands/migrate/generate.ts
177
177
  async function migrateGenerate(args, config) {
178
- const { generateMigration } = await import("../migrations-MWOFVTEL.js");
178
+ const { generateMigration } = await import("../migrations-WJ72RSDH.js");
179
179
  const name = args[0];
180
180
  const tables = await discoverTables(config);
181
181
  if (tables.length === 0) {
@@ -202,7 +202,7 @@ async function migrateGenerate(args, config) {
202
202
 
203
203
  // src/cli/commands/migrate/rollback.ts
204
204
  async function migrateRollback(_args, config) {
205
- const { createMigrator } = await import("../migrations-MWOFVTEL.js");
205
+ const { createMigrator } = await import("../migrations-WJ72RSDH.js");
206
206
  const migrationsDir = config.migrations ?? "./migrations";
207
207
  const adapter = await loadAdapter(config);
208
208
  const migrator = createMigrator(adapter, { migrationsDir });
@@ -443,7 +443,7 @@ async function tinker(_args, config) {
443
443
  const { RequestEventQueue, EventBus } = await import("../events-LDXSK7ME.js");
444
444
  const { createSystemCtx } = await import("../system-ctx-GPF44QCE.js");
445
445
  const { instantiateServices } = await import("../service-W4V6TFWU.js");
446
- const { createMigrator } = await import("../migrations-MWOFVTEL.js");
446
+ const { createMigrator } = await import("../migrations-WJ72RSDH.js");
447
447
  const hooks = new HookExecutor2();
448
448
  hooks.setAdapter(adapter);
449
449
  const velnDB = new VelnDB(adapter, hooks);
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  PostgresAdapter,
8
8
  init_postgres,
9
9
  postgres_exports
10
- } from "./chunk-HDJYYCSR.js";
10
+ } from "./chunk-GHTAYIFD.js";
11
11
  import {
12
12
  MySQLAdapter,
13
13
  init_mysql,
@@ -14,6 +14,14 @@ var postgres_exports = {};
14
14
  __export(postgres_exports, {
15
15
  PostgresAdapter: () => PostgresAdapter
16
16
  });
17
+ function toPositional(sql) {
18
+ let i = 0;
19
+ return sql.replace(/\?/g, () => `$${++i}`);
20
+ }
21
+ function unsafeCall(client, sql, params) {
22
+ const positional = toPositional(sql);
23
+ return params.length > 0 ? client.unsafe(positional, params) : client.unsafe(positional);
24
+ }
17
25
  var PostgresAdapter;
18
26
  var init_postgres = __esm({
19
27
  "src/adapter/postgres.ts"() {
@@ -39,13 +47,13 @@ var init_postgres = __esm({
39
47
  }
40
48
  async query(sql, params = []) {
41
49
  const t0 = performance.now();
42
- const rows = await this.sql.unsafe(sql, params);
50
+ const rows = await unsafeCall(this.sql, sql, params);
43
51
  this.onQuery?.({ sql, params, durationMs: performance.now() - t0, type: "query" });
44
52
  return rows;
45
53
  }
46
54
  async execute(sql, params = []) {
47
55
  const t0 = performance.now();
48
- const result = await this.sql.unsafe(sql, params);
56
+ const result = await unsafeCall(this.sql, sql, params);
49
57
  this.onQuery?.({ sql, params, durationMs: performance.now() - t0, type: "execute" });
50
58
  const rowsAffected = typeof result?.count === "number" ? result.count : result?.length ?? 0;
51
59
  return { rowsAffected };
@@ -54,9 +62,9 @@ var init_postgres = __esm({
54
62
  return this.sql.begin(async (tx) => {
55
63
  const txAdapter = {
56
64
  dialect: "postgres",
57
- query: (s, p = []) => tx.unsafe(s, p),
65
+ query: (s, p = []) => unsafeCall(tx, s, p),
58
66
  execute: async (s, p = []) => {
59
- const r = await tx.unsafe(s, p);
67
+ const r = await unsafeCall(tx, s, p);
60
68
  const rowsAffected = typeof r?.count === "number" ? r.count : r?.length ?? 0;
61
69
  return { rowsAffected };
62
70
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oakbun",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Bun-native backend framework — No Magic, just code.",
5
5
  "author": "René (SchildW3rk)",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/adapter/postgres.ts"],"sourcesContent":["import type { VelnAdapter, BindingValue, ExecuteResult, QueryLogEntry } from './types'\n\nexport interface PostgresConfig {\n url: string\n max?: number\n idleTimeout?: number\n}\n\nexport class PostgresAdapter implements VelnAdapter {\n readonly dialect = 'postgres' as const\n // Typed as any: Bun.SQL's instance type is not reliably exported across\n // bun-types versions and the class is a Bun global — no stable import path.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly sql: any\n onQuery?: (entry: QueryLogEntry) => void\n\n constructor(config: PostgresConfig) {\n if (config.max !== undefined && config.max < 1) {\n throw new Error(`PostgresAdapter: max connections must be at least 1, got ${config.max}`)\n }\n // Set DATABASE_URL if not already set — Bun.sql reads from environment\n if (!process.env['DATABASE_URL']) {\n process.env['DATABASE_URL'] = config.url\n }\n // @ts-ignore — Bun.SQL is a Bun global constructor, not in all bun-types versions\n this.sql = new Bun.SQL(config.url, {\n max: config.max ?? 10,\n idleTimeout: config.idleTimeout ?? 30,\n })\n }\n\n async query<T>(sql: string, params: BindingValue[] = []): Promise<T[]> {\n const t0 = performance.now()\n // .unsafe() accepts a raw SQL string + positional params array\n const rows = await this.sql.unsafe(sql, params) as T[]\n this.onQuery?.({ sql, params, durationMs: performance.now() - t0, type: 'query' })\n return rows\n }\n\n async execute(sql: string, params: BindingValue[] = []): Promise<ExecuteResult> {\n const t0 = performance.now()\n const result = await this.sql.unsafe(sql, params)\n this.onQuery?.({ sql, params, durationMs: performance.now() - t0, type: 'execute' })\n // Bun.SQL result exposes .count for rows affected on DML statements\n const rowsAffected = typeof result?.count === 'number' ? result.count : (result?.length ?? 0)\n return { rowsAffected } // lastInsertId not available without RETURNING clause\n }\n\n async transaction<T>(fn: (tx: VelnAdapter) => Promise<T>): Promise<T> {\n return this.sql.begin(async (tx: any) => {\n const txAdapter: VelnAdapter = {\n dialect: 'postgres',\n query: (s, p = []) => tx.unsafe(s, p),\n execute: async (s, p = []) => {\n const r = await tx.unsafe(s, p)\n const rowsAffected = typeof r?.count === 'number' ? r.count : (r?.length ?? 0)\n return { rowsAffected }\n },\n transaction: (innerFn) => innerFn(txAdapter), // nested: reuse same tx\n close: async () => {}, // no-op inside transaction\n }\n return fn(txAdapter)\n })\n }\n\n async close(): Promise<void> {\n await this.sql.end?.()\n }\n}\n"],"mappings":";;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,IAQa;AARb;AAAA;AAQO,IAAM,kBAAN,MAA6C;AAAA,MACzC,UAAU;AAAA;AAAA;AAAA;AAAA,MAIF;AAAA,MACjB;AAAA,MAEA,YAAY,QAAwB;AAClC,YAAI,OAAO,QAAQ,UAAa,OAAO,MAAM,GAAG;AAC9C,gBAAM,IAAI,MAAM,4DAA4D,OAAO,GAAG,EAAE;AAAA,QAC1F;AAEA,YAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAChC,kBAAQ,IAAI,cAAc,IAAI,OAAO;AAAA,QACvC;AAEA,aAAK,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK;AAAA,UACjC,KAAK,OAAO,OAAO;AAAA,UACnB,aAAa,OAAO,eAAe;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,MAAS,KAAa,SAAyB,CAAC,GAAiB;AACrE,cAAM,KAAK,YAAY,IAAI;AAE3B,cAAM,OAAO,MAAM,KAAK,IAAI,OAAO,KAAK,MAAM;AAC9C,aAAK,UAAU,EAAE,KAAK,QAAQ,YAAY,YAAY,IAAI,IAAI,IAAI,MAAM,QAAQ,CAAC;AACjF,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,QAAQ,KAAa,SAAyB,CAAC,GAA2B;AAC9E,cAAM,KAAK,YAAY,IAAI;AAC3B,cAAM,SAAS,MAAM,KAAK,IAAI,OAAO,KAAK,MAAM;AAChD,aAAK,UAAU,EAAE,KAAK,QAAQ,YAAY,YAAY,IAAI,IAAI,IAAI,MAAM,UAAU,CAAC;AAEnF,cAAM,eAAe,OAAO,QAAQ,UAAU,WAAW,OAAO,QAAS,QAAQ,UAAU;AAC3F,eAAO,EAAE,aAAa;AAAA,MACxB;AAAA,MAEA,MAAM,YAAe,IAAiD;AACpE,eAAO,KAAK,IAAI,MAAM,OAAO,OAAY;AACvC,gBAAM,YAAyB;AAAA,YAC7B,SAAa;AAAA,YACb,OAAa,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC;AAAA,YAC1C,SAAa,OAAO,GAAG,IAAI,CAAC,MAAM;AAChC,oBAAM,IAAI,MAAM,GAAG,OAAO,GAAG,CAAC;AAC9B,oBAAM,eAAe,OAAO,GAAG,UAAU,WAAW,EAAE,QAAS,GAAG,UAAU;AAC5E,qBAAO,EAAE,aAAa;AAAA,YACxB;AAAA,YACA,aAAa,CAAC,YAAY,QAAQ,SAAS;AAAA;AAAA,YAC3C,OAAa,YAAY;AAAA,YAAC;AAAA;AAAA,UAC5B;AACA,iBAAO,GAAG,SAAS;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,QAAuB;AAC3B,cAAM,KAAK,IAAI,MAAM;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;","names":[]}