@vrplatform/kysely 1.3.45-6564 → 1.3.45-784

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 (82) hide show
  1. package/build/.data.tar +2 -2
  2. package/build/main/control-plane/index.d.ts +137 -0
  3. package/build/main/control-plane/index.js.map +1 -1
  4. package/build/main/index.d.ts +11 -0
  5. package/build/main/index.js +131 -26
  6. package/build/main/index.js.map +1 -1
  7. package/build/main/local/generate.js +1 -0
  8. package/build/main/local/generate.js.map +1 -1
  9. package/build/main/local/index.js +109 -8
  10. package/build/main/local/index.js.map +1 -1
  11. package/build/main/postgres-error.d.ts +3 -3
  12. package/build/main/postgres-error.js +4 -3
  13. package/build/main/postgres-error.js.map +1 -1
  14. package/build/main/query/tenant/status.d.ts +1 -1
  15. package/build/main/query/tenant/status.js +4 -2
  16. package/build/main/query/tenant/status.js.map +1 -1
  17. package/build/main/regional.d.ts +1 -0
  18. package/build/main/regional.js +1 -0
  19. package/build/main/regional.js.map +1 -1
  20. package/build/main/test/index.d.ts +23 -3
  21. package/build/main/test/index.js +35 -13
  22. package/build/main/test/index.js.map +1 -1
  23. package/build/main/v1.generated.d.ts +347 -37
  24. package/build/main/v1.generated.js.map +1 -1
  25. package/build/migrations-v2/0000000000015-durable-flow-events.ts +163 -0
  26. package/build/migrations-v2/0000000000016-billing-listing-facts.ts +539 -0
  27. package/build/migrations-v2/0000000000017-webhook-secret-reencryption-failures.ts +18 -0
  28. package/build/migrations-v2/0000000000018-durable-flow-event-sensitive-input.ts +28 -0
  29. package/build/migrations-v2/0000000000019-asynchronous-operations.ts +736 -0
  30. package/build/migrations-v2/0000000000031-ui-permission-role-simplification.ts +70 -0
  31. package/build/migrations-v2/0000000000032-tenant-delete-ownership-cascades.ts +44 -0
  32. package/build/migrations-v2/0000000000033-plaid-connect-session-telemetry.ts +31 -0
  33. package/build/migrations-v2/0000000000033-reservation-issue-seed-bucket-index.ts +19 -0
  34. package/build/migrations-v2/0000000000034-retire-recent-classification-indexes.ts +29 -0
  35. package/build/migrations-v2/0000000000035-core-change-autovacuum.ts +24 -0
  36. package/build/migrations-v2/0000000000036-journal-entry-inactive-reason-constraint.ts +33 -0
  37. package/build/migrations-v2/0000000000037-journal-entry-inactive-reasons.ts +19 -0
  38. package/build/migrations-v2/0000000000038-journal-entry-group-inactive-reason.ts +14 -0
  39. package/build/migrations-v2/0000000000039-reservation-guest-breakdown.ts +19 -0
  40. package/build/migrations-v2/0000000000040-csv-import-source-identity-index.ts +23 -0
  41. package/build/migrations-v2/0000000000041-payment-returns.ts +38 -0
  42. package/build/migrations-v2/0000000000042-operation-resource-types.ts +609 -0
  43. package/build/migrations-v2/0000000000043-reservation-journal-freshness.ts +149 -0
  44. package/build/migrations-v2/0000000000044-reservation-journal-freshness-backfill.ts +254 -0
  45. package/build/migrations-v2/0000000000045-reservation-journal-freshness-revision-repair.ts +83 -0
  46. package/build/migrations-v2/0000000000046-materialized-reservation-journal-operations.ts +709 -0
  47. package/build/migrations-v2/0000000000047-public-audit-completion.ts +77 -0
  48. package/build/migrations-v2/0000000000048-reservation-journal-full-refresh-repair.ts +136 -0
  49. package/build/migrations-v2/0000000000049-queued-journal-operation-failures.ts +60 -0
  50. package/build/migrations-v2/0000000000050-connection-oauth-state.ts +43 -0
  51. package/build/migrations-v2/0000000000051-owner-statement-email-delivery.ts +134 -0
  52. package/build/migrations-v2/0000000000052-fee-journal-lock-skip-operations.ts +59 -0
  53. package/build/migrations-v2/0000000000053-fee-journal-lock-skip-null-attempt.ts +44 -0
  54. package/build/migrations-v2/0000000000054-journal-refresh-issue-codes.ts +16 -0
  55. package/build/migrations-v2/0000000000055-tenant-billing-subscription.ts +8 -0
  56. package/build/migrations-v2/0000000000056-journal-operation-failure-precedence.ts +306 -0
  57. package/build/migrations-v2/0000000000057-journal-invalidation-failure-code.ts +28 -0
  58. package/build/migrations-v2/0000000000058-journal-invalidation-locked-failure.ts +16 -0
  59. package/build/module/control-plane/index.d.ts +137 -0
  60. package/build/module/control-plane/index.js.map +1 -1
  61. package/build/module/index.d.ts +11 -0
  62. package/build/module/index.js +131 -26
  63. package/build/module/index.js.map +1 -1
  64. package/build/module/local/generate.js +1 -0
  65. package/build/module/local/generate.js.map +1 -1
  66. package/build/module/local/index.js +109 -8
  67. package/build/module/local/index.js.map +1 -1
  68. package/build/module/postgres-error.d.ts +3 -3
  69. package/build/module/postgres-error.js +4 -3
  70. package/build/module/postgres-error.js.map +1 -1
  71. package/build/module/query/tenant/status.d.ts +1 -1
  72. package/build/module/query/tenant/status.js +4 -2
  73. package/build/module/query/tenant/status.js.map +1 -1
  74. package/build/module/regional.d.ts +1 -0
  75. package/build/module/regional.js +1 -0
  76. package/build/module/regional.js.map +1 -1
  77. package/build/module/test/index.d.ts +23 -3
  78. package/build/module/test/index.js +34 -13
  79. package/build/module/test/index.js.map +1 -1
  80. package/build/module/v1.generated.d.ts +347 -37
  81. package/build/module/v1.generated.js.map +1 -1
  82. package/package.json +4 -2
package/build/.data.tar CHANGED
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/build/.data.tar
3
- size: 48116736 bytes
4
- sha256: fea00e67adcbc8bd4701ef3a00b70e5995913e526f99a47842b6cc8fb16d0f23
3
+ size: 50941952 bytes
4
+ sha256: dc736c159970f20a56de35a3ec6afe8ab91d7062228f85a853d3d44268cf76b1
@@ -1,4 +1,5 @@
1
1
  import { type ColumnType, type Kysely } from 'kysely';
2
+ import type { TenantDataRegion } from '../regional';
2
3
  export type Generated<T> = T extends ColumnType<infer S, infer I, infer U> ? ColumnType<S, I | undefined, U> : ColumnType<T, T | undefined, T>;
3
4
  export type Json = JsonValue;
4
5
  export type JsonArray = JsonValue[];
@@ -9,6 +10,11 @@ export type JsonPrimitive = boolean | number | string | null;
9
10
  export type JsonValue = JsonArray | JsonObject | JsonPrimitive;
10
11
  export type Int8 = ColumnType<string, number | string | bigint, number | string | bigint>;
11
12
  export type Timestamp = ColumnType<Date | string, Date | string, Date | string>;
