@ponder/client 0.14.7 → 0.14.8
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.js +8 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +9 -5
package/dist/index.js
CHANGED
|
@@ -72,7 +72,7 @@ var createClient = (baseUrl, params = {}) => {
|
|
|
72
72
|
let liveCount = 0;
|
|
73
73
|
const client = {
|
|
74
74
|
db: drizzle(
|
|
75
|
-
async (sql2, params2,
|
|
75
|
+
async (sql2, params2, method, typings) => {
|
|
76
76
|
const builtQuery = { sql: sql2, params: params2, typings };
|
|
77
77
|
const response = await fetch(getUrl(baseUrl, "db", builtQuery), {
|
|
78
78
|
method: "POST"
|
|
@@ -83,10 +83,13 @@ var createClient = (baseUrl, params = {}) => {
|
|
|
83
83
|
throw error;
|
|
84
84
|
}
|
|
85
85
|
const result = await response.json();
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
if (method === "all") {
|
|
87
|
+
return {
|
|
88
|
+
...result,
|
|
89
|
+
rows: result.rows.map((row) => Object.values(row))
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
90
93
|
},
|
|
91
94
|
{ schema: params.schema, casing: "snake_case" }
|
|
92
95
|
),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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\",\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,
|
|
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\",\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, method, 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 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 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(`${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"],"mappings":"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","names":["sql","params"]}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -116,7 +116,7 @@ export const createClient = <schema extends Schema>(
|
|
|
116
116
|
|
|
117
117
|
const client: Client<schema> = {
|
|
118
118
|
db: drizzle(
|
|
119
|
-
async (sql, params,
|
|
119
|
+
async (sql, params, method, typings) => {
|
|
120
120
|
const builtQuery = { sql, params, typings };
|
|
121
121
|
const response = await fetch(getUrl(baseUrl, "db", builtQuery), {
|
|
122
122
|
method: "POST",
|
|
@@ -130,10 +130,14 @@ export const createClient = <schema extends Schema>(
|
|
|
130
130
|
|
|
131
131
|
const result = await response.json();
|
|
132
132
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
133
|
+
if (method === "all") {
|
|
134
|
+
return {
|
|
135
|
+
...result,
|
|
136
|
+
rows: result.rows.map((row: object) => Object.values(row)),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return result;
|
|
137
141
|
},
|
|
138
142
|
{ schema: params.schema, casing: "snake_case" },
|
|
139
143
|
),
|