@ponder/client 0.16.10 → 0.17.1

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/index.d.ts CHANGED
@@ -65,7 +65,7 @@ declare const compileQuery: (query: SQLWrapper) => QueryWithTypings;
65
65
  * ```
66
66
  */
67
67
  declare const createClient: <schema extends Schema>(baseUrl: string, params?: {
68
- schema?: schema | undefined;
68
+ schema?: schema;
69
69
  }) => Client<schema>;
70
70
 
71
71
  declare const setDatabaseSchema: <T extends {
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  // src/index.ts
2
2
  import {
3
3
  Column,
4
- SQL,
5
- Table,
6
4
  is,
7
5
  isTable,
8
- mapRelationalRow
6
+ mapRelationalRow,
7
+ SQL,
8
+ Table
9
9
  } from "drizzle-orm";
10
10
  import { isPgEnum } from "drizzle-orm/pg-core";
11
11
  import { PgCountBuilder } from "drizzle-orm/pg-core/query-builders/count";
@@ -16,49 +16,49 @@ import { TypedQueryBuilder } from "drizzle-orm/query-builders/query-builder";
16
16
  import { EventSource } from "eventsource";
17
17
  import superjson from "superjson";
18
18
  import {
19
- sql,
19
+ and,
20
+ asc,
21
+ avg,
22
+ avgDistinct,
23
+ between,
24
+ count,
25
+ countDistinct,
26
+ desc,
20
27
  eq,
28
+ exists,
21
29
  gt,
22
30
  gte,
31
+ ilike,
32
+ inArray,
33
+ isNotNull,
34
+ isNull,
35
+ like,
23
36
  lt,
24
37
  lte,
38
+ max,
39
+ min,
25
40
  ne,
26
- isNull,
27
- isNotNull,
28
- inArray,
29
- notInArray,
30
- exists,
31
- notExists,
32
- between,
41
+ not,
33
42
  notBetween,
34
- like,
35
- notLike,
36
- ilike,
43
+ notExists,
37
44
  notIlike,
38
- not,
39
- asc,
40
- desc,
41
- and,
45
+ notInArray,
46
+ notLike,
42
47
  or,
43
- count,
44
- countDistinct,
45
- avg,
46
- avgDistinct,
47
- sum,
48
- sumDistinct,
49
- max,
50
- min,
51
48
  relations,
52
- SQL as SQL2
49
+ SQL as SQL2,
50
+ sql,
51
+ sum,
52
+ sumDistinct
53
53
  } from "drizzle-orm";
54
54
  import {
55
55
  alias,
56
- union,
57
- unionAll,
56
+ except,
57
+ exceptAll,
58
58
  intersect,
59
59
  intersectAll,
60
- except,
61
- exceptAll
60
+ union,
61
+ unionAll
62
62
  } from "drizzle-orm/pg-core";
63
63
  var getUrl = (baseUrl, method, query) => {
64
64
  const url = new URL(baseUrl);
@@ -134,7 +134,7 @@ var createClient = (baseUrl, params = {}) => {
134
134
  const orderedFields = orderSelectedFields(fields);
135
135
  data = await drizzleShim._.session.prepareQuery(
136
136
  query,
137
- // @ts-ignore
137
+ // @ts-expect-error
138
138
  orderedFields,
139
139
  void 0,
140
140
  false
@@ -149,11 +149,10 @@ var createClient = (baseUrl, params = {}) => {
149
149
  (rawRows, mapColumnValue) => {
150
150
  const rows = rawRows.map(
151
151
  (row) => mapRelationalRow(
152
- // @ts-ignore
152
+ // @ts-expect-error
153
153
  queryBuilder.schema,
154
- // @ts-ignore
154
+ // @ts-expect-error
155
155
  queryBuilder.tableConfig,
156
- // @ts-ignore
157
156
  row,
158
157
  selection,
159
158
  mapColumnValue
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n type AnyColumn,\n Column,\n type QueryWithTypings,\n SQL,\n type SQLWrapper,\n type SelectedFieldsOrdered,\n Table,\n is,\n isTable,\n mapRelationalRow,\n} from \"drizzle-orm\";\nimport { type PgDialect, isPgEnum } from \"drizzle-orm/pg-core\";\nimport { PgCountBuilder } from \"drizzle-orm/pg-core/query-builders/count\";\nimport { PgRelationalQuery } from \"drizzle-orm/pg-core/query-builders/query\";\nimport { PgRaw } from \"drizzle-orm/pg-core/query-builders/raw\";\nimport { type PgRemoteDatabase, drizzle } from \"drizzle-orm/pg-proxy\";\nimport { TypedQueryBuilder } from \"drizzle-orm/query-builders/query-builder\";\nimport { EventSource } from \"eventsource\";\nimport superjson from \"superjson\";\n\ntype Schema = { [name: string]: unknown };\n\ntype Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\nexport type Status = {\n [chainName: string]: {\n id: number;\n block: { number: number; timestamp: number };\n };\n};\n\ntype ClientDb<schema extends Schema = Schema> = Prettify<\n Omit<\n PgRemoteDatabase<schema>,\n | \"insert\"\n | \"update\"\n | \"delete\"\n | \"transaction\"\n | \"refreshMaterializedView\"\n | \"_\"\n >\n>;\n\nexport type Client<schema extends Schema = Schema> = {\n /** Query the database. */\n db: ClientDb<schema>;\n /**\n * Subscribe to live updates.\n *\n * @param queryFn - The query to subscribe to.\n * @param onData - The callback to call with each new query result\n * @param onError - The callback to call when an error occurs.\n *\n * @example\n * ```ts\n * import { createClient } from \"@ponder/client\";\n * import * as schema from \"../ponder.schema\";\n *\n * const client = createClient(\"https://.../sql\", { schema });\n *\n * client.live(\n * (db) => db.select().from(schema.account),\n * (result) => console.log(result),\n * (error) => console.error(error),\n * );\n * ```\n */\n live: <result>(\n queryFn: (db: ClientDb<schema>) => Promise<result>,\n onData: (result: result) => void,\n onError?: (error: Error) => void,\n ) => {\n unsubscribe: () => void;\n };\n /** Get the status of all chains. */\n getStatus: () => Promise<Status>;\n};\n\nconst getUrl = (\n baseUrl: string,\n method: \"live\" | \"db\",\n query?: QueryWithTypings,\n) => {\n const url = new URL(baseUrl);\n url.pathname = `${url.pathname}/${method}`;\n if (query) {\n url.searchParams.set(\"sql\", superjson.stringify(query));\n }\n return url;\n};\n\nconst noopDatabase = drizzle(() => Promise.resolve({ rows: [] }), {\n casing: \"snake_case\",\n});\n\n// @ts-ignore\nconst dialect: PgDialect = noopDatabase.dialect;\n\nexport const compileQuery = (query: SQLWrapper) => {\n return dialect.sqlToQuery(query.getSQL());\n};\n\n/**\n * Create a client for querying Ponder apps.\n *\n * @param baseUrl - The URL of the Ponder app.\n * @param schema - The schema of the Ponder app.\n *\n * @example\n * ```ts\n * import { createClient } from \"@ponder/client\";\n * import * as schema from \"../ponder.schema\";\n *\n * const client = createClient(\"https://.../sql\", { schema });\n * ```\n */\nexport const createClient = <schema extends Schema>(\n baseUrl: string,\n params: { schema?: schema } = {},\n): Client<schema> => {\n const client: Client<schema> = {\n db: drizzle(\n async (sql, params, method, typings) => {\n const builtQuery = { sql, params, typings };\n const response = await fetch(getUrl(baseUrl, \"db\", builtQuery), {\n method: \"GET\",\n });\n\n if (response.ok === false) {\n const error = new Error(await response.text());\n error.stack = undefined;\n throw error;\n }\n\n const result = await response.json();\n\n if (method === \"all\") {\n return {\n ...result,\n rows: result.rows.map((row: object) => Object.values(row)),\n };\n }\n\n return result;\n },\n { schema: params.schema, casing: \"snake_case\" },\n ),\n live: (queryFn, onData, onError) => {\n const noopDatabase = drizzle(() => Promise.resolve({ rows: [] }), {\n schema: params.schema,\n casing: \"snake_case\",\n });\n\n const queryPromise = queryFn(noopDatabase);\n\n if (\"getSQL\" in queryPromise === false) {\n throw new Error(\n '\"queryFn\" must return SQL. You may have to remove `.execute()` from your query.',\n );\n }\n const queryBuilder = queryPromise as unknown as SQLWrapper;\n const query = compileQuery(queryBuilder);\n\n const sse = new EventSource(getUrl(baseUrl, \"live\", query));\n\n const onDataListener = async (event: MessageEvent) => {\n try {\n // @ts-ignore\n const result = JSON.parse(event.data);\n\n const drizzleShim = drizzle(\n (_, __, method) => {\n if (method === \"all\") {\n return Promise.resolve({\n ...result,\n rows: result.rows.map((row: object) => Object.values(row)),\n });\n }\n\n return Promise.resolve(result);\n },\n { schema: params.schema },\n );\n\n let data: unknown;\n\n if (queryBuilder instanceof TypedQueryBuilder) {\n const fields = queryBuilder._.selectedFields as Record<\n string,\n unknown\n >;\n const orderedFields = orderSelectedFields(fields);\n\n data = await drizzleShim._.session\n .prepareQuery(\n query,\n // @ts-ignore\n orderedFields,\n undefined,\n false,\n )\n .execute();\n } else if (queryBuilder instanceof PgRelationalQuery) {\n // @ts-ignore\n const selection = queryBuilder._toSQL().query.selection;\n data = await drizzleShim._.session\n .prepareQuery(\n query,\n undefined,\n undefined,\n true,\n (rawRows, mapColumnValue) => {\n const rows = rawRows.map((row) =>\n mapRelationalRow(\n // @ts-ignore\n queryBuilder.schema,\n // @ts-ignore\n queryBuilder.tableConfig,\n // @ts-ignore\n row,\n selection,\n mapColumnValue,\n ),\n );\n // @ts-ignore\n if (queryBuilder.mode === \"first\") {\n return rows[0];\n }\n return rows;\n },\n )\n .execute();\n } else if (queryBuilder instanceof PgRaw) {\n data = await drizzleShim._.session\n .prepareQuery(query, undefined, undefined, false)\n .execute();\n } else if (queryBuilder instanceof PgCountBuilder) {\n data = await drizzleShim._.session.count(queryBuilder.getSQL());\n } else {\n throw new Error(\"Unsupported query builder\");\n }\n\n // @ts-ignore\n onData(data);\n } catch (error) {\n onError?.(error as Error);\n }\n };\n\n const onErrorListener = (_event: MessageEvent) => {\n onError?.(new Error(\"server disconnected\"));\n };\n\n sse.addEventListener(\"message\", onDataListener);\n sse.addEventListener(\"error\", onErrorListener);\n\n return {\n unsubscribe: () => {\n sse.removeEventListener(\"message\", onDataListener);\n sse.removeEventListener(\"error\", onErrorListener);\n sse.close();\n },\n };\n },\n getStatus: async () => {\n const response = await fetch(`${new URL(baseUrl).origin}/status`);\n\n return response.json();\n },\n };\n\n return client;\n};\n\nexport {\n sql,\n eq,\n gt,\n gte,\n lt,\n lte,\n ne,\n isNull,\n isNotNull,\n inArray,\n notInArray,\n exists,\n notExists,\n between,\n notBetween,\n like,\n notLike,\n ilike,\n notIlike,\n not,\n asc,\n desc,\n and,\n or,\n count,\n countDistinct,\n avg,\n avgDistinct,\n sum,\n sumDistinct,\n max,\n min,\n relations,\n SQL,\n} from \"drizzle-orm\";\n\nexport {\n alias,\n union,\n unionAll,\n intersect,\n intersectAll,\n except,\n exceptAll,\n} from \"drizzle-orm/pg-core\";\n\nexport const setDatabaseSchema = <T extends { [name: string]: unknown }>(\n schema: T,\n schemaName: string,\n) => {\n for (const table of Object.values(schema)) {\n if (isTable(table)) {\n // @ts-ignore\n table[Table.Symbol.Schema] = schemaName;\n } else if (isPgEnum(table)) {\n // @ts-ignore\n table.schema = schemaName;\n }\n }\n};\n\nfunction orderSelectedFields<TColumn extends AnyColumn>(\n fields: Record<string, unknown>,\n pathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n return Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>(\n (result, [name, field]) => {\n if (typeof name !== \"string\") {\n return result;\n }\n\n const newPath = pathPrefix ? [...pathPrefix, name] : [name];\n if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {\n result.push({ path: newPath, field });\n } else if (is(field, Table)) {\n result.push(\n // @ts-ignore\n ...orderSelectedFields(field[Table.Symbol.Columns], newPath),\n );\n } else {\n result.push(\n ...orderSelectedFields(field as Record<string, unknown>, newPath),\n );\n }\n return result;\n },\n [],\n ) as SelectedFieldsOrdered<TColumn>;\n}\n"],"mappings":"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","names":["SQL","sql","params","noopDatabase"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n type AnyColumn,\n Column,\n is,\n isTable,\n mapRelationalRow,\n type QueryWithTypings,\n type SelectedFieldsOrdered,\n SQL,\n type SQLWrapper,\n Table,\n} from \"drizzle-orm\";\nimport { isPgEnum, type PgDialect } from \"drizzle-orm/pg-core\";\nimport { PgCountBuilder } from \"drizzle-orm/pg-core/query-builders/count\";\nimport { PgRelationalQuery } from \"drizzle-orm/pg-core/query-builders/query\";\nimport { PgRaw } from \"drizzle-orm/pg-core/query-builders/raw\";\nimport { drizzle, type PgRemoteDatabase } from \"drizzle-orm/pg-proxy\";\nimport { TypedQueryBuilder } from \"drizzle-orm/query-builders/query-builder\";\nimport { EventSource } from \"eventsource\";\nimport superjson from \"superjson\";\n\ntype Schema = { [name: string]: unknown };\n\ntype Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\nexport type Status = {\n [chainName: string]: {\n id: number;\n block: { number: number; timestamp: number };\n };\n};\n\ntype ClientDb<schema extends Schema = Schema> = Prettify<\n Omit<\n PgRemoteDatabase<schema>,\n | \"insert\"\n | \"update\"\n | \"delete\"\n | \"transaction\"\n | \"refreshMaterializedView\"\n | \"_\"\n >\n>;\n\nexport type Client<schema extends Schema = Schema> = {\n /** Query the database. */\n db: ClientDb<schema>;\n /**\n * Subscribe to live updates.\n *\n * @param queryFn - The query to subscribe to.\n * @param onData - The callback to call with each new query result\n * @param onError - The callback to call when an error occurs.\n *\n * @example\n * ```ts\n * import { createClient } from \"@ponder/client\";\n * import * as schema from \"../ponder.schema\";\n *\n * const client = createClient(\"https://.../sql\", { schema });\n *\n * client.live(\n * (db) => db.select().from(schema.account),\n * (result) => console.log(result),\n * (error) => console.error(error),\n * );\n * ```\n */\n live: <result>(\n queryFn: (db: ClientDb<schema>) => Promise<result>,\n onData: (result: result) => void,\n onError?: (error: Error) => void,\n ) => {\n unsubscribe: () => void;\n };\n /** Get the status of all chains. */\n getStatus: () => Promise<Status>;\n};\n\nconst getUrl = (\n baseUrl: string,\n method: \"live\" | \"db\",\n query?: QueryWithTypings,\n) => {\n const url = new URL(baseUrl);\n url.pathname = `${url.pathname}/${method}`;\n if (query) {\n url.searchParams.set(\"sql\", superjson.stringify(query));\n }\n return url;\n};\n\nconst noopDatabase = drizzle(() => Promise.resolve({ rows: [] }), {\n casing: \"snake_case\",\n});\n\n// @ts-expect-error\nconst dialect: PgDialect = noopDatabase.dialect;\n\nexport const compileQuery = (query: SQLWrapper) => {\n return dialect.sqlToQuery(query.getSQL());\n};\n\n/**\n * Create a client for querying Ponder apps.\n *\n * @param baseUrl - The URL of the Ponder app.\n * @param schema - The schema of the Ponder app.\n *\n * @example\n * ```ts\n * import { createClient } from \"@ponder/client\";\n * import * as schema from \"../ponder.schema\";\n *\n * const client = createClient(\"https://.../sql\", { schema });\n * ```\n */\nexport const createClient = <schema extends Schema>(\n baseUrl: string,\n params: { schema?: schema } = {},\n): Client<schema> => {\n const client: Client<schema> = {\n db: drizzle(\n async (sql, params, method, typings) => {\n const builtQuery = { sql, params, typings };\n const response = await fetch(getUrl(baseUrl, \"db\", builtQuery), {\n method: \"GET\",\n });\n\n if (response.ok === false) {\n const error = new Error(await response.text());\n error.stack = undefined;\n throw error;\n }\n\n const result = await response.json();\n\n if (method === \"all\") {\n return {\n ...result,\n rows: result.rows.map((row: object) => Object.values(row)),\n };\n }\n\n return result;\n },\n { schema: params.schema, casing: \"snake_case\" },\n ),\n live: (queryFn, onData, onError) => {\n const noopDatabase = drizzle(() => Promise.resolve({ rows: [] }), {\n schema: params.schema,\n casing: \"snake_case\",\n });\n\n const queryPromise = queryFn(noopDatabase);\n\n if (\"getSQL\" in queryPromise === false) {\n throw new Error(\n '\"queryFn\" must return SQL. You may have to remove `.execute()` from your query.',\n );\n }\n const queryBuilder = queryPromise as unknown as SQLWrapper;\n const query = compileQuery(queryBuilder);\n\n const sse = new EventSource(getUrl(baseUrl, \"live\", query));\n\n const onDataListener = async (event: MessageEvent) => {\n try {\n const result = JSON.parse(event.data);\n\n const drizzleShim = drizzle(\n (_, __, method) => {\n if (method === \"all\") {\n return Promise.resolve({\n ...result,\n rows: result.rows.map((row: object) => Object.values(row)),\n });\n }\n\n return Promise.resolve(result);\n },\n { schema: params.schema },\n );\n\n let data: unknown;\n\n if (queryBuilder instanceof TypedQueryBuilder) {\n const fields = queryBuilder._.selectedFields as Record<\n string,\n unknown\n >;\n const orderedFields = orderSelectedFields(fields);\n\n data = await drizzleShim._.session\n .prepareQuery(\n query,\n // @ts-expect-error\n orderedFields,\n undefined,\n false,\n )\n .execute();\n } else if (queryBuilder instanceof PgRelationalQuery) {\n // @ts-expect-error\n const selection = queryBuilder._toSQL().query.selection;\n data = await drizzleShim._.session\n .prepareQuery(\n query,\n undefined,\n undefined,\n true,\n (rawRows, mapColumnValue) => {\n const rows = rawRows.map((row) =>\n mapRelationalRow(\n // @ts-expect-error\n queryBuilder.schema,\n // @ts-expect-error\n queryBuilder.tableConfig,\n row,\n selection,\n mapColumnValue,\n ),\n );\n // @ts-expect-error\n if (queryBuilder.mode === \"first\") {\n return rows[0];\n }\n return rows;\n },\n )\n .execute();\n } else if (queryBuilder instanceof PgRaw) {\n data = await drizzleShim._.session\n .prepareQuery(query, undefined, undefined, false)\n .execute();\n } else if (queryBuilder instanceof PgCountBuilder) {\n data = await drizzleShim._.session.count(queryBuilder.getSQL());\n } else {\n throw new Error(\"Unsupported query builder\");\n }\n\n // @ts-expect-error\n onData(data);\n } catch (error) {\n onError?.(error as Error);\n }\n };\n\n const onErrorListener = (_event: MessageEvent) => {\n onError?.(new Error(\"server disconnected\"));\n };\n\n sse.addEventListener(\"message\", onDataListener);\n sse.addEventListener(\"error\", onErrorListener);\n\n return {\n unsubscribe: () => {\n sse.removeEventListener(\"message\", onDataListener);\n sse.removeEventListener(\"error\", onErrorListener);\n sse.close();\n },\n };\n },\n getStatus: async () => {\n const response = await fetch(`${new URL(baseUrl).origin}/status`);\n\n return response.json();\n },\n };\n\n return client;\n};\n\nexport {\n and,\n asc,\n avg,\n avgDistinct,\n between,\n count,\n countDistinct,\n desc,\n eq,\n exists,\n gt,\n gte,\n ilike,\n inArray,\n isNotNull,\n isNull,\n like,\n lt,\n lte,\n max,\n min,\n ne,\n not,\n notBetween,\n notExists,\n notIlike,\n notInArray,\n notLike,\n or,\n relations,\n SQL,\n sql,\n sum,\n sumDistinct,\n} from \"drizzle-orm\";\n\nexport {\n alias,\n except,\n exceptAll,\n intersect,\n intersectAll,\n union,\n unionAll,\n} from \"drizzle-orm/pg-core\";\n\nexport const setDatabaseSchema = <T extends { [name: string]: unknown }>(\n schema: T,\n schemaName: string,\n) => {\n for (const table of Object.values(schema)) {\n if (isTable(table)) {\n // @ts-expect-error\n table[Table.Symbol.Schema] = schemaName;\n } else if (isPgEnum(table)) {\n // @ts-expect-error\n table.schema = schemaName;\n }\n }\n};\n\nfunction orderSelectedFields<TColumn extends AnyColumn>(\n fields: Record<string, unknown>,\n pathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n return Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>(\n (result, [name, field]) => {\n if (typeof name !== \"string\") {\n return result;\n }\n\n const newPath = pathPrefix ? [...pathPrefix, name] : [name];\n if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {\n result.push({ path: newPath, field });\n } else if (is(field, Table)) {\n result.push(\n // @ts-expect-error\n ...orderSelectedFields(field[Table.Symbol.Columns], newPath),\n );\n } else {\n result.push(\n ...orderSelectedFields(field as Record<string, unknown>, newPath),\n );\n }\n return result;\n },\n [],\n ) as SelectedFieldsOrdered<TColumn>;\n}\n"],"mappings":"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","names":["SQL","sql","params","noopDatabase"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ponder/client",
3
- "version": "0.16.10",
3
+ "version": "0.17.1",
4
4
  "description": "Client library for Ponder SQL over HTTP queries",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -30,7 +30,7 @@
30
30
  }