13
+ export type ControlPlaneOperationStatus = 'completed' | 'failed' | 'queued' | 'running';
14
+ export type ControlPlaneOperationType = 'ach-verification' | 'bank-rule-run' | 'calendar-block' | 'calendar-unblock' | 'connection-archive' | 'connection-connect' | 'connection-extract' | 'connection-sync' | 'csv-import' | 'csv-import-preview' | 'export' | 'flow-run' | 'historical-gl-import' | 'historical-statement-import' | 'listing-journal-refresh' | 'plaid-initial-sync' | 'pms-cutover' | 'pms-cutover-preview' | 'provider-payment' | 'provider-payment-recovery' | 'recurring-transaction-run' | 'reservation-journal-refresh' | 'team-delete' | 'team-demo-data' | 'team-duplicate' | 'team-initialize' | 'transaction-journal-refresh' | 'vri-statement-import' | 'vri-team-migration' | 'webhook-test';
15
+ export type ControlPlaneOperationResourceRole = 'result' | 'source' | 'target';
16
+ export type ControlPlaneOperationResourceType = 'bank-rule' | 'connection' | 'contact' | 'file' | 'flow' | 'listing' | 'recurring-fee' | 'recurring-transaction-template' | 'reservation' | 'statement' | 'team' | 'transaction' | 'webhook';
17
+ export type ControlPlaneOperationSourceType = 'destructive-job' | 'regional-operation';
12
18
  export interface ControlPlaneApp {
13
19
  authentication: Generated<Json>;
14
20
  category: string | null;
@@ -104,6 +110,92 @@ export interface ControlPlaneBookingChannelIconCandidate {
104
110
  export interface ControlPlaneCurrency {
105
111
  name: string;
106
112
  }
113
+ export type DestructiveJobStep = 'completed' | 'completion_effects' | 'control_plane_deleted' | 'control_plane_deleting' | 'queued' | 'regional_deleted' | 'regional_deleting' | 'validated';
114
+ export interface ControlPlaneDestructiveJob {
115
+ attempts: Generated<number>;
116
+ authorizedByTenantId: string;
117
+ availableAt: Generated<Timestamp>;
118
+ claimedAt: Timestamp | null;
119
+ claimedBy: string | null;
120
+ completedAt: Timestamp | null;
121
+ completionData: Json | null;
122
+ completionWarningCode: string | null;
123
+ completionWarningDetails: Json | null;
124
+ createdAt: Generated<Timestamp>;
125
+ dataRegion: TenantDataRegion;
126
+ failureCode: string | null;
127
+ failureDetails: Json | null;
128
+ force: Generated<boolean>;
129
+ id: Generated<string>;
130
+ jobType: 'tenant.delete';
131
+ maxAttempts: Generated<number>;
132
+ requestId: string | null;
133
+ requestedByActorType: 'api_key' | 'system' | 'user';
134
+ requestedByTenantId: string;
135
+ requestedByUserId: string | null;
136
+ startedAt: Timestamp | null;
137
+ status: Generated<'canceled' | 'completed' | 'failed' | 'queued' | 'running'>;
138
+ step: Generated<DestructiveJobStep>;
139
+ targetId: string;
140
+ triggerRunId: string | null;
141
+ updatedAt: Generated<Timestamp>;
142
+ }
143
+ export interface ControlPlaneDestructiveJobAttempt {
144
+ attemptNumber: number;
145
+ failureCode: string | null;
146
+ failureDetails: Json | null;
147
+ finishedAt: Timestamp | null;
148
+ id: Generated<string>;
149
+ jobId: string;
150
+ startedAt: Generated<Timestamp>;
151
+ status: Generated<'completed' | 'failed' | 'running' | 'superseded'>;
152
+ step: DestructiveJobStep;
153
+ triggerRunId: string | null;
154
+ }
155
+ export interface ControlPlaneDestructiveJobOperation {
156
+ action: 'abandon' | 'cancel' | 'retry';
157
+ actor: string;
158
+ createdAt: Generated<Timestamp>;
159
+ id: Generated<string>;
160
+ jobId: string;
161
+ previousStatus: string;
162
+ previousStep: string;
163
+ reasonCode: string;
164
+ }
165
+ export interface ControlPlaneOperation {
166
+ createdAt: Generated<Timestamp>;
167
+ failureCode: string | null;
168
+ failureMessage: string | null;
169
+ finishedAt: Timestamp | null;
170
+ id: Generated<string>;
171
+ initiatedByUserId: string | null;
172
+ requesterTenantId: string;
173
+ retainUntil: Timestamp | null;
174
+ sourceRegion: TenantDataRegion | null;
175
+ sourceVersion: Generated<number>;
176
+ startedAt: Timestamp | null;
177
+ status: Generated<ControlPlaneOperationStatus>;
178
+ type: ControlPlaneOperationType;
179
+ updatedAt: Generated<Timestamp>;
180
+ }
181
+ export interface ControlPlaneOperationResource {
182
+ createdAt: Generated<Timestamp>;
183
+ isPrimary: Generated<boolean>;
184
+ operationId: string;
185
+ resourceId: string;
186
+ resourceType: ControlPlaneOperationResourceType;
187
+ role: ControlPlaneOperationResourceRole;
188
+ }
189
+ export interface ControlPlaneOperationSource {
190
+ finishedAt: Timestamp | null;
191
+ operationId: string;
192
+ required: Generated<boolean>;
193
+ sourceId: string;
194
+ sourceType: ControlPlaneOperationSourceType;
195
+ sourceVersion: Generated<number>;
196
+ startedAt: Timestamp | null;
197
+ status: Generated<ControlPlaneOperationStatus>;
198
+ }
107
199
  export interface ControlPlaneEvent {
108
200
  createdAt: Generated<Timestamp>;
109
201
  id: Generated<string>;
@@ -115,6 +207,27 @@ export interface ControlPlaneEvent {
115
207
  trackedAt: Generated<Timestamp | null>;
116
208
  userId: string | null;
117
209
  }
210
+ export interface ControlPlaneTrackingQueueFailure {
211
+ bodyFingerprint: string | null;
212
+ capturedAt: Generated<Timestamp>;
213
+ dispositionAt: Timestamp | null;
214
+ dispositionHistory: Generated<Json[]>;
215
+ dispositionReasonCode: string | null;
216
+ dispositionActor: string | null;
217
+ environment: 'production' | 'staging';
218
+ event: Json | null;
219
+ eventId: string | null;
220
+ expiresAt: Timestamp;
221
+ failureCode: string;
222
+ id: Generated<string>;
223
+ lastReplayedAt: Timestamp | null;
224
+ queueMessageId: string;
225
+ replayCount: Generated<number>;
226
+ recurrenceCount: Generated<number>;
227
+ status: Generated<'captured' | 'discarded' | 'replayed'>;
228
+ updatedAt: Generated<Timestamp>;
229
+ validationIssues: Json | null;
230
+ }
118
231
  export interface ControlPlaneConnectionRoute {
119
232
  connectionId: string;
120
233
  createdAt: Generated<Timestamp>;
@@ -262,6 +375,22 @@ export interface ControlPlanePartnerManagedTeamAssignment {
262
375
  partnerTenantId: string;
263
376
  userId: string;
264
377
  }
378
+ export interface ControlPlaneOwnerPortal {
379
+ hostname: string;
380
+ tenantId: string;
381
+ status: Generated<'pending' | 'active' | 'disabled'>;
382
+ name: string;
383
+ logo: string | null;
384
+ colorPrimary: string;
385
+ showPlatformBranding: Generated<boolean>;
386
+ linksEnabled: Generated<boolean>;
387
+ sender: {
388
+ from: string;
389
+ replyTo: string;
390
+ } | null;
391
+ revision: Generated<number>;
392
+ updatedAt: Generated<Timestamp>;
393
+ }
265
394
  export interface ControlPlaneTenant {
266
395
  billingPartnerId: string | null;
267
396
  billingPlan: string | null;
@@ -345,6 +474,9 @@ export interface ControlPlaneDB {
345
474
  'controlPlane.connectionRoute': ControlPlaneConnectionRoute;
346
475
  'controlPlane.controlPlaneOutbox': ControlPlaneOutbox;
347
476
  'controlPlane.currency': ControlPlaneCurrency;
477
+ 'controlPlane.destructiveJob': ControlPlaneDestructiveJob;
478
+ 'controlPlane.destructiveJobAttempt': ControlPlaneDestructiveJobAttempt;
479
+ 'controlPlane.destructiveJobOperation': ControlPlaneDestructiveJobOperation;
348
480
  'controlPlane.events': ControlPlaneEvent;
349
481
  'controlPlane.feature': ControlPlaneFeature;
350
482
  'controlPlane.featureApproval': ControlPlaneFeatureApproval;
@@ -353,12 +485,17 @@ export interface ControlPlaneDB {
353
485
  'controlPlane.generalLedgerDefaultVersion': ControlPlaneGeneralLedgerDefaultVersion;
354
486
  'controlPlane.lineClassification': ControlPlaneLineClassification;
355
487
  'controlPlane.lineClassificationTeamUsage': ControlPlaneLineClassificationTeamUsage;
488
+ 'controlPlane.operation': ControlPlaneOperation;
489
+ 'controlPlane.operationResource': ControlPlaneOperationResource;
490
+ 'controlPlane.operationSource': ControlPlaneOperationSource;
356
491
  'controlPlane.partnerManagedTeamAssignment': ControlPlanePartnerManagedTeamAssignment;
357
492
  'controlPlane.reservationLineDefault': ControlPlaneReservationLineDefault;
358
493
  'controlPlane.rolloutMonitorSnapshot': ControlPlaneRolloutMonitorSnapshot;
494
+ 'controlPlane.ownerPortal': ControlPlaneOwnerPortal;
359
495
  'controlPlane.tenant': ControlPlaneTenant;
360
496
  'controlPlane.tenantRegionMigration': ControlPlaneTenantRegionMigration;
361
497
  'controlPlane.tenantUser': ControlPlaneTenantUser;
498
+ 'controlPlane.trackingQueueFailure': ControlPlaneTrackingQueueFailure;
362
499
  'controlPlane.token': ControlPlaneToken;
363
500
  'controlPlane.transactionLineMapping': ControlPlaneTransactionLineMapping;
364
501
  'controlPlane.user': ControlPlaneUser;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"src/","sources":["control-plane/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AA4eA,wDAQC;AApfD,mCAcgB;AA4ZhB,MAAM,6BAA8B,SAAQ,iCAAwB;IAClE,YACW,MAAc,EACd,2BAAmC;QAE5C,KAAK,EAAE,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QACd,gCAA2B,GAA3B,2BAA2B,CAAQ;IAG9C,CAAC;IAEkB,4BAA4B,CAC7C,IAA6B,EAC7B,OAAgB;QAEhB,MAAM,WAAW,GAAG,KAAK,CAAC,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtE,IACE,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc;YAC3C,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,eAAe,EAC5C,CAAC;YACD,OAAO,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,uBAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,CAAC;QACD,IACE,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,kBAAkB;YAC/C,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,oBAAoB,EACjD,CAAC;YACD,OAAO;gBACL,GAAG,WAAW;gBACd,MAAM,EAAE,uBAAc,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC;aAChE,CAAC;QACJ,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEkB,iBAAiB,CAClC,IAAkB,EAClB,OAAgB;QAEhB,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAC1C,CAAC,CAAC;gBACE,GAAG,WAAW;gBACd,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;aACzE;YACH,CAAC,CAAC,WAAW,CAAC;IAClB,CAAC;CACF;AAED,MAAM,wBAAwB;IAG5B,YAAY,MAAc,EAAE,2BAAmC;QAFtD,wDAA4C;QAGnD,uBAAA,IAAI,yCAAgB,IAAI,6BAA6B,CACnD,MAAM,EACN,2BAA2B,CAC5B,MAAA,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAA8B;QAC3C,OAAO,uBAAA,IAAI,6CAAa,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,IAA+B;QAE/B,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;;AAED,SAAgB,sBAAsB,CACpC,MAA8B,EAC9B,MAAc,EACd,2BAA2B,GAAG,MAAM;IAEpC,OAAO,MAAM,CAAC,UAAU,CACtB,IAAI,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAClE,CAAC;AACJ,CAAC","sourcesContent":["import {\n type ColumnType,\n type FunctionNode,\n IdentifierNode,\n type Kysely,\n type KyselyPlugin,\n OperationNodeTransformer,\n type PluginTransformQueryArgs,\n type PluginTransformResultArgs,\n type QueryId,\n type QueryResult,\n type RootOperationNode,\n type SchemableIdentifierNode,\n type UnknownRow,\n} from 'kysely';\n\nexport type Generated<T> =\n T extends ColumnType<infer S, infer I, infer U>\n ? ColumnType<S, I | undefined, U>\n : ColumnType<T, T | undefined, T>;\n\nexport type Json = JsonValue;\n\nexport type JsonArray = JsonValue[];\n\nexport type JsonObject = {\n [x: string]: JsonValue | undefined;\n};\n\nexport type JsonPrimitive = boolean | number | string | null;\n\nexport type JsonValue = JsonArray | JsonObject | JsonPrimitive;\n\nexport type Int8 = ColumnType<\n string,\n number | string | bigint,\n number | string | bigint\n>;\n\nexport type Timestamp = ColumnType<Date | string, Date | string, Date | string>;\n\nexport interface ControlPlaneApp {\n authentication: Generated<Json>;\n category: string | null;\n color: string | null;\n createdAt: Generated<Timestamp>;\n icon: string | null;\n iconRound: string | null;\n id: Generated<string>;\n info: Json | null;\n name: string;\n type: string;\n version: Generated<number>;\n}\n\nexport interface ControlPlaneAccountingIntegrityEvaluation {\n caseCount: Generated<Int8>;\n completedAt: Timestamp | null;\n completedRunCount: Generated<number>;\n createdAt: Generated<Timestamp>;\n environment: string;\n error: Json | null;\n expectedRunCount: number;\n failedRunCount: Generated<number>;\n findingRowCount: Generated<Int8>;\n gitRevision: string;\n id: string;\n results: Generated<Json>;\n rowsScanned: Generated<Int8>;\n skippedRunCount: Generated<number>;\n source: string;\n startedAt: Timestamp;\n status: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneAccountingIntegrityDefinitionDraft {\n artifact: Json;\n artifactHash: string;\n code: string;\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n ownerId: string;\n previewResult: Json | null;\n rationale: string;\n revision: Generated<number>;\n status: string;\n templateId: string;\n templateVersion: number;\n title: string;\n updatedAt: Generated<Timestamp>;\n validationResult: Json | null;\n}\n\nexport interface ControlPlaneAccountingIntegrityDefinitionVersion {\n artifact: Json;\n artifactHash: string;\n code: string;\n draftId: string;\n id: Generated<string>;\n publishedAt: Generated<Timestamp>;\n publishedBy: string;\n rollout: string;\n templateId: string;\n templateVersion: number;\n version: number;\n}\n\nexport interface ControlPlaneBookingChannel {\n channelRef: string | null;\n color: string | null;\n createdAt: Generated<Timestamp>;\n icon: string | null;\n iconProvider: string | null;\n id: Generated<string>;\n lastGenerateRun: Timestamp | null;\n logo: string | null;\n logoProvider: string | null;\n selectedBookingChannelIconCandidateId: string | null;\n selectedBookingChannelLogoCandidateId: string | null;\n uniqueRef: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneBookingChannelIconCandidate {\n bookingChannelId: string;\n cloudflareImageId: string | null;\n color: string | null;\n comment: string | null;\n createdAt: Generated<Timestamp>;\n externalIcon: string | null;\n height: number | null;\n id: Generated<string>;\n provider: Generated<string>;\n source: string | null;\n updatedAt: Generated<Timestamp>;\n width: number | null;\n}\n\nexport interface ControlPlaneCurrency {\n name: string;\n}\n\nexport interface ControlPlaneEvent {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n name: string;\n packageName: string;\n props: Json;\n tenantId: string | null;\n timestamp: Generated<Timestamp>;\n trackedAt: Generated<Timestamp | null>;\n userId: string | null;\n}\n\nexport interface ControlPlaneConnectionRoute {\n connectionId: string;\n createdAt: Generated<Timestamp>;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneFeature {\n createdAt: Generated<Timestamp>;\n description: string | null;\n id: Generated<string>;\n issueUrl: string | null;\n requiredApprovals: Generated<Json | null>;\n status: Generated<string | null>;\n tenantId: string | null;\n title: string;\n updatedAt: Generated<Timestamp>;\n url: string | null;\n}\n\nexport interface ControlPlaneFeatureEnabledTeam {\n createdAt: Generated<Timestamp>;\n featureId: string;\n id: Generated<string>;\n status: Generated<string | null>;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneFeatureApproval {\n createdAt: Generated<Timestamp>;\n featureId: string;\n id: Generated<string>;\n status: Generated<string | null>;\n updatedAt: Generated<Timestamp>;\n userId: string;\n}\n\nexport interface ControlPlaneFlow {\n appId: string;\n createdAt: Generated<Timestamp>;\n description: string | null;\n eventListening: Generated<Json>;\n id: Generated<string>;\n isPublic: Generated<boolean>;\n leftType: string | null;\n mappingSchema: Generated<Json>;\n revision: Generated<number>;\n rightType: string | null;\n runSchema: Generated<Json>;\n settingSchema: Generated<Json>;\n title: string;\n type: 'pull' | 'push' | null;\n uniqueRef: string;\n updatedAt: Generated<Timestamp>;\n useGlobalMapping: Generated<boolean>;\n}\n\nexport interface ControlPlaneIssueMessageOverwrite {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n message: string;\n pattern: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneLineClassification {\n appConflict: Generated<boolean>;\n appId: string | null;\n createdAt: Generated<Timestamp>;\n firstSeenAt: Timestamp;\n id: Generated<string>;\n kind: string;\n lastSeenAt: Timestamp;\n name: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneLineClassificationTeamUsage {\n classificationId: string;\n createdAt: Generated<Timestamp>;\n dataRegion: string;\n firstSeenAt: Timestamp;\n lastSeenAt: Timestamp;\n mappingStatus: string | null;\n revision: number;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneReservationLineDefault {\n accountKey: string | null;\n bookingChannel: string | null;\n bookingChannelKey: Generated<string>;\n classificationId: string;\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n partnerTenantId: string | null;\n revenueRecognition: string | null;\n revision: Generated<number>;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneRolloutMonitorSnapshot {\n monitorName: string;\n result: Json;\n snapshotDate: Timestamp;\n}\n\nexport interface ControlPlaneTransactionLineMapping {\n accountAssignmentType: string | null;\n createdAt: Generated<Timestamp>;\n deletedAt: Timestamp | null;\n id: Generated<string>;\n lineType: string;\n revision: Generated<number>;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneGeneralLedgerDefaultSet {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n partnerTenantId: string | null;\n publishedVersion: number | null;\n sourceDataRegion: string;\n sourceDigest: string | null;\n sourceTenantId: string;\n templateKey: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneGeneralLedgerDefaultVersion {\n dataJson: Json;\n defaultSetId: string;\n id: Generated<string>;\n publishedAt: Generated<Timestamp>;\n sourceDigest: string;\n sourceTenantId: string;\n version: number;\n}\n\nexport interface ControlPlaneOutbox {\n aggregateId: string;\n aggregateType: string;\n attempts: Generated<number>;\n createdAt: Generated<Timestamp>;\n dataRegion: string | null;\n eventType: string;\n eventVersion: number;\n id: Generated<string>;\n lastError: string | null;\n payload: Generated<Json>;\n publishedAt: Timestamp | null;\n}\n\nexport interface ControlPlanePartnerManagedTeamAssignment {\n createdAt: Generated<Timestamp>;\n managedTeamId: string;\n partnerTenantId: string;\n userId: string;\n}\n\nexport interface ControlPlaneTenant {\n billingPartnerId: string | null;\n billingPlan: string | null;\n createdAt: Generated<Timestamp>;\n dataRegion: Generated<string>;\n id: Generated<string>;\n migrationStatus: Generated<string>;\n name: string;\n partnerId: string | null;\n partnerDeniedPermissions: Generated<string[]>;\n slug: string;\n status: Generated<string | null>;\n storageRealm: Generated<string>;\n type: Generated<string | null>;\n uniqueRef: string | null;\n updatedAt: Generated<Timestamp | null>;\n}\n\nexport interface ControlPlaneTenantRegionMigration {\n actor: string;\n completedAt: Timestamp | null;\n error: Json | null;\n id: string;\n reason: string;\n sourceManifest: Json | null;\n sourceRegion: string;\n startedAt: Generated<Timestamp>;\n status: Generated<string>;\n targetManifest: Json | null;\n targetRegion: string;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneTenantUser {\n createdAt: Generated<Timestamp | null>;\n id: Generated<string>;\n lastInvitedAt: Timestamp | null;\n managedTeamAccess: Generated<'all' | 'assigned'>;\n permissionBundles: Generated<string[]>;\n role: Generated<string | null>;\n status: Generated<string | null>;\n tenantId: string;\n updatedAt: Generated<Timestamp | null>;\n userId: string;\n}\n\nexport interface ControlPlaneToken {\n createdAt: Generated<Timestamp>;\n expiresAt: Timestamp | null;\n id: Generated<string>;\n nanoId: Generated<string>;\n payload: Generated<Json>;\n tenantId: string | null;\n type: string | null;\n userId: string | null;\n}\n\nexport interface ControlPlaneUser {\n clerkId: string | null;\n createdAt: Generated<Timestamp | null>;\n email: string | null;\n firstName: string | null;\n id: Generated<string>;\n internalOperationGrants: Generated<string[]>;\n isAdmin: Generated<boolean>;\n lastName: string | null;\n lastSeen: Timestamp | null;\n name: string | null;\n partnerId: string | null;\n phone: string | null;\n secondaryEmails: Generated<Json>;\n status: Generated<string | null>;\n sub: string | null;\n type: Generated<string | null>;\n updatedAt: Generated<Timestamp | null>;\n}\n\nexport interface ControlPlaneDB {\n 'controlPlane.accountingIntegrityDefinitionDraft': ControlPlaneAccountingIntegrityDefinitionDraft;\n 'controlPlane.accountingIntegrityDefinitionVersion': ControlPlaneAccountingIntegrityDefinitionVersion;\n 'controlPlane.accountingIntegrityEvaluation': ControlPlaneAccountingIntegrityEvaluation;\n 'controlPlane.app': ControlPlaneApp;\n 'controlPlane.bookingChannel': ControlPlaneBookingChannel;\n 'controlPlane.bookingChannelIconCandidate': ControlPlaneBookingChannelIconCandidate;\n 'controlPlane.connectionRoute': ControlPlaneConnectionRoute;\n 'controlPlane.controlPlaneOutbox': ControlPlaneOutbox;\n 'controlPlane.currency': ControlPlaneCurrency;\n 'controlPlane.events': ControlPlaneEvent;\n 'controlPlane.feature': ControlPlaneFeature;\n 'controlPlane.featureApproval': ControlPlaneFeatureApproval;\n 'controlPlane.featureEnabledTeam': ControlPlaneFeatureEnabledTeam;\n 'controlPlane.generalLedgerDefaultSet': ControlPlaneGeneralLedgerDefaultSet;\n 'controlPlane.generalLedgerDefaultVersion': ControlPlaneGeneralLedgerDefaultVersion;\n 'controlPlane.lineClassification': ControlPlaneLineClassification;\n 'controlPlane.lineClassificationTeamUsage': ControlPlaneLineClassificationTeamUsage;\n 'controlPlane.partnerManagedTeamAssignment': ControlPlanePartnerManagedTeamAssignment;\n 'controlPlane.reservationLineDefault': ControlPlaneReservationLineDefault;\n 'controlPlane.rolloutMonitorSnapshot': ControlPlaneRolloutMonitorSnapshot;\n 'controlPlane.tenant': ControlPlaneTenant;\n 'controlPlane.tenantRegionMigration': ControlPlaneTenantRegionMigration;\n 'controlPlane.tenantUser': ControlPlaneTenantUser;\n 'controlPlane.token': ControlPlaneToken;\n 'controlPlane.transactionLineMapping': ControlPlaneTransactionLineMapping;\n 'controlPlane.user': ControlPlaneUser;\n 'controlPlaneCore.flow': ControlPlaneFlow;\n 'controlPlaneCore.issueMessageOverwrite': ControlPlaneIssueMessageOverwrite;\n}\n\nclass ControlPlaneSchemaTransformer extends OperationNodeTransformer {\n constructor(\n readonly schema: string,\n readonly issueMessageOverwriteSchema: string\n ) {\n super();\n }\n\n protected override transformSchemableIdentifier(\n node: SchemableIdentifierNode,\n queryId: QueryId\n ): SchemableIdentifierNode {\n const transformed = super.transformSchemableIdentifier(node, queryId);\n if (\n transformed.schema?.name === 'controlPlane' ||\n transformed.schema?.name === 'control_plane'\n ) {\n return { ...transformed, schema: IdentifierNode.create(this.schema) };\n }\n if (\n transformed.schema?.name === 'controlPlaneCore' ||\n transformed.schema?.name === 'control_plane_core'\n ) {\n return {\n ...transformed,\n schema: IdentifierNode.create(this.issueMessageOverwriteSchema),\n };\n }\n return transformed;\n }\n\n protected override transformFunction(\n node: FunctionNode,\n queryId: QueryId\n ): FunctionNode {\n const transformed = super.transformFunction(node, queryId);\n return node.func.startsWith('controlPlane.')\n ? {\n ...transformed,\n func: `${this.schema}.${transformed.func.slice('controlPlane.'.length)}`,\n }\n : transformed;\n }\n}\n\nclass ControlPlaneSchemaPlugin implements KyselyPlugin {\n readonly #transformer: ControlPlaneSchemaTransformer;\n\n constructor(schema: string, issueMessageOverwriteSchema: string) {\n this.#transformer = new ControlPlaneSchemaTransformer(\n schema,\n issueMessageOverwriteSchema\n );\n }\n\n transformQuery(args: PluginTransformQueryArgs): RootOperationNode {\n return this.#transformer.transformNode(args.node, args.queryId);\n }\n\n async transformResult(\n args: PluginTransformResultArgs\n ): Promise<QueryResult<UnknownRow>> {\n return args.result;\n }\n}\n\nexport function withControlPlaneSchema(\n kysely: Kysely<ControlPlaneDB>,\n schema: string,\n issueMessageOverwriteSchema = 'core'\n) {\n return kysely.withPlugin(\n new ControlPlaneSchemaPlugin(schema, issueMessageOverwriteSchema)\n );\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["control-plane/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAyrBA,wDAQC;AAjsBD,mCAcgB;AAymBhB,MAAM,6BAA8B,SAAQ,iCAAwB;IAClE,YACW,MAAc,EACd,2BAAmC;QAE5C,KAAK,EAAE,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QACd,gCAA2B,GAA3B,2BAA2B,CAAQ;IAG9C,CAAC;IAEkB,4BAA4B,CAC7C,IAA6B,EAC7B,OAAgB;QAEhB,MAAM,WAAW,GAAG,KAAK,CAAC,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtE,IACE,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc;YAC3C,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,eAAe,EAC5C,CAAC;YACD,OAAO,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,uBAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,CAAC;QACD,IACE,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,kBAAkB;YAC/C,WAAW,CAAC,MAAM,EAAE,IAAI,KAAK,oBAAoB,EACjD,CAAC;YACD,OAAO;gBACL,GAAG,WAAW;gBACd,MAAM,EAAE,uBAAc,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC;aAChE,CAAC;QACJ,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEkB,iBAAiB,CAClC,IAAkB,EAClB,OAAgB;QAEhB,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAC1C,CAAC,CAAC;gBACE,GAAG,WAAW;gBACd,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;aACzE;YACH,CAAC,CAAC,WAAW,CAAC;IAClB,CAAC;CACF;AAED,MAAM,wBAAwB;IAG5B,YAAY,MAAc,EAAE,2BAAmC;QAFtD,wDAA4C;QAGnD,uBAAA,IAAI,yCAAgB,IAAI,6BAA6B,CACnD,MAAM,EACN,2BAA2B,CAC5B,MAAA,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAA8B;QAC3C,OAAO,uBAAA,IAAI,6CAAa,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,IAA+B;QAE/B,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;;AAED,SAAgB,sBAAsB,CACpC,MAA8B,EAC9B,MAAc,EACd,2BAA2B,GAAG,MAAM;IAEpC,OAAO,MAAM,CAAC,UAAU,CACtB,IAAI,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAClE,CAAC;AACJ,CAAC","sourcesContent":["import {\n type ColumnType,\n type FunctionNode,\n IdentifierNode,\n type Kysely,\n type KyselyPlugin,\n OperationNodeTransformer,\n type PluginTransformQueryArgs,\n type PluginTransformResultArgs,\n type QueryId,\n type QueryResult,\n type RootOperationNode,\n type SchemableIdentifierNode,\n type UnknownRow,\n} from 'kysely';\nimport type { TenantDataRegion } from '../regional';\n\nexport type Generated<T> =\n T extends ColumnType<infer S, infer I, infer U>\n ? ColumnType<S, I | undefined, U>\n : ColumnType<T, T | undefined, T>;\n\nexport type Json = JsonValue;\n\nexport type JsonArray = JsonValue[];\n\nexport type JsonObject = {\n [x: string]: JsonValue | undefined;\n};\n\nexport type JsonPrimitive = boolean | number | string | null;\n\nexport type JsonValue = JsonArray | JsonObject | JsonPrimitive;\n\nexport type Int8 = ColumnType<\n string,\n number | string | bigint,\n number | string | bigint\n>;\n\nexport type Timestamp = ColumnType<Date | string, Date | string, Date | string>;\n\nexport type ControlPlaneOperationStatus =\n | 'completed'\n | 'failed'\n | 'queued'\n | 'running';\n\nexport type ControlPlaneOperationType =\n | 'ach-verification'\n | 'bank-rule-run'\n | 'calendar-block'\n | 'calendar-unblock'\n | 'connection-archive'\n | 'connection-connect'\n | 'connection-extract'\n | 'connection-sync'\n | 'csv-import'\n | 'csv-import-preview'\n | 'export'\n | 'flow-run'\n | 'historical-gl-import'\n | 'historical-statement-import'\n | 'listing-journal-refresh'\n | 'plaid-initial-sync'\n | 'pms-cutover'\n | 'pms-cutover-preview'\n | 'provider-payment'\n | 'provider-payment-recovery'\n | 'recurring-transaction-run'\n | 'reservation-journal-refresh'\n | 'team-delete'\n | 'team-demo-data'\n | 'team-duplicate'\n | 'team-initialize'\n | 'transaction-journal-refresh'\n | 'vri-statement-import'\n | 'vri-team-migration'\n | 'webhook-test';\n\nexport type ControlPlaneOperationResourceRole = 'result' | 'source' | 'target';\n\nexport type ControlPlaneOperationResourceType =\n | 'bank-rule'\n | 'connection'\n | 'contact'\n | 'file'\n | 'flow'\n | 'listing'\n | 'recurring-fee'\n | 'recurring-transaction-template'\n | 'reservation'\n | 'statement'\n | 'team'\n | 'transaction'\n | 'webhook';\n\nexport type ControlPlaneOperationSourceType =\n | 'destructive-job'\n | 'regional-operation';\n\nexport interface ControlPlaneApp {\n authentication: Generated<Json>;\n category: string | null;\n color: string | null;\n createdAt: Generated<Timestamp>;\n icon: string | null;\n iconRound: string | null;\n id: Generated<string>;\n info: Json | null;\n name: string;\n type: string;\n version: Generated<number>;\n}\n\nexport interface ControlPlaneAccountingIntegrityEvaluation {\n caseCount: Generated<Int8>;\n completedAt: Timestamp | null;\n completedRunCount: Generated<number>;\n createdAt: Generated<Timestamp>;\n environment: string;\n error: Json | null;\n expectedRunCount: number;\n failedRunCount: Generated<number>;\n findingRowCount: Generated<Int8>;\n gitRevision: string;\n id: string;\n results: Generated<Json>;\n rowsScanned: Generated<Int8>;\n skippedRunCount: Generated<number>;\n source: string;\n startedAt: Timestamp;\n status: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneAccountingIntegrityDefinitionDraft {\n artifact: Json;\n artifactHash: string;\n code: string;\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n ownerId: string;\n previewResult: Json | null;\n rationale: string;\n revision: Generated<number>;\n status: string;\n templateId: string;\n templateVersion: number;\n title: string;\n updatedAt: Generated<Timestamp>;\n validationResult: Json | null;\n}\n\nexport interface ControlPlaneAccountingIntegrityDefinitionVersion {\n artifact: Json;\n artifactHash: string;\n code: string;\n draftId: string;\n id: Generated<string>;\n publishedAt: Generated<Timestamp>;\n publishedBy: string;\n rollout: string;\n templateId: string;\n templateVersion: number;\n version: number;\n}\n\nexport interface ControlPlaneBookingChannel {\n channelRef: string | null;\n color: string | null;\n createdAt: Generated<Timestamp>;\n icon: string | null;\n iconProvider: string | null;\n id: Generated<string>;\n lastGenerateRun: Timestamp | null;\n logo: string | null;\n logoProvider: string | null;\n selectedBookingChannelIconCandidateId: string | null;\n selectedBookingChannelLogoCandidateId: string | null;\n uniqueRef: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneBookingChannelIconCandidate {\n bookingChannelId: string;\n cloudflareImageId: string | null;\n color: string | null;\n comment: string | null;\n createdAt: Generated<Timestamp>;\n externalIcon: string | null;\n height: number | null;\n id: Generated<string>;\n provider: Generated<string>;\n source: string | null;\n updatedAt: Generated<Timestamp>;\n width: number | null;\n}\n\nexport interface ControlPlaneCurrency {\n name: string;\n}\n\nexport type DestructiveJobStep =\n | 'completed'\n | 'completion_effects'\n | 'control_plane_deleted'\n | 'control_plane_deleting'\n | 'queued'\n | 'regional_deleted'\n | 'regional_deleting'\n | 'validated';\n\nexport interface ControlPlaneDestructiveJob {\n attempts: Generated<number>;\n authorizedByTenantId: string;\n availableAt: Generated<Timestamp>;\n claimedAt: Timestamp | null;\n claimedBy: string | null;\n completedAt: Timestamp | null;\n completionData: Json | null;\n completionWarningCode: string | null;\n completionWarningDetails: Json | null;\n createdAt: Generated<Timestamp>;\n dataRegion: TenantDataRegion;\n failureCode: string | null;\n failureDetails: Json | null;\n force: Generated<boolean>;\n id: Generated<string>;\n jobType: 'tenant.delete';\n maxAttempts: Generated<number>;\n requestId: string | null;\n requestedByActorType: 'api_key' | 'system' | 'user';\n requestedByTenantId: string;\n requestedByUserId: string | null;\n startedAt: Timestamp | null;\n status: Generated<'canceled' | 'completed' | 'failed' | 'queued' | 'running'>;\n step: Generated<DestructiveJobStep>;\n targetId: string;\n triggerRunId: string | null;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneDestructiveJobAttempt {\n attemptNumber: number;\n failureCode: string | null;\n failureDetails: Json | null;\n finishedAt: Timestamp | null;\n id: Generated<string>;\n jobId: string;\n startedAt: Generated<Timestamp>;\n status: Generated<'completed' | 'failed' | 'running' | 'superseded'>;\n step: DestructiveJobStep;\n triggerRunId: string | null;\n}\n\nexport interface ControlPlaneDestructiveJobOperation {\n action: 'abandon' | 'cancel' | 'retry';\n actor: string;\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n jobId: string;\n previousStatus: string;\n previousStep: string;\n reasonCode: string;\n}\n\nexport interface ControlPlaneOperation {\n createdAt: Generated<Timestamp>;\n failureCode: string | null;\n failureMessage: string | null;\n finishedAt: Timestamp | null;\n id: Generated<string>;\n initiatedByUserId: string | null;\n requesterTenantId: string;\n retainUntil: Timestamp | null;\n sourceRegion: TenantDataRegion | null;\n sourceVersion: Generated<number>;\n startedAt: Timestamp | null;\n status: Generated<ControlPlaneOperationStatus>;\n type: ControlPlaneOperationType;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneOperationResource {\n createdAt: Generated<Timestamp>;\n isPrimary: Generated<boolean>;\n operationId: string;\n resourceId: string;\n resourceType: ControlPlaneOperationResourceType;\n role: ControlPlaneOperationResourceRole;\n}\n\nexport interface ControlPlaneOperationSource {\n finishedAt: Timestamp | null;\n operationId: string;\n required: Generated<boolean>;\n sourceId: string;\n sourceType: ControlPlaneOperationSourceType;\n sourceVersion: Generated<number>;\n startedAt: Timestamp | null;\n status: Generated<ControlPlaneOperationStatus>;\n}\n\nexport interface ControlPlaneEvent {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n name: string;\n packageName: string;\n props: Json;\n tenantId: string | null;\n timestamp: Generated<Timestamp>;\n trackedAt: Generated<Timestamp | null>;\n userId: string | null;\n}\n\nexport interface ControlPlaneTrackingQueueFailure {\n bodyFingerprint: string | null;\n capturedAt: Generated<Timestamp>;\n dispositionAt: Timestamp | null;\n dispositionHistory: Generated<Json[]>;\n dispositionReasonCode: string | null;\n dispositionActor: string | null;\n environment: 'production' | 'staging';\n event: Json | null;\n eventId: string | null;\n expiresAt: Timestamp;\n failureCode: string;\n id: Generated<string>;\n lastReplayedAt: Timestamp | null;\n queueMessageId: string;\n replayCount: Generated<number>;\n recurrenceCount: Generated<number>;\n status: Generated<'captured' | 'discarded' | 'replayed'>;\n updatedAt: Generated<Timestamp>;\n validationIssues: Json | null;\n}\n\nexport interface ControlPlaneConnectionRoute {\n connectionId: string;\n createdAt: Generated<Timestamp>;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneFeature {\n createdAt: Generated<Timestamp>;\n description: string | null;\n id: Generated<string>;\n issueUrl: string | null;\n requiredApprovals: Generated<Json | null>;\n status: Generated<string | null>;\n tenantId: string | null;\n title: string;\n updatedAt: Generated<Timestamp>;\n url: string | null;\n}\n\nexport interface ControlPlaneFeatureEnabledTeam {\n createdAt: Generated<Timestamp>;\n featureId: string;\n id: Generated<string>;\n status: Generated<string | null>;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneFeatureApproval {\n createdAt: Generated<Timestamp>;\n featureId: string;\n id: Generated<string>;\n status: Generated<string | null>;\n updatedAt: Generated<Timestamp>;\n userId: string;\n}\n\nexport interface ControlPlaneFlow {\n appId: string;\n createdAt: Generated<Timestamp>;\n description: string | null;\n eventListening: Generated<Json>;\n id: Generated<string>;\n isPublic: Generated<boolean>;\n leftType: string | null;\n mappingSchema: Generated<Json>;\n revision: Generated<number>;\n rightType: string | null;\n runSchema: Generated<Json>;\n settingSchema: Generated<Json>;\n title: string;\n type: 'pull' | 'push' | null;\n uniqueRef: string;\n updatedAt: Generated<Timestamp>;\n useGlobalMapping: Generated<boolean>;\n}\n\nexport interface ControlPlaneIssueMessageOverwrite {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n message: string;\n pattern: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneLineClassification {\n appConflict: Generated<boolean>;\n appId: string | null;\n createdAt: Generated<Timestamp>;\n firstSeenAt: Timestamp;\n id: Generated<string>;\n kind: string;\n lastSeenAt: Timestamp;\n name: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneLineClassificationTeamUsage {\n classificationId: string;\n createdAt: Generated<Timestamp>;\n dataRegion: string;\n firstSeenAt: Timestamp;\n lastSeenAt: Timestamp;\n mappingStatus: string | null;\n revision: number;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneReservationLineDefault {\n accountKey: string | null;\n bookingChannel: string | null;\n bookingChannelKey: Generated<string>;\n classificationId: string;\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n partnerTenantId: string | null;\n revenueRecognition: string | null;\n revision: Generated<number>;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneRolloutMonitorSnapshot {\n monitorName: string;\n result: Json;\n snapshotDate: Timestamp;\n}\n\nexport interface ControlPlaneTransactionLineMapping {\n accountAssignmentType: string | null;\n createdAt: Generated<Timestamp>;\n deletedAt: Timestamp | null;\n id: Generated<string>;\n lineType: string;\n revision: Generated<number>;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneGeneralLedgerDefaultSet {\n createdAt: Generated<Timestamp>;\n id: Generated<string>;\n partnerTenantId: string | null;\n publishedVersion: number | null;\n sourceDataRegion: string;\n sourceDigest: string | null;\n sourceTenantId: string;\n templateKey: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneGeneralLedgerDefaultVersion {\n dataJson: Json;\n defaultSetId: string;\n id: Generated<string>;\n publishedAt: Generated<Timestamp>;\n sourceDigest: string;\n sourceTenantId: string;\n version: number;\n}\n\nexport interface ControlPlaneOutbox {\n aggregateId: string;\n aggregateType: string;\n attempts: Generated<number>;\n createdAt: Generated<Timestamp>;\n dataRegion: string | null;\n eventType: string;\n eventVersion: number;\n id: Generated<string>;\n lastError: string | null;\n payload: Generated<Json>;\n publishedAt: Timestamp | null;\n}\n\nexport interface ControlPlanePartnerManagedTeamAssignment {\n createdAt: Generated<Timestamp>;\n managedTeamId: string;\n partnerTenantId: string;\n userId: string;\n}\n\nexport interface ControlPlaneOwnerPortal {\n hostname: string;\n tenantId: string;\n status: Generated<'pending' | 'active' | 'disabled'>;\n name: string;\n logo: string | null;\n colorPrimary: string;\n showPlatformBranding: Generated<boolean>;\n linksEnabled: Generated<boolean>;\n sender: { from: string; replyTo: string } | null;\n revision: Generated<number>;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneTenant {\n billingPartnerId: string | null;\n billingPlan: string | null;\n createdAt: Generated<Timestamp>;\n dataRegion: Generated<string>;\n id: Generated<string>;\n migrationStatus: Generated<string>;\n name: string;\n partnerId: string | null;\n partnerDeniedPermissions: Generated<string[]>;\n slug: string;\n status: Generated<string | null>;\n storageRealm: Generated<string>;\n type: Generated<string | null>;\n uniqueRef: string | null;\n updatedAt: Generated<Timestamp | null>;\n}\n\nexport interface ControlPlaneTenantRegionMigration {\n actor: string;\n completedAt: Timestamp | null;\n error: Json | null;\n id: string;\n reason: string;\n sourceManifest: Json | null;\n sourceRegion: string;\n startedAt: Generated<Timestamp>;\n status: Generated<string>;\n targetManifest: Json | null;\n targetRegion: string;\n tenantId: string;\n updatedAt: Generated<Timestamp>;\n}\n\nexport interface ControlPlaneTenantUser {\n createdAt: Generated<Timestamp | null>;\n id: Generated<string>;\n lastInvitedAt: Timestamp | null;\n managedTeamAccess: Generated<'all' | 'assigned'>;\n permissionBundles: Generated<string[]>;\n role: Generated<string | null>;\n status: Generated<string | null>;\n tenantId: string;\n updatedAt: Generated<Timestamp | null>;\n userId: string;\n}\n\nexport interface ControlPlaneToken {\n createdAt: Generated<Timestamp>;\n expiresAt: Timestamp | null;\n id: Generated<string>;\n nanoId: Generated<string>;\n payload: Generated<Json>;\n tenantId: string | null;\n type: string | null;\n userId: string | null;\n}\n\nexport interface ControlPlaneUser {\n clerkId: string | null;\n createdAt: Generated<Timestamp | null>;\n email: string | null;\n firstName: string | null;\n id: Generated<string>;\n internalOperationGrants: Generated<string[]>;\n isAdmin: Generated<boolean>;\n lastName: string | null;\n lastSeen: Timestamp | null;\n name: string | null;\n partnerId: string | null;\n phone: string | null;\n secondaryEmails: Generated<Json>;\n status: Generated<string | null>;\n sub: string | null;\n type: Generated<string | null>;\n updatedAt: Generated<Timestamp | null>;\n}\n\nexport interface ControlPlaneDB {\n 'controlPlane.accountingIntegrityDefinitionDraft': ControlPlaneAccountingIntegrityDefinitionDraft;\n 'controlPlane.accountingIntegrityDefinitionVersion': ControlPlaneAccountingIntegrityDefinitionVersion;\n 'controlPlane.accountingIntegrityEvaluation': ControlPlaneAccountingIntegrityEvaluation;\n 'controlPlane.app': ControlPlaneApp;\n 'controlPlane.bookingChannel': ControlPlaneBookingChannel;\n 'controlPlane.bookingChannelIconCandidate': ControlPlaneBookingChannelIconCandidate;\n 'controlPlane.connectionRoute': ControlPlaneConnectionRoute;\n 'controlPlane.controlPlaneOutbox': ControlPlaneOutbox;\n 'controlPlane.currency': ControlPlaneCurrency;\n 'controlPlane.destructiveJob': ControlPlaneDestructiveJob;\n 'controlPlane.destructiveJobAttempt': ControlPlaneDestructiveJobAttempt;\n 'controlPlane.destructiveJobOperation': ControlPlaneDestructiveJobOperation;\n 'controlPlane.events': ControlPlaneEvent;\n 'controlPlane.feature': ControlPlaneFeature;\n 'controlPlane.featureApproval': ControlPlaneFeatureApproval;\n 'controlPlane.featureEnabledTeam': ControlPlaneFeatureEnabledTeam;\n 'controlPlane.generalLedgerDefaultSet': ControlPlaneGeneralLedgerDefaultSet;\n 'controlPlane.generalLedgerDefaultVersion': ControlPlaneGeneralLedgerDefaultVersion;\n 'controlPlane.lineClassification': ControlPlaneLineClassification;\n 'controlPlane.lineClassificationTeamUsage': ControlPlaneLineClassificationTeamUsage;\n 'controlPlane.operation': ControlPlaneOperation;\n 'controlPlane.operationResource': ControlPlaneOperationResource;\n 'controlPlane.operationSource': ControlPlaneOperationSource;\n 'controlPlane.partnerManagedTeamAssignment': ControlPlanePartnerManagedTeamAssignment;\n 'controlPlane.reservationLineDefault': ControlPlaneReservationLineDefault;\n 'controlPlane.rolloutMonitorSnapshot': ControlPlaneRolloutMonitorSnapshot;\n 'controlPlane.ownerPortal': ControlPlaneOwnerPortal;\n 'controlPlane.tenant': ControlPlaneTenant;\n 'controlPlane.tenantRegionMigration': ControlPlaneTenantRegionMigration;\n 'controlPlane.tenantUser': ControlPlaneTenantUser;\n 'controlPlane.trackingQueueFailure': ControlPlaneTrackingQueueFailure;\n 'controlPlane.token': ControlPlaneToken;\n 'controlPlane.transactionLineMapping': ControlPlaneTransactionLineMapping;\n 'controlPlane.user': ControlPlaneUser;\n 'controlPlaneCore.flow': ControlPlaneFlow;\n 'controlPlaneCore.issueMessageOverwrite': ControlPlaneIssueMessageOverwrite;\n}\n\nclass ControlPlaneSchemaTransformer extends OperationNodeTransformer {\n constructor(\n readonly schema: string,\n readonly issueMessageOverwriteSchema: string\n ) {\n super();\n }\n\n protected override transformSchemableIdentifier(\n node: SchemableIdentifierNode,\n queryId: QueryId\n ): SchemableIdentifierNode {\n const transformed = super.transformSchemableIdentifier(node, queryId);\n if (\n transformed.schema?.name === 'controlPlane' ||\n transformed.schema?.name === 'control_plane'\n ) {\n return { ...transformed, schema: IdentifierNode.create(this.schema) };\n }\n if (\n transformed.schema?.name === 'controlPlaneCore' ||\n transformed.schema?.name === 'control_plane_core'\n ) {\n return {\n ...transformed,\n schema: IdentifierNode.create(this.issueMessageOverwriteSchema),\n };\n }\n return transformed;\n }\n\n protected override transformFunction(\n node: FunctionNode,\n queryId: QueryId\n ): FunctionNode {\n const transformed = super.transformFunction(node, queryId);\n return node.func.startsWith('controlPlane.')\n ? {\n ...transformed,\n func: `${this.schema}.${transformed.func.slice('controlPlane.'.length)}`,\n }\n : transformed;\n }\n}\n\nclass ControlPlaneSchemaPlugin implements KyselyPlugin {\n readonly #transformer: ControlPlaneSchemaTransformer;\n\n constructor(schema: string, issueMessageOverwriteSchema: string) {\n this.#transformer = new ControlPlaneSchemaTransformer(\n schema,\n issueMessageOverwriteSchema\n );\n }\n\n transformQuery(args: PluginTransformQueryArgs): RootOperationNode {\n return this.#transformer.transformNode(args.node, args.queryId);\n }\n\n async transformResult(\n args: PluginTransformResultArgs\n ): Promise<QueryResult<UnknownRow>> {\n return args.result;\n }\n}\n\nexport function withControlPlaneSchema(\n kysely: Kysely<ControlPlaneDB>,\n schema: string,\n issueMessageOverwriteSchema = 'core'\n) {\n return kysely.withPlugin(\n new ControlPlaneSchemaPlugin(schema, issueMessageOverwriteSchema)\n );\n}\n"]}
@@ -8,12 +8,22 @@ export * from './postgres-error';
8
8
  export * from './query';
9
9
  export * from './regional';
10
10
  export * from './transaction';
11
+ import type { TenantDataRegion } from './regional';
11
12
  import type { DB } from './v1.generated';
12
13
  type KyselyOpts = {
14
+ dataRegion?: TenantDataRegion;
13
15
  hyperdrive?: true;
16
+ onRetryDiagnostic?: (diagnostic: PostgresRetryDiagnostic) => void;
14
17
  repositoryName?: string;
15
18
  log?: true | LogConfig;
16
19
  };
20
+ type PostgresRetryDiagnostic = {
21
+ attemptCount: number;
22
+ dataRegion?: TenantDataRegion;
23
+ operationKind: 'acquisition' | 'mutation' | 'select' | 'transaction';
24
+ outcome: 'exhausted' | 'notRetryable' | 'retrying';
25
+ repositoryName?: string;
26
+ };
17
27
  type PgOpt = {
18
28
  forceDisableSSL?: boolean;
19
29
  probe?: true;
@@ -25,5 +35,6 @@ export type ControlPlaneTransaction = T<ControlPlaneDB>;
25
35
  export declare function useKysely<Database = DB>(postgres: Sql, options?: KyselyOpts): K<Database>;
26
36
  export declare function useAsyncPostgres(connectionString: string, opt?: PgOpt): Promise<postgres.Sql<{}>>;
27
37
  export declare function useAsyncKysely(connectionString: string, opt?: PgOpt & KyselyOpts): Promise<K<DB>>;
38
+ export declare function useAsyncNeonWebSocketKysely(connectionString: string, opt?: Pick<PgOpt, 'probe'> & KyselyOpts): Promise<K<DB>>;
28
39
  export declare function useAsyncControlPlaneKysely(connectionString: string, opt?: PgOpt & KyselyOpts): Promise<K<ControlPlaneDB>>;
29
40
  export declare function forceCloseAllPostgres(timeoutMs?: number): Promise<void>;
@@ -20,9 +20,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.useKysely = useKysely;
21
21
  exports.useAsyncPostgres = useAsyncPostgres;
22
22
  exports.useAsyncKysely = useAsyncKysely;
23
+ exports.useAsyncNeonWebSocketKysely = useAsyncNeonWebSocketKysely;
23
24
  exports.useAsyncControlPlaneKysely = useAsyncControlPlaneKysely;
24
25
  exports.forceCloseAllPostgres = forceCloseAllPostgres;
25
26
  const exponential_backoff_1 = require("exponential-backoff");
27
+ const serverless_1 = require("@neondatabase/serverless");
28
+ const kysely_1 = require("kysely");
26
29
  const kysely_postgres_js_1 = require("kysely-postgres-js");
27
30
  const postgres_1 = __importDefault(require("postgres"));
28
31
  const control_plane_1 = require("./control-plane");
@@ -46,18 +49,72 @@ function isRetryableConnectionError(error) {
46
49
  const message = error instanceof Error ? error.message : String(error);
47
50
  return retryableMessages.some((retryable) => message.includes(retryable));
48
51
  }
49
- function retryPostgres(operation, retry) {
50
- return (0, exponential_backoff_1.backOff)(operation, {
51
- numOfAttempts: postgresRetryAttempts,
52
- startingDelay: (0, utils_1.parseDuration)('1s'),
53
- maxDelay: (0, utils_1.parseDuration)('5s'),
54
- retry: (error, attemptNumber) => attemptNumber < postgresRetryAttempts && retry(error, attemptNumber),
55
- });
52
+ function isConnectionReset(error) {
53
+ return (error instanceof Error && 'code' in error && error.code === 'ECONNRESET');
54
+ }
55
+ function isRetryableConnectionAcquisitionError(error) {
56
+ return (isRetryableConnectionError(error) ||
57
+ isConnectionReset(error) ||
58
+ (error instanceof Error &&
59
+ (error.message === 'connection attempt failed' ||
60
+ ('code' in error && error.code === 'CONNECTION_DESTROYED'))));
61
+ }
62
+ function isQueryRetryDiagnosticError(error) {
63
+ const message = error instanceof Error ? error.message : String(error);
64
+ return (isRetryableConnectionError(error) ||
65
+ isConnectionReset(error) ||
66
+ message === 'Egress connection severed outside of Hyperdrive' ||
67
+ message === 'Network connection lost.' ||
68
+ message === 'Node shutting down' ||
69
+ message === 'Node shutting down.');
70
+ }
71
+ async function retryPostgres(operation, retry, diagnostic) {
72
+ let attemptCount = 0;
73
+ let retried = false;
74
+ const emitDiagnostic = (outcome) => {
75
+ if (!diagnostic)
76
+ return;
77
+ diagnostic.emit({
78
+ attemptCount,
79
+ dataRegion: diagnostic.dataRegion,
80
+ operationKind: diagnostic.operationKind,
81
+ outcome,
82
+ repositoryName: diagnostic.repositoryName,
83
+ });
84
+ };
85
+ try {
86
+ return await (0, exponential_backoff_1.backOff)(async () => {
87
+ attemptCount++;
88
+ return await operation();
89
+ }, {
90
+ numOfAttempts: postgresRetryAttempts,
91
+ startingDelay: (0, utils_1.parseDuration)('1s'),
92
+ maxDelay: (0, utils_1.parseDuration)('5s'),
93
+ async retry(error, attemptNumber) {
94
+ const shouldRetry = attemptNumber < postgresRetryAttempts &&
95
+ (await retry(error, attemptNumber));
96
+ if (shouldRetry && diagnostic) {
97
+ retried = true;
98
+ emitDiagnostic('retrying');
99
+ }
100
+ return shouldRetry;
101
+ },
102
+ });
103
+ }
104
+ catch (error) {
105
+ if (diagnostic?.shouldEmit(error)) {
106
+ emitDiagnostic(retried && attemptCount === postgresRetryAttempts
107
+ ? 'exhausted'
108
+ : 'notRetryable');
109
+ }
110
+ throw error;
111
+ }
56
112
  }
57
113
  class RetryingPostgresJSDialect extends kysely_postgres_js_1.PostgresJSDialect {
58
- constructor(config) {
114
+ constructor(config, retryDiagnostic) {
59
115
  super(config);
60
116
  this.config = config;
117
+ this.retryDiagnostic = retryDiagnostic;
61
118
  }
62
119
  createDriver() {
63
120
  const driver = new kysely_postgres_js_1.PostgresJSDriver(this.config);
@@ -76,21 +133,37 @@ class RetryingPostgresJSDialect extends kysely_postgres_js_1.PostgresJSDialect {
76
133
  inTransaction: false,
77
134
  };
78
135
  const connection = {
79
- executeQuery: (compiledQuery) => retryPostgres(() => state.connection.executeQuery(compiledQuery), async (error) => {
80
- const message = error instanceof Error ? error.message : String(error);
81
- if (state.inTransaction ||
82
- (!isRetryableConnectionError(error) &&
83
- (compiledQuery.query.kind !== 'SelectQueryNode' ||
84
- (message !==
85
- 'Egress connection severed outside of Hyperdrive' &&
86
- message !== 'Network connection lost.')))) {
87
- return false;
88
- }
89
- // Postgres.js already ejects a severed reserved connection.
90
- // Acquire a new reservation before replaying the safe read.
91
- state.connection = await driver.acquireConnection();
92
- return true;
93
- }),
136
+ executeQuery: (compiledQuery) => {
137
+ const operationKind = state.inTransaction
138
+ ? 'transaction'
139
+ : compiledQuery.query.kind === 'SelectQueryNode'
140
+ ? 'select'
141
+ : 'mutation';
142
+ return retryPostgres(() => state.connection.executeQuery(compiledQuery), async (error) => {
143
+ const message = error instanceof Error ? error.message : String(error);
144
+ if (state.inTransaction ||
145
+ (!isRetryableConnectionError(error) &&
146
+ (compiledQuery.query.kind !== 'SelectQueryNode' ||
147
+ (!isConnectionReset(error) &&
148
+ message !==
149
+ 'Egress connection severed outside of Hyperdrive' &&
150
+ message !== 'Network connection lost.' &&
151
+ message !== 'Node shutting down' &&
152
+ message !== 'Node shutting down.')))) {
153
+ return false;
154
+ }
155
+ // Postgres.js already ejects a severed reserved connection.
156
+ // Acquire a new reservation before replaying the safe read.
157
+ state.connection = await driver.acquireConnection();
158
+ return true;
159
+ }, this.retryDiagnostic
160
+ ? {
161
+ ...this.retryDiagnostic,
162
+ operationKind,
163
+ shouldEmit: isQueryRetryDiagnosticError,
164
+ }
165
+ : undefined);
166
+ },
94
167
  streamQuery: (compiledQuery, chunkSize) => {
95
168
  if (chunkSize === undefined) {
96
169
  throw new Error('Postgres stream chunk size is required');
@@ -143,16 +216,35 @@ class RetryingPostgresJSDialect extends kysely_postgres_js_1.PostgresJSDialect {
143
216
  }
144
217
  function useKysely(postgres, options) {
145
218
  console.debug('Creating Kysely instance');
219
+ const emitRetryDiagnostic = options?.onRetryDiagnostic ??
220
+ (options?.repositoryName
221
+ ? (diagnostic) => console.warn('Postgres operation retry diagnostic', diagnostic)
222
+ : undefined);
146
223
  const reserveConnection = postgres.reserve.bind(postgres);
147
224
  postgres.reserve = async () => {
148
- const connection = await retryPostgres(reserveConnection, isRetryableConnectionError);
225
+ const connection = await retryPostgres(reserveConnection, isRetryableConnectionAcquisitionError, emitRetryDiagnostic
226
+ ? {
227
+ dataRegion: options?.dataRegion,
228
+ emit: emitRetryDiagnostic,
229
+ operationKind: 'acquisition',
230
+ repositoryName: options?.repositoryName,
231
+ shouldEmit: isRetryableConnectionAcquisitionError,
232
+ }
233
+ : undefined);
149
234
  if (options?.hyperdrive) {
150
235
  const unsafe = connection.unsafe;
151
236
  connection.unsafe = (query, parameters, queryOptions) => unsafe(query, parameters, { ...queryOptions, prepare: true });
152
237
  }
153
238
  return connection;
154
239
  };
155
- const kysely = (0, plugins_1.getKysely)(new RetryingPostgresJSDialect({ postgres }), {
240
+ const kysely = (0, plugins_1.getKysely)(new RetryingPostgresJSDialect({ postgres }, emitRetryDiagnostic
241
+ ? {
242
+ dataRegion: options?.dataRegion,
243
+ emit: emitRetryDiagnostic,
244
+ repositoryName: options?.repositoryName,
245
+ shouldEmit: isQueryRetryDiagnosticError,
246
+ }
247
+ : undefined), {
156
248
  repositoryName: options?.repositoryName,
157
249
  log: options?.log,
158
250
  });
@@ -176,8 +268,9 @@ async function useAsyncPostgres(connectionString, opt) {
176
268
  if (_connections.length > 0)
177
269
  console.warn(`We already have ${_connections.length} Postgres connections`);
178
270
  for (let attempt = 1; attempt <= retries; attempt++) {
271
+ let sql;
179
272
  try {
180
- const sql = (0, postgres_1.default)(connectionString, {
273
+ sql = (0, postgres_1.default)(connectionString, {
181
274
  ssl: ssl ? 'require' : false,
182
275
  target_session_attrs: 'read-write',
183
276
  // enable prepare statements, pgbouncer on crunchy allows for prepared statements
@@ -203,6 +296,7 @@ async function useAsyncPostgres(connectionString, opt) {
203
296
  return sql;
204
297
  }
205
298
  catch (err) {
299
+ await sql?.end({ timeout: 0 }).catch(() => undefined);
206
300
  if (attempt === retries)
207
301
  throw err;
208
302
  console.warn(`Postgres connection failed (attempt ${attempt}), retrying...`);
@@ -216,6 +310,17 @@ async function useAsyncKysely(connectionString, opt) {
216
310
  const sql = await useAsyncPostgres(connectionString, opt);
217
311
  return useKysely(sql, opt);
218
312
  }
313
+ async function useAsyncNeonWebSocketKysely(connectionString, opt) {
314
+ const pool = new serverless_1.Pool({ connectionString, max: 5 });
315
+ const kysely = (0, plugins_1.getKysely)(new kysely_1.PostgresDialect({ pool }), opt ?? {});
316
+ kysely.destroy = async () => {
317
+ console.debug('Closing Neon WebSocket Kysely connection');
318
+ await pool.end();
319
+ };
320
+ if (opt?.probe)
321
+ await pool.query('select 1');
322
+ return kysely;
323
+ }
219
324
  async function useAsyncControlPlaneKysely(connectionString, opt) {
220
325
  const sql = await useAsyncPostgres(connectionString, opt);
221
326
  return (0, control_plane_1.withControlPlaneSchema)(useKysely(sql, opt), 'public');