@ponder/client 0.11.25 → 0.11.27
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 +7 -3
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +24 -4
package/dist/index.d.ts
CHANGED
|
@@ -64,8 +64,12 @@ declare const compileQuery: (query: SQLWrapper) => QueryWithTypings;
|
|
|
64
64
|
* const client = createClient("https://.../sql", { schema });
|
|
65
65
|
* ```
|
|
66
66
|
*/
|
|
67
|
-
declare const createClient: <schema extends Schema>(baseUrl: string,
|
|
68
|
-
schema
|
|
67
|
+
declare const createClient: <schema extends Schema>(baseUrl: string, params?: {
|
|
68
|
+
schema?: schema | undefined;
|
|
69
69
|
}) => Client<schema>;
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
declare const setDatabaseSchema: <T extends {
|
|
72
|
+
[name: string]: unknown;
|
|
73
|
+
}>(schema: T, schemaName: string) => void;
|
|
74
|
+
|
|
75
|
+
export { type Client, type Status, compileQuery, createClient, setDatabaseSchema };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
|
+
import {
|
|
3
|
+
Table,
|
|
4
|
+
isTable
|
|
5
|
+
} from "drizzle-orm";
|
|
6
|
+
import { isPgEnum } from "drizzle-orm/pg-core";
|
|
2
7
|
import { drizzle } from "drizzle-orm/pg-proxy";
|
|
3
8
|
import { EventSource } from "eventsource";
|
|
4
9
|
import superjson from "superjson";
|
|
@@ -61,13 +66,13 @@ var dialect = noopDatabase.dialect;
|
|
|
61
66
|
var compileQuery = (query) => {
|
|
62
67
|
return dialect.sqlToQuery(query.getSQL());
|
|
63
68
|
};
|
|
64
|
-
var createClient = (baseUrl,
|
|
69
|
+
var createClient = (baseUrl, params = {}) => {
|
|
65
70
|
let sse;
|
|
66
71
|
let liveCount = 0;
|
|
67
72
|
const client = {
|
|
68
73
|
db: drizzle(
|
|
69
|
-
async (sql2,
|
|
70
|
-
const builtQuery = { sql: sql2, params, typings };
|
|
74
|
+
async (sql2, params2, _, typings) => {
|
|
75
|
+
const builtQuery = { sql: sql2, params: params2, typings };
|
|
71
76
|
const response = await fetch(getUrl(baseUrl, "db", builtQuery), {
|
|
72
77
|
method: "POST"
|
|
73
78
|
});
|
|
@@ -82,7 +87,7 @@ var createClient = (baseUrl, { schema }) => {
|
|
|
82
87
|
rows: result.rows.map((row) => Object.values(row))
|
|
83
88
|
};
|
|
84
89
|
},
|
|
85
|
-
{ schema, casing: "snake_case" }
|
|
90
|
+
{ schema: params.schema, casing: "snake_case" }
|
|
86
91
|
),
|
|
87
92
|
live: (queryFn, onData, onError) => {
|
|
88
93
|
if (sse === void 0) {
|
|
@@ -118,6 +123,15 @@ var createClient = (baseUrl, { schema }) => {
|
|
|
118
123
|
};
|
|
119
124
|
return client;
|
|
120
125
|
};
|
|
126
|
+
var setDatabaseSchema = (schema, schemaName) => {
|
|
127
|
+
for (const table of Object.values(schema)) {
|
|
128
|
+
if (isTable(table)) {
|
|
129
|
+
table[Table.Symbol.Schema] = schemaName;
|
|
130
|
+
} else if (isPgEnum(table)) {
|
|
131
|
+
table.schema = schemaName;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
121
135
|
export {
|
|
122
136
|
alias,
|
|
123
137
|
and,
|
|
@@ -156,6 +170,7 @@ export {
|
|
|
156
170
|
notLike,
|
|
157
171
|
or,
|
|
158
172
|
relations,
|
|
173
|
+
setDatabaseSchema,
|
|
159
174
|
sql,
|
|
160
175
|
sum,
|
|
161
176
|
sumDistinct,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n type QueryWithTypings,\n type SQLWrapper,\n Table,\n isTable,\n} from \"drizzle-orm\";\nimport { type PgDialect, isPgEnum } from \"drizzle-orm/pg-core\";\nimport { type PgRemoteDatabase, drizzle } from \"drizzle-orm/pg-proxy\";\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\" | \"status\",\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 let sse: EventSource | undefined;\n let liveCount = 0;\n\n const client: Client<schema> = {\n db: drizzle(\n async (sql, params, _, typings) => {\n const builtQuery = { sql, params, typings };\n const response = await fetch(getUrl(baseUrl, \"db\", builtQuery), {\n method: \"POST\",\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 return {\n ...result,\n rows: result.rows.map((row: object) => Object.values(row)),\n };\n },\n { schema: params.schema, casing: \"snake_case\" },\n ),\n live: (queryFn, onData, onError) => {\n if (sse === undefined) {\n sse = new EventSource(getUrl(baseUrl, \"live\"));\n }\n\n const onDataListener = (_event: MessageEvent) => {\n queryFn(client.db).then(onData).catch(onError);\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 liveCount = liveCount + 1;\n\n return {\n unsubscribe: () => {\n sse?.removeEventListener(\"message\", onDataListener);\n sse?.removeEventListener(\"error\", onErrorListener);\n liveCount = liveCount - 1;\n if (liveCount === 0) {\n sse?.close();\n sse = undefined;\n }\n },\n };\n },\n getStatus: async () => {\n const response = await fetch(getUrl(baseUrl, \"status\"), {\n method: \"POST\",\n });\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} 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"],"mappings":"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","names":["sql","params"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ponder/client",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.27",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
"superjson": "^2.2.2"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"tsup": "^8.0.1"
|
|
43
|
+
"tsup": "^8.0.1",
|
|
44
|
+
"vitest": "^1.0.2"
|
|
44
45
|
},
|
|
45
46
|
"scripts": {
|
|
46
47
|
"build": "tsup",
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
type QueryWithTypings,
|
|
3
|
+
type SQLWrapper,
|
|
4
|
+
Table,
|
|
5
|
+
isTable,
|
|
6
|
+
} from "drizzle-orm";
|
|
7
|
+
import { type PgDialect, isPgEnum } from "drizzle-orm/pg-core";
|
|
3
8
|
import { type PgRemoteDatabase, drizzle } from "drizzle-orm/pg-proxy";
|
|
4
9
|
import { EventSource } from "eventsource";
|
|
5
10
|
import superjson from "superjson";
|
|
@@ -104,7 +109,7 @@ export const compileQuery = (query: SQLWrapper) => {
|
|
|
104
109
|
*/
|
|
105
110
|
export const createClient = <schema extends Schema>(
|
|
106
111
|
baseUrl: string,
|
|
107
|
-
|
|
112
|
+
params: { schema?: schema } = {},
|
|
108
113
|
): Client<schema> => {
|
|
109
114
|
let sse: EventSource | undefined;
|
|
110
115
|
let liveCount = 0;
|
|
@@ -130,7 +135,7 @@ export const createClient = <schema extends Schema>(
|
|
|
130
135
|
rows: result.rows.map((row: object) => Object.values(row)),
|
|
131
136
|
};
|
|
132
137
|
},
|
|
133
|
-
{ schema, casing: "snake_case" },
|
|
138
|
+
{ schema: params.schema, casing: "snake_case" },
|
|
134
139
|
),
|
|
135
140
|
live: (queryFn, onData, onError) => {
|
|
136
141
|
if (sse === undefined) {
|
|
@@ -218,3 +223,18 @@ export {
|
|
|
218
223
|
except,
|
|
219
224
|
exceptAll,
|
|
220
225
|
} from "drizzle-orm/pg-core";
|
|
226
|
+
|
|
227
|
+
export const setDatabaseSchema = <T extends { [name: string]: unknown }>(
|
|
228
|
+
schema: T,
|
|
229
|
+
schemaName: string,
|
|
230
|
+
) => {
|
|
231
|
+
for (const table of Object.values(schema)) {
|
|
232
|
+
if (isTable(table)) {
|
|
233
|
+
// @ts-ignore
|
|
234
|
+
table[Table.Symbol.Schema] = schemaName;
|
|
235
|
+
} else if (isPgEnum(table)) {
|
|
236
|
+
// @ts-ignore
|
|
237
|
+
table.schema = schemaName;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
};
|