31
31
  },
32
32
  "peerDependencies": {
33
- "typescript": ">=5.0.4"
33
+ "typescript": ">=5.4.0"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "typescript": {
package/src/index.ts CHANGED
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  type AnyColumn,
3
3
  Column,
4
+ is,
5
+ isTable,
6
+ mapRelationalRow,
4
7
  type QueryWithTypings,
8
+ type SelectedFieldsOrdered,
5
9
  SQL,
6
10
  type SQLWrapper,
7
- type SelectedFieldsOrdered,
8
11
  Table,
9
- is,
10
- isTable,
11
- mapRelationalRow,
12
12
  } from "drizzle-orm";
13
- import { type PgDialect, isPgEnum } from "drizzle-orm/pg-core";
13
+ import { isPgEnum, type PgDialect } from "drizzle-orm/pg-core";
14
14
  import { PgCountBuilder } from "drizzle-orm/pg-core/query-builders/count";
15
15
  import { PgRelationalQuery } from "drizzle-orm/pg-core/query-builders/query";
16
16
  import { PgRaw } from "drizzle-orm/pg-core/query-builders/raw";
17
- import { type PgRemoteDatabase, drizzle } from "drizzle-orm/pg-proxy";
17
+ import { drizzle, type PgRemoteDatabase } from "drizzle-orm/pg-proxy";
18
18
  import { TypedQueryBuilder } from "drizzle-orm/query-builders/query-builder";
19
19
  import { EventSource } from "eventsource";
20
20
  import superjson from "superjson";
@@ -96,7 +96,7 @@ const noopDatabase = drizzle(() => Promise.resolve({ rows: [] }), {
96
96
  casing: "snake_case",
97
97
  });
98
98
 
99
- // @ts-ignore
99
+ // @ts-expect-error
100
100
  const dialect: PgDialect = noopDatabase.dialect;
101
101
 
102
102
  export const compileQuery = (query: SQLWrapper) => {
@@ -168,7 +168,6 @@ export const createClient = <schema extends Schema>(
168
168
 
169
169
  const onDataListener = async (event: MessageEvent) => {
170
170
  try {
171
- // @ts-ignore
172
171
  const result = JSON.parse(event.data);
173
172
 
174
173
  const drizzleShim = drizzle(
@@ -197,14 +196,14 @@ export const createClient = <schema extends Schema>(
197
196
  data = await drizzleShim._.session
198
197
  .prepareQuery(
199
198
  query,
200
- // @ts-ignore
199
+ // @ts-expect-error
201
200
  orderedFields,
202
201
  undefined,
203
202
  false,
204
203
  )
205
204
  .execute();
206
205
  } else if (queryBuilder instanceof PgRelationalQuery) {
207
- // @ts-ignore
206
+ // @ts-expect-error
208
207
  const selection = queryBuilder._toSQL().query.selection;
209
208
  data = await drizzleShim._.session
210
209
  .prepareQuery(
@@ -215,17 +214,16 @@ export const createClient = <schema extends Schema>(
215
214
  (rawRows, mapColumnValue) => {
216
215
  const rows = rawRows.map((row) =>
217
216
  mapRelationalRow(
218
- // @ts-ignore
217
+ // @ts-expect-error
219
218
  queryBuilder.schema,
220
- // @ts-ignore
219
+ // @ts-expect-error
221
220
  queryBuilder.tableConfig,
222
- // @ts-ignore
223
221
  row,
224
222
  selection,
225
223
  mapColumnValue,
226
224
  ),
227
225
  );
228
- // @ts-ignore
226
+ // @ts-expect-error
229
227
  if (queryBuilder.mode === "first") {
230
228
  return rows[0];
231
229
  }
@@ -243,7 +241,7 @@ export const createClient = <schema extends Schema>(
243
241
  throw new Error("Unsupported query builder");
244
242
  }
245
243
 
246
- // @ts-ignore
244
+ // @ts-expect-error
247
245
  onData(data);
248
246
  } catch (error) {
249
247
  onError?.(error as Error);
@@ -276,50 +274,50 @@ export const createClient = <schema extends Schema>(
276
274
  };
277
275
 
278
276
  export {
279
- sql,
277
+ and,
278
+ asc,
279
+ avg,
280
+ avgDistinct,
281
+ between,
282
+ count,
283
+ countDistinct,
284
+ desc,
280
285
  eq,
286
+ exists,
281
287
  gt,
282
288
  gte,
289
+ ilike,
290
+ inArray,
291
+ isNotNull,
292
+ isNull,
293
+ like,
283
294
  lt,
284
295
  lte,
296
+ max,
297
+ min,
285
298
  ne,
286
- isNull,
287
- isNotNull,
288
- inArray,
289
- notInArray,
290
- exists,
291
- notExists,
292
- between,
299
+ not,
293
300
  notBetween,
294
- like,
295
- notLike,
296
- ilike,
301
+ notExists,
297
302
  notIlike,
298
- not,
299
- asc,
300
- desc,
301
- and,
303
+ notInArray,
304
+ notLike,
302
305
  or,
303
- count,
304
- countDistinct,
305
- avg,
306
- avgDistinct,
307
- sum,
308
- sumDistinct,
309
- max,
310
- min,
311
306
  relations,
312
307
  SQL,
308
+ sql,
309
+ sum,
310
+ sumDistinct,
313
311
  } from "drizzle-orm";
314
312
 
315
313
  export {
316
314
  alias,
317
- union,
318
- unionAll,
319
- intersect,
320
- intersectAll,
321
315
  except,
322
316
  exceptAll,
317
+ intersect,
318
+ intersectAll,
319
+ union,
320
+ unionAll,
323
321
  } from "drizzle-orm/pg-core";
324
322
 
325
323
  export const setDatabaseSchema = <T extends { [name: string]: unknown }>(
@@ -328,10 +326,10 @@ export const setDatabaseSchema = <T extends { [name: string]: unknown }>(
328
326
  ) => {
329
327
  for (const table of Object.values(schema)) {
330
328
  if (isTable(table)) {
331
- // @ts-ignore
329
+ // @ts-expect-error
332
330
  table[Table.Symbol.Schema] = schemaName;
333
331
  } else if (isPgEnum(table)) {
334
- // @ts-ignore
332
+ // @ts-expect-error
335
333
  table.schema = schemaName;
336
334
  }
337
335
  }
@@ -352,7 +350,7 @@ function orderSelectedFields<TColumn extends AnyColumn>(
352
350
  result.push({ path: newPath, field });
353
351
  } else if (is(field, Table)) {
354
352
  result.push(
355
- // @ts-ignore
353
+ // @ts-expect-error
356
354
  ...orderSelectedFields(field[Table.Symbol.Columns], newPath),
357
355
  );
358
356
  } else {