@supabase/pg-delta 1.0.0-alpha.25 → 1.0.0-alpha.26

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 (45) hide show
  1. package/dist/core/catalog.model.js +2 -0
  2. package/dist/core/expand-replace-dependencies.js +1 -7
  3. package/dist/core/objects/table/table.diff.js +53 -30
  4. package/dist/core/plan/hierarchy.js +4 -4
  5. package/dist/core/postgres-config.d.ts +7 -0
  6. package/dist/core/postgres-config.js +19 -5
  7. package/dist/core/sort/debug-visualization.js +1 -1
  8. package/dist/core/sort/topological-sort.js +2 -2
  9. package/package.json +34 -33
  10. package/src/core/catalog.model.ts +4 -3
  11. package/src/core/catalog.snapshot.test.ts +1 -0
  12. package/src/core/expand-replace-dependencies.test.ts +12 -0
  13. package/src/core/expand-replace-dependencies.ts +1 -12
  14. package/src/core/objects/aggregate/changes/aggregate.base.ts +1 -1
  15. package/src/core/objects/collation/changes/collation.base.ts +1 -1
  16. package/src/core/objects/domain/changes/domain.base.ts +1 -1
  17. package/src/core/objects/extension/changes/extension.base.ts +1 -1
  18. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +1 -1
  19. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +1 -1
  20. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +1 -1
  21. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +1 -1
  22. package/src/core/objects/index/changes/index.base.ts +1 -1
  23. package/src/core/objects/language/changes/language.base.ts +1 -1
  24. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +1 -1
  25. package/src/core/objects/procedure/changes/procedure.base.ts +1 -1
  26. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +1 -1
  27. package/src/core/objects/role/changes/role.base.ts +1 -1
  28. package/src/core/objects/schema/changes/schema.base.ts +1 -1
  29. package/src/core/objects/sequence/changes/sequence.base.ts +1 -1
  30. package/src/core/objects/table/changes/table.base.ts +1 -1
  31. package/src/core/objects/table/changes/table.comment.ts +2 -8
  32. package/src/core/objects/table/table.diff.test.ts +198 -5
  33. package/src/core/objects/table/table.diff.ts +63 -34
  34. package/src/core/objects/trigger/changes/trigger.alter.ts +1 -4
  35. package/src/core/objects/trigger/changes/trigger.base.ts +1 -1
  36. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +1 -1
  37. package/src/core/objects/type/enum/changes/enum.base.ts +1 -1
  38. package/src/core/objects/type/range/changes/range.base.ts +1 -1
  39. package/src/core/objects/view/changes/view.base.ts +1 -1
  40. package/src/core/plan/hierarchy.ts +4 -4
  41. package/src/core/postgres-config.test.ts +39 -1
  42. package/src/core/postgres-config.ts +32 -16
  43. package/src/core/sort/debug-visualization.ts +1 -1
  44. package/src/core/sort/sort-changes.test.ts +1 -0
  45. package/src/core/sort/topological-sort.ts +2 -2
@@ -209,6 +209,37 @@ export async function connectWithRetry<T>(opts: {
209
209
  throw lastError;
210
210
  }
211
211
 
212
+ /**
213
+ * Race `connect()` against a `timeoutMs` rejection and clear the timer when
214
+ * either side wins. If the timer is left running after a fast connect, the
215
+ * pending `setTimeout` keeps the event loop alive and the process hangs for
216
+ * the rest of `timeoutMs`.
217
+ */
218
+ export function connectWithTimeout<T>(
219
+ connect: () => Promise<T>,
220
+ timeoutMs: number,
221
+ label: "source" | "target",
222
+ ): Promise<T> {
223
+ let timer: ReturnType<typeof setTimeout>;
224
+ return Promise.race([
225
+ connect(),
226
+ new Promise<never>((_, reject) => {
227
+ timer = setTimeout(
228
+ () =>
229
+ reject(
230
+ new Error(
231
+ `Connection to ${label} database timed out after ${timeoutMs}ms. ` +
232
+ `The server may require SSL, use an invalid certificate, or be unreachable.`,
233
+ ),
234
+ ),
235
+ timeoutMs,
236
+ );
237
+ }),
238
+ ]).finally(() => {
239
+ clearTimeout(timer);
240
+ });
241
+ }
242
+
212
243
  /**
213
244
  * Options for creating a Pool with event listeners.
214
245
  */
@@ -412,22 +443,7 @@ export async function createManagedPool(
412
443
  const timeoutMs = DEFAULT_CONNECT_TIMEOUT_MS;
413
444
  try {
414
445
  const client = await connectWithRetry({
415
- connect: () =>
416
- Promise.race([
417
- pool.connect(),
418
- new Promise<never>((_, reject) =>
419
- setTimeout(
420
- () =>
421
- reject(
422
- new Error(
423
- `Connection to ${label} database timed out after ${timeoutMs}ms. ` +
424
- `The server may require SSL, use an invalid certificate, or be unreachable.`,
425
- ),
426
- ),
427
- timeoutMs,
428
- ),
429
- ),
430
- ]),
446
+ connect: () => connectWithTimeout(() => pool.connect(), timeoutMs, label),
431
447
  });
432
448
  client.release();
433
449
  } catch (err) {
@@ -233,7 +233,7 @@ export function printDebugGraph(
233
233
  "\n==== Mermaid (cycle detected) ====\n%s\n==== end ====",
234
234
  mermaidDiagram,
235
235
  );
236
- } catch (_error) {
236
+ } catch {
237
237
  // ignore debug printing errors
238
238
  }
239
239
  }
@@ -144,6 +144,7 @@ function table(
144
144
 
145
145
  async function catalogWithDepends(depends: PgDepend[]) {
146
146
  const base = await createEmptyCatalog(170000, "postgres");
147
+ // oxlint-disable-next-line typescript/no-misused-spread
147
148
  return new Catalog({ ...base, depends });
148
149
  }
149
150
 
@@ -14,7 +14,7 @@ export function performStableTopologicalSort(
14
14
  { length: nodeCount },
15
15
  () => new Set<number>(),
16
16
  );
17
- const inDegreeCounts = new Array<number>(nodeCount).fill(0);
17
+ const inDegreeCounts: number[] = Array.from({ length: nodeCount }, () => 0);
18
18
 
19
19
  for (const [sourceIndex, targetIndex] of edges) {
20
20
  if (!adjacencyList[sourceIndex].has(targetIndex)) {
@@ -73,7 +73,7 @@ export function findCycle(
73
73
  }
74
74
 
75
75
  // 0 = unvisited, 1 = visiting, 2 = completed
76
- const visitState = new Array<number>(nodeCount).fill(0);
76
+ const visitState: number[] = Array.from({ length: nodeCount }, () => 0);
77
77
  const pathStack: number[] = [];
78
78
  let cycleNodeIndexes: number[] | null = null;
79
79