@ponder/client 0.16.10 → 0.17.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.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +34 -35
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +43 -45
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
|
|
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
|
-
|
|
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
|
-
|
|
27
|
-
isNotNull,
|
|
28
|
-
inArray,
|
|
29
|
-
notInArray,
|
|
30
|
-
exists,
|
|
31
|
-
notExists,
|
|
32
|
-
between,
|
|
41
|
+
not,
|
|
33
42
|
notBetween,
|
|
34
|
-
|
|
35
|
-
notLike,
|
|
36
|
-
ilike,
|
|
43
|
+
notExists,
|
|
37
44
|
notIlike,
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
57
|
-
|
|
56
|
+
except,
|
|
57
|
+
exceptAll,
|
|
58
58
|
intersect,
|
|
59
59
|
intersectAll,
|
|
60
|
-
|
|
61
|
-
|
|
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-
|
|
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-
|
|
152
|
+
// @ts-expect-error
|
|
153
153
|
queryBuilder.schema,
|
|
154
|
-
// @ts-
|
|
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.
|
|
3
|
+
"version": "0.17.0",
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
217
|
+
// @ts-expect-error
|
|
219
218
|
queryBuilder.schema,
|
|
220
|
-
// @ts-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
287
|
-
isNotNull,
|
|
288
|
-
inArray,
|
|
289
|
-
notInArray,
|
|
290
|
-
exists,
|
|
291
|
-
notExists,
|
|
292
|
-
between,
|
|
299
|
+
not,
|
|
293
300
|
notBetween,
|
|
294
|
-
|
|
295
|
-
notLike,
|
|
296
|
-
ilike,
|
|
301
|
+
notExists,
|
|
297
302
|
notIlike,
|
|
298
|
-
|
|
299
|
-
|
|
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-
|
|
329
|
+
// @ts-expect-error
|
|
332
330
|
table[Table.Symbol.Schema] = schemaName;
|
|
333
331
|
} else if (isPgEnum(table)) {
|
|
334
|
-
// @ts-
|
|
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-
|
|
353
|
+
// @ts-expect-error
|
|
356
354
|
...orderSelectedFields(field[Table.Symbol.Columns], newPath),
|
|
357
355
|
);
|
|
358
356
|
} else {
|