ponder 0.11.21 → 0.11.22

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.
Files changed (123) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/esm/bin/commands/createViews.js +9 -20
  3. package/dist/esm/bin/commands/createViews.js.map +1 -1
  4. package/dist/esm/bin/commands/dev.js +1 -1
  5. package/dist/esm/bin/commands/dev.js.map +1 -1
  6. package/dist/esm/bin/commands/list.js +4 -7
  7. package/dist/esm/bin/commands/list.js.map +1 -1
  8. package/dist/esm/bin/commands/prune.js +9 -21
  9. package/dist/esm/bin/commands/prune.js.map +1 -1
  10. package/dist/esm/bin/commands/serve.js +1 -1
  11. package/dist/esm/bin/commands/serve.js.map +1 -1
  12. package/dist/esm/bin/commands/start.js +3 -3
  13. package/dist/esm/bin/commands/start.js.map +1 -1
  14. package/dist/esm/bin/utils/run.js +159 -180
  15. package/dist/esm/bin/utils/run.js.map +1 -1
  16. package/dist/esm/build/index.js +1 -48
  17. package/dist/esm/build/index.js.map +1 -1
  18. package/dist/esm/build/plugin.js +1 -1
  19. package/dist/esm/client/index.js +9 -13
  20. package/dist/esm/client/index.js.map +1 -1
  21. package/dist/esm/database/index.js +429 -141
  22. package/dist/esm/database/index.js.map +1 -1
  23. package/dist/esm/drizzle/index.js.map +1 -1
  24. package/dist/esm/drizzle/kit/index.js.map +1 -1
  25. package/dist/esm/drizzle/onchain.js +1 -8
  26. package/dist/esm/drizzle/onchain.js.map +1 -1
  27. package/dist/esm/graphql/index.js +16 -19
  28. package/dist/esm/graphql/index.js.map +1 -1
  29. package/dist/esm/graphql/middleware.js +7 -3
  30. package/dist/esm/graphql/middleware.js.map +1 -1
  31. package/dist/esm/indexing-store/cache.js +32 -26
  32. package/dist/esm/indexing-store/cache.js.map +1 -1
  33. package/dist/esm/indexing-store/historical.js +32 -23
  34. package/dist/esm/indexing-store/historical.js.map +1 -1
  35. package/dist/esm/indexing-store/index.js +18 -1
  36. package/dist/esm/indexing-store/index.js.map +1 -1
  37. package/dist/esm/indexing-store/realtime.js +140 -89
  38. package/dist/esm/indexing-store/realtime.js.map +1 -1
  39. package/dist/esm/internal/errors.js +0 -12
  40. package/dist/esm/internal/errors.js.map +1 -1
  41. package/dist/esm/server/index.js +2 -10
  42. package/dist/esm/server/index.js.map +1 -1
  43. package/dist/esm/sync-store/index.js +432 -403
  44. package/dist/esm/sync-store/index.js.map +1 -1
  45. package/dist/esm/utils/wait.js +0 -2
  46. package/dist/esm/utils/wait.js.map +1 -1
  47. package/dist/types/bin/commands/createViews.d.ts.map +1 -1
  48. package/dist/types/bin/commands/list.d.ts.map +1 -1
  49. package/dist/types/bin/commands/prune.d.ts.map +1 -1
  50. package/dist/types/bin/commands/start.d.ts +0 -2
  51. package/dist/types/bin/commands/start.d.ts.map +1 -1
  52. package/dist/types/bin/utils/run.d.ts +1 -1
  53. package/dist/types/bin/utils/run.d.ts.map +1 -1
  54. package/dist/types/build/index.d.ts +1 -1
  55. package/dist/types/build/index.d.ts.map +1 -1
  56. package/dist/types/client/index.d.ts.map +1 -1
  57. package/dist/types/database/index.d.ts +73 -25
  58. package/dist/types/database/index.d.ts.map +1 -1
  59. package/dist/types/drizzle/index.d.ts +3 -2
  60. package/dist/types/drizzle/index.d.ts.map +1 -1
  61. package/dist/types/drizzle/kit/index.d.ts +4 -3
  62. package/dist/types/drizzle/kit/index.d.ts.map +1 -1
  63. package/dist/types/drizzle/onchain.d.ts +5 -12
  64. package/dist/types/drizzle/onchain.d.ts.map +1 -1
  65. package/dist/types/graphql/index.d.ts +4 -2
  66. package/dist/types/graphql/index.d.ts.map +1 -1
  67. package/dist/types/graphql/middleware.d.ts +1 -1
  68. package/dist/types/graphql/middleware.d.ts.map +1 -1
  69. package/dist/types/indexing-store/cache.d.ts +12 -5
  70. package/dist/types/indexing-store/cache.d.ts.map +1 -1
  71. package/dist/types/indexing-store/historical.d.ts +7 -2
  72. package/dist/types/indexing-store/historical.d.ts.map +1 -1
  73. package/dist/types/indexing-store/index.d.ts +2 -4
  74. package/dist/types/indexing-store/index.d.ts.map +1 -1
  75. package/dist/types/indexing-store/realtime.d.ts +3 -1
  76. package/dist/types/indexing-store/realtime.d.ts.map +1 -1
  77. package/dist/types/internal/errors.d.ts +0 -4
  78. package/dist/types/internal/errors.d.ts.map +1 -1
  79. package/dist/types/server/index.d.ts +1 -1
  80. package/dist/types/server/index.d.ts.map +1 -1
  81. package/dist/types/sync/index.d.ts +1 -1
  82. package/dist/types/sync-store/index.d.ts.map +1 -1
  83. package/dist/types/utils/wait.d.ts.map +1 -1
  84. package/package.json +2 -2
  85. package/src/bin/commands/createViews.ts +26 -37
  86. package/src/bin/commands/dev.ts +1 -1
  87. package/src/bin/commands/list.ts +4 -7
  88. package/src/bin/commands/prune.ts +17 -31
  89. package/src/bin/commands/serve.ts +1 -1
  90. package/src/bin/commands/start.ts +3 -4
  91. package/src/bin/utils/run.ts +210 -256
  92. package/src/build/index.ts +2 -53
  93. package/src/build/plugin.ts +1 -1
  94. package/src/client/index.ts +10 -21
  95. package/src/database/index.ts +742 -331
  96. package/src/drizzle/index.ts +3 -2
  97. package/src/drizzle/kit/index.ts +5 -2
  98. package/src/drizzle/onchain.ts +2 -26
  99. package/src/graphql/index.ts +26 -31
  100. package/src/graphql/middleware.ts +7 -5
  101. package/src/indexing-store/cache.ts +52 -35
  102. package/src/indexing-store/historical.ts +40 -28
  103. package/src/indexing-store/index.ts +27 -2
  104. package/src/indexing-store/realtime.ts +220 -176
  105. package/src/internal/errors.ts +0 -9
  106. package/src/server/index.ts +3 -14
  107. package/src/sync-store/index.ts +997 -870
  108. package/src/utils/wait.ts +0 -1
  109. package/dist/esm/database/queryBuilder.js +0 -206
  110. package/dist/esm/database/queryBuilder.js.map +0 -1
  111. package/dist/esm/database/utils.js +0 -100
  112. package/dist/esm/database/utils.js.map +0 -1
  113. package/dist/esm/drizzle/json.js +0 -119
  114. package/dist/esm/drizzle/json.js.map +0 -1
  115. package/dist/types/database/queryBuilder.d.ts +0 -37
  116. package/dist/types/database/queryBuilder.d.ts.map +0 -1
  117. package/dist/types/database/utils.d.ts +0 -25
  118. package/dist/types/database/utils.d.ts.map +0 -1
  119. package/dist/types/drizzle/json.d.ts +0 -51
  120. package/dist/types/drizzle/json.d.ts.map +0 -1
  121. package/src/database/queryBuilder.ts +0 -319
  122. package/src/database/utils.ts +0 -140
  123. package/src/drizzle/json.ts +0 -154
@@ -1,16 +1,19 @@
1
1
  import { findTableNames, validateQuery } from "@/client/parse.js";
2
- import type { QB } from "@/database/queryBuilder.js";
3
2
  import type { Common } from "@/internal/common.js";
4
3
  import { RecordNotFoundError } from "@/internal/errors.js";
5
- import type { SchemaBuild } from "@/internal/types.js";
4
+ import type { Schema, SchemaBuild } from "@/internal/types.js";
5
+ import type { Drizzle } from "@/types/db.js";
6
6
  import { prettyPrint } from "@/utils/print.js";
7
7
  import { startClock } from "@/utils/timer.js";
8
+ import type { PGlite } from "@electric-sql/pglite";
8
9
  import { type QueryWithTypings, type Table, getTableName } from "drizzle-orm";
9
10
  import { drizzle } from "drizzle-orm/pg-proxy";
11
+ import type { PoolClient } from "pg";
10
12
  import type { IndexingCache } from "./cache.js";
11
13
  import {
12
14
  type IndexingStore,
13
15
  checkOnchainTable,
16
+ parseSqlError,
14
17
  validateUpdateSet,
15
18
  } from "./index.js";
16
19
 
@@ -18,22 +21,26 @@ export const createHistoricalIndexingStore = ({
18
21
  common,
19
22
  schemaBuild: { schema },
20
23
  indexingCache,
24
+ db,
25
+ client,
21
26
  }: {
22
27
  common: Common;
23
28
  schemaBuild: Pick<SchemaBuild, "schema">;
24
29
  indexingCache: IndexingCache;
30
+ db: Drizzle<Schema>;
31
+ client: PoolClient | PGlite;
25
32
  }): IndexingStore => {
26
- let qb: QB = undefined!;
27
33
  return {
28
34
  // @ts-ignore
29
- find: async (table: Table, key) => {
35
+ find: (table: Table, key) => {
30
36
  common.metrics.ponder_indexing_store_queries_total.inc({
31
37
  table: getTableName(table),
32
38
  method: "find",
33
39
  });
34
40
  checkOnchainTable(table, "find");
35
- return indexingCache.get({ table, key });
41
+ return indexingCache.get({ table, key, db });
36
42
  },
43
+
37
44
  // @ts-ignore
38
45
  insert(table: Table) {
39
46
  return {
@@ -50,7 +57,11 @@ export const createHistoricalIndexingStore = ({
50
57
  if (Array.isArray(values)) {
51
58
  const rows = [];
52
59
  for (const value of values) {
53
- const row = await indexingCache.get({ table, key: value });
60
+ const row = await indexingCache.get({
61
+ table,
62
+ key: value,
63
+ db,
64
+ });
54
65
 
55
66
  if (row) {
56
67
  rows.push(null);
@@ -67,7 +78,11 @@ export const createHistoricalIndexingStore = ({
67
78
  }
68
79
  return rows;
69
80
  } else {
70
- const row = await indexingCache.get({ table, key: values });
81
+ const row = await indexingCache.get({
82
+ table,
83
+ key: values,
84
+ db,
85
+ });
71
86
 
72
87
  if (row) {
73
88
  return null;
@@ -91,7 +106,11 @@ export const createHistoricalIndexingStore = ({
91
106
  if (Array.isArray(values)) {
92
107
  const rows = [];
93
108
  for (const value of values) {
94
- const row = await indexingCache.get({ table, key: value });
109
+ const row = await indexingCache.get({
110
+ table,
111
+ key: value,
112
+ db,
113
+ });
95
114
 
96
115
  if (row) {
97
116
  if (typeof valuesU === "function") {
@@ -128,7 +147,7 @@ export const createHistoricalIndexingStore = ({
128
147
  }
129
148
  return rows;
130
149
  } else {
131
- const row = await indexingCache.get({ table, key: values });
150
+ const row = await indexingCache.get({ table, key: values, db });
132
151
 
133
152
  if (row) {
134
153
  if (typeof valuesU === "function") {
@@ -226,7 +245,7 @@ export const createHistoricalIndexingStore = ({
226
245
  });
227
246
  checkOnchainTable(table, "update");
228
247
 
229
- const row = await indexingCache.get({ table, key });
248
+ const row = await indexingCache.get({ table, key, db });
230
249
 
231
250
  if (row === null) {
232
251
  const error = new RecordNotFoundError(
@@ -261,7 +280,7 @@ export const createHistoricalIndexingStore = ({
261
280
  method: "delete",
262
281
  });
263
282
  checkOnchainTable(table, "delete");
264
- return indexingCache.delete({ table, key });
283
+ return indexingCache.delete({ table, key, db });
265
284
  },
266
285
  // @ts-ignore
267
286
  sql: drizzle(
@@ -273,7 +292,7 @@ export const createHistoricalIndexingStore = ({
273
292
  } catch {}
274
293
 
275
294
  if (isSelectOnly === false) {
276
- await indexingCache.flush();
295
+ await indexingCache.flush({ client });
277
296
  indexingCache.invalidate();
278
297
  indexingCache.clear();
279
298
  } else {
@@ -284,25 +303,21 @@ export const createHistoricalIndexingStore = ({
284
303
  tableNames = await findTableNames(_sql);
285
304
  } catch {}
286
305
 
287
- await indexingCache.flush({ tableNames });
306
+ await indexingCache.flush({ client, tableNames });
288
307
  }
289
308
 
290
309
  const query: QueryWithTypings = { sql: _sql, params, typings };
291
310
  const endClock = startClock();
292
311
 
293
312
  try {
294
- return await qb().transaction(async (tx) => {
295
- const result = await tx()
296
- ._.session.prepareQuery(
297
- query,
298
- undefined,
299
- undefined,
300
- method === "all",
301
- )
302
- .execute();
303
- // @ts-ignore
304
- return { rows: result.rows.map((row) => Object.values(row)) };
305
- });
313
+ const result = await db._.session
314
+ .prepareQuery(query, undefined, undefined, method === "all")
315
+ .execute();
316
+
317
+ // @ts-ignore
318
+ return { rows: result.rows.map((row) => Object.values(row)) };
319
+ } catch (error) {
320
+ throw parseSqlError(error);
306
321
  } finally {
307
322
  common.metrics.ponder_indexing_store_raw_sql_duration.observe(
308
323
  endClock(),
@@ -311,8 +326,5 @@ export const createHistoricalIndexingStore = ({
311
326
  },
312
327
  { schema, casing: "snake_case" },
313
328
  ),
314
- set qb(_qb: QB) {
315
- qb = _qb;
316
- },
317
329
  };
318
330
  };
@@ -1,17 +1,42 @@
1
- import type { QB } from "@/database/queryBuilder.js";
2
1
  import { getPrimaryKeyColumns } from "@/drizzle/index.js";
3
2
  import { onchain } from "@/drizzle/onchain.js";
4
3
  import {
4
+ BigIntSerializationError,
5
+ CheckConstraintError,
5
6
  InvalidStoreMethodError,
6
7
  NonRetryableError,
8
+ NotNullConstraintError,
7
9
  UndefinedTableError,
10
+ UniqueConstraintError,
11
+ getBaseError,
8
12
  } from "@/internal/errors.js";
9
13
  import type { Schema } from "@/internal/types.js";
10
14
  import type { Db } from "@/types/db.js";
11
15
  import type { Table } from "drizzle-orm";
12
16
  import { getTableConfig } from "drizzle-orm/pg-core";
13
17
 
14
- export type IndexingStore = Db<Schema> & { qb: QB };
18
+ export type IndexingStore = Db<Schema>;
19
+
20
+ export const parseSqlError = (e: any): Error => {
21
+ let error = getBaseError(e);
22
+
23
+ if (error?.message?.includes("violates not-null constraint")) {
24
+ error = new NotNullConstraintError(error.message);
25
+ } else if (error?.message?.includes("violates unique constraint")) {
26
+ error = new UniqueConstraintError(error.message);
27
+ } else if (error?.message?.includes("violates check constraint")) {
28
+ error = new CheckConstraintError(error.message);
29
+ } else if (
30
+ error?.message?.includes("Do not know how to serialize a BigInt")
31
+ ) {
32
+ error = new BigIntSerializationError(error.message);
33
+ error.meta.push(
34
+ "Hint:\n The JSON column type does not support BigInt values. Use the replaceBigInts() helper function before inserting into the database. Docs: https://ponder.sh/docs/api-reference/ponder-utils#replacebigints",
35
+ );
36
+ }
37
+
38
+ return error;
39
+ };
15
40
 
16
41
  export const validateUpdateSet = (table: Table, set: Object): Object => {
17
42
  const primaryKeys = getPrimaryKeyColumns(table);