@vrplatform/kysely 1.3.45-4998 → 1.3.45-5

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 (183) hide show
  1. package/build/.data.tar +0 -0
  2. package/build/main/camel-case/index.js +1 -1
  3. package/build/main/camel-case/index.js.map +1 -1
  4. package/build/main/control-plane/index.d.ts +216 -17
  5. package/build/main/control-plane/index.js +61 -0
  6. package/build/main/control-plane/index.js.map +1 -1
  7. package/build/main/domain.d.ts +4 -0
  8. package/build/main/domain.js +3 -0
  9. package/build/main/domain.js.map +1 -0
  10. package/build/main/index.d.ts +6 -11
  11. package/build/main/index.js +127 -57
  12. package/build/main/index.js.map +1 -1
  13. package/build/main/isomorphic.d.ts +5 -5
  14. package/build/main/isomorphic.js +2 -8
  15. package/build/main/isomorphic.js.map +1 -1
  16. package/build/main/local/digest.d.ts +3 -3
  17. package/build/main/local/digest.js.map +1 -1
  18. package/build/main/local/generate.js +9 -8
  19. package/build/main/local/generate.js.map +1 -1
  20. package/build/main/local/index.d.ts +5 -1
  21. package/build/main/local/index.js +214 -4
  22. package/build/main/local/index.js.map +1 -1
  23. package/build/main/local/prune-pulled-schema.js +4 -1
  24. package/build/main/local/prune-pulled-schema.js.map +1 -1
  25. package/build/main/migration.d.ts +7 -0
  26. package/build/main/migration.js +11 -0
  27. package/build/main/migration.js.map +1 -0
  28. package/build/main/query/listing/status.d.ts +0 -10
  29. package/build/main/query/listing/status.js +2 -14
  30. package/build/main/query/listing/status.js.map +1 -1
  31. package/build/main/query/tenant/status.d.ts +5 -8
  32. package/build/main/query/tenant/status.js +18 -21
  33. package/build/main/query/tenant/status.js.map +1 -1
  34. package/build/main/regional.d.ts +6 -1
  35. package/build/main/regional.js +13 -9
  36. package/build/main/regional.js.map +1 -1
  37. package/build/main/test/index.d.ts +3 -14
  38. package/build/main/test/index.js +0 -23
  39. package/build/main/test/index.js.map +1 -1
  40. package/build/main/transaction.d.ts +3 -3
  41. package/build/main/transaction.js.map +1 -1
  42. package/build/main/v1.generated.d.ts +501 -134
  43. package/build/main/v1.generated.js.map +1 -1
  44. package/build/migrations-v2/0000000000000-baseline.ts +5 -0
  45. package/build/migrations-v2/0000000000001-public-audit-events-v2.ts +137 -0
  46. package/build/migrations-v2/0000000000002-audit-recovery-watermarks.ts +30 -0
  47. package/build/migrations-v2/0000000000003-audit-effect-recovery-watermark.ts +13 -0
  48. package/build/migrations-v2/0000000000004-audit-event-projected-at.ts +15 -0
  49. package/build/migrations-v2/0000000000005-audit-recovery-indexes.ts +63 -0
  50. package/build/migrations-v2/0000000000006-audit-action-public-event-projected-at.ts +22 -0
  51. package/build/migrations-v2/0000000000007-audit-action-public-event-projected-at-backfill.ts +35 -0
  52. package/build/migrations-v2/0000000000008-global-user-attribution.ts +33 -0
  53. package/build/migrations-v2/0000000000008-team-issue-rule-state.ts +52 -0
  54. package/build/migrations-v2/0000000000009-reservation-issue-projections.ts +45 -0
  55. package/build/migrations-v2/0000000000010-bank-rule-application-bank-record-delete-cascade.ts +26 -0
  56. package/build/migrations-v2/0000000000011-guest-balance-journal-entry-lookup-index.ts +25 -0
  57. package/build/migrations-v2/0000000000012-trial-free-analytics-billing-status.ts +72 -0
  58. package/build/migrations-v2/0000000000013-ui-permission-bundles.ts +45 -0
  59. package/build/migrations-v2/0000000000014-ui-permission-bundle-top-up.ts +32 -0
  60. package/build/migrations-v2/0000000000016-managed-team-access.ts +34 -0
  61. package/build/migrations-v2/0000000000017-drop-trial-until.ts +42 -0
  62. package/build/migrations-v2/0000000000018-accounting-integrity-monitoring.ts +276 -0
  63. package/build/migrations-v2/0000000000019-accounting-integrity-run-shards.ts +26 -0
  64. package/build/migrations-v2/0000000000020-accounting-integrity-case-classification.ts +52 -0
  65. package/build/migrations-v2/0000000000021-payment-line-classification-monitor-indexes.ts +31 -0
  66. package/build/migrations-v2/0000000000022-accounting-integrity-controlled-repairs.ts +281 -0
  67. package/build/migrations-v2/0000000000023-line-classification-usage.ts +325 -0
  68. package/build/migrations-v2/0000000000024-tenant-region-migration.ts +108 -0
  69. package/build/migrations-v2/0000000000025-partner-ach-denial-default.ts +30 -0
  70. package/build/migrations-v2/0000000000026-line-classification-usage-capture.ts +399 -0
  71. package/build/migrations-v2/0000000000027-payout-replacement-chain.ts +27 -0
  72. package/build/migrations-v2/0000000000028-accounting-integrity-operator-workflow.ts +108 -0
  73. package/build/migrations-v2/0000000000029-accounting-integrity-definition-artifacts.ts +40 -0
  74. package/build/migrations-v2/0000000000030-accounting-integrity-review-metadata-compatibility.ts +49 -0
  75. package/build/module/camel-case/index.js +1 -1
  76. package/build/module/camel-case/index.js.map +1 -1
  77. package/build/module/control-plane/index.d.ts +216 -17
  78. package/build/module/control-plane/index.js +49 -1
  79. package/build/module/control-plane/index.js.map +1 -1
  80. package/build/module/domain.d.ts +4 -0
  81. package/build/module/domain.js +2 -0
  82. package/build/module/domain.js.map +1 -0
  83. package/build/module/index.d.ts +6 -11
  84. package/build/module/index.js +129 -55
  85. package/build/module/index.js.map +1 -1
  86. package/build/module/isomorphic.d.ts +5 -5
  87. package/build/module/isomorphic.js +1 -6
  88. package/build/module/isomorphic.js.map +1 -1
  89. package/build/module/local/digest.d.ts +3 -3
  90. package/build/module/local/digest.js.map +1 -1
  91. package/build/module/local/generate.js +9 -8
  92. package/build/module/local/generate.js.map +1 -1
  93. package/build/module/local/index.d.ts +5 -1
  94. package/build/module/local/index.js +215 -5
  95. package/build/module/local/index.js.map +1 -1
  96. package/build/module/local/prune-pulled-schema.js +4 -1
  97. package/build/module/local/prune-pulled-schema.js.map +1 -1
  98. package/build/module/migration.d.ts +7 -0
  99. package/build/module/migration.js +8 -0
  100. package/build/module/migration.js.map +1 -0
  101. package/build/module/query/listing/status.d.ts +0 -10
  102. package/build/module/query/listing/status.js +2 -12
  103. package/build/module/query/listing/status.js.map +1 -1
  104. package/build/module/query/tenant/status.d.ts +5 -8
  105. package/build/module/query/tenant/status.js +18 -21
  106. package/build/module/query/tenant/status.js.map +1 -1
  107. package/build/module/regional.d.ts +6 -1
  108. package/build/module/regional.js +13 -9
  109. package/build/module/regional.js.map +1 -1
  110. package/build/module/test/index.d.ts +3 -14
  111. package/build/module/test/index.js +1 -23
  112. package/build/module/test/index.js.map +1 -1
  113. package/build/module/transaction.d.ts +3 -3
  114. package/build/module/transaction.js.map +1 -1
  115. package/build/module/v1.generated.d.ts +501 -134
  116. package/build/module/v1.generated.js.map +1 -1
  117. package/package.json +3 -3
  118. package/build/migrations/0000000000001-init.ts +0 -5
  119. package/build/migrations/0000000000009-drop-store-schema.ts +0 -14
  120. package/build/migrations/0000000000010-bank-rules.ts +0 -190
  121. package/build/migrations/0000000000011-bank-rule-line-adjustments.ts +0 -65
  122. package/build/migrations/0000000000012-bank-rule-conditions.ts +0 -45
  123. package/build/migrations/0000000000013-bank-rule-name-unique.ts +0 -15
  124. package/build/migrations/0000000000014-bank-rule-drop-legacy-conditions.ts +0 -41
  125. package/build/migrations/0000000000015-booking-channel-logo-dev-provider.ts +0 -70
  126. package/build/migrations/0000000000016-owner-statement-draft-status.ts +0 -22
  127. package/build/migrations/0000000000017-tenant-migration-markers.ts +0 -18
  128. package/build/migrations/0000000000018-security-deposits-payable-category.ts +0 -63
  129. package/build/migrations/0000000000019-tenant-app-settings.ts +0 -76
  130. package/build/migrations/0000000000020-operating-opening-trial-balance.ts +0 -36
  131. package/build/migrations/0000000000021-audit-foreign-key-indexes.ts +0 -77
  132. package/build/migrations/0000000000022-opening-trial-balance-combined-columns.ts +0 -30
  133. package/build/migrations/0000000000023-journal-entry-currency-mismatch-reason.ts +0 -14
  134. package/build/migrations/0000000000024-listing-parent.ts +0 -37
  135. package/build/migrations/0000000000025-journal-entry-parent-listing.ts +0 -26
  136. package/build/migrations/0000000000026-booking-channel-logo-slots.ts +0 -89
  137. package/build/migrations/0000000000027-list-browse-performance-indexes.ts +0 -52
  138. package/build/migrations/0000000000028-flow-setting-status-jsonb.ts +0 -20
  139. package/build/migrations/0000000000029-tenant-slug.ts +0 -328
  140. package/build/migrations/0000000000030-pms-accounting-windows.ts +0 -50
  141. package/build/migrations/0000000000031-owner-statement-projection-listing-revision.ts +0 -20
  142. package/build/migrations/0000000000032-flow-event-listening.ts +0 -28
  143. package/build/migrations/0000000000033-opening-trial-balance-transaction.ts +0 -272
  144. package/build/migrations/0000000000034-historic-general-ledger.ts +0 -24
  145. package/build/migrations/0000000000035-tenant-regional-placement.ts +0 -37
  146. package/build/migrations/0000000000036-control-plane-projection-events.ts +0 -43
  147. package/build/migrations/0000000000037-tenant-guide-onboarding.ts +0 -21
  148. package/build/migrations/0000000000038-tracking-event-analytics-sink.ts +0 -31
  149. package/build/migrations/0000000000039-crunchy-region.ts +0 -86
  150. package/build/migrations/0000000000040-hostaway-region.ts +0 -72
  151. package/build/migrations/0000000000041-audit-tenant-fk.ts +0 -66
  152. package/build/migrations/0000000000042-ramp-staging-connect-params.ts +0 -35
  153. package/build/migrations/0000000000043-gl-pms-accounting-window-guard.ts +0 -125
  154. package/build/migrations/0000000000044-tenant-cross-region-fks.ts +0 -45
  155. package/build/migrations/0000000000045-cloudflare-region-env.ts +0 -100
  156. package/build/migrations/0000000000046-control-plane-outbox-alias.ts +0 -46
  157. package/build/migrations/0000000000047-ramp-contact-last-4-digits.ts +0 -16
  158. package/build/migrations/0000000000047-tenant-status-backfill.ts +0 -40
  159. package/build/migrations/0000000000048-tenant-status-constraint.ts +0 -24
  160. package/build/migrations/0000000000049-health-tenant-issues.ts +0 -69
  161. package/build/migrations/0000000000050-partner-webhooks.ts +0 -135
  162. package/build/migrations/0000000000051-health-webhook-runtime-grants.ts +0 -42
  163. package/build/migrations/0000000000052-feature-approval-team-enablement.ts +0 -13
  164. package/build/migrations/0000000000053-health-webhook-enums.ts +0 -296
  165. package/build/migrations/0000000000054-user-secondary-emails-jsonb.ts +0 -25
  166. package/build/migrations/0000000000055-outbound-webhooks-v1.ts +0 -221
  167. package/build/migrations/0000000000056-connection-webhook-version.ts +0 -18
  168. package/build/migrations/0000000000057-sync-webhook-version.ts +0 -18
  169. package/build/migrations/0000000000058-reservation-webhook-version.ts +0 -18
  170. package/build/migrations/0000000000059-listing-webhook-version.ts +0 -18
  171. package/build/migrations/0000000000060-owner-statement-webhook-version.ts +0 -19
  172. package/build/migrations/0000000000061-transaction-webhook-version.ts +0 -18
  173. package/build/migrations/0000000000062-plaid-connect-session.ts +0 -102
  174. package/build/migrations/0000000000063-pgcrypto.ts +0 -27
  175. package/build/migrations/0000000000064-partner-api-foundation.ts +0 -36
  176. package/build/migrations/0000000000065-canonical-jsonb-shapes.ts +0 -231
  177. package/build/migrations/0000000000066-source-delete-fk-indexes.ts +0 -20
  178. package/build/migrations/0000000000067-remove-opening-trial-balance-account-columns.ts +0 -34
  179. package/build/migrations/0000000000068-bank-record-account-delete-cascade.ts +0 -26
  180. package/build/migrations/0000000000069-account-connections.ts +0 -204
  181. package/build/migrations/0000000000070-provider-payment-projection-indexes.ts +0 -53
  182. package/build/migrations/0000000000071-tenant-app-settings-shape.ts +0 -39
  183. package/build/migrations/0000000000072-tenant-app-settings-shape-validation.ts +0 -11
@@ -40,6 +40,8 @@ const path = __importStar(require("node:path"));
40
40
  const pglite_1 = require("@electric-sql/pglite");
41
41
  const kysely_1 = require("kysely");
42
42
  const kysely_pglite_dialect_1 = require("kysely-pglite-dialect");
43
+ const control_plane_1 = require("../control-plane");
44
+ const migration_1 = require("../migration");
43
45
  const plugins_1 = require("../plugins");
44
46
  const digest_1 = require("./digest");
45
47
  exports.root = path.join(__dirname, '../..');
@@ -47,13 +49,13 @@ exports.dumpPath = path.join(exports.root, '.data.tar');
47
49
  async function migrateToLatest(kysely) {
48
50
  const migrator = new kysely_1.Migrator({
49
51
  db: kysely,
50
- migrationTableSchema: 'core',
51
- migrationTableName: 'kysely_migration',
52
- migrationLockTableName: 'kysely_migration_lock',
52
+ migrationTableSchema: migration_1.appMigrationEpoch.tableSchema,
53
+ migrationTableName: migration_1.appMigrationEpoch.tableName,
54
+ migrationLockTableName: migration_1.appMigrationEpoch.lockTableName,
53
55
  provider: new kysely_1.FileMigrationProvider({
54
56
  fs: node_fs_1.promises,
55
57
  path,
56
- migrationFolder: path.join(exports.root, 'migrations'),
58
+ migrationFolder: path.join(exports.root, migration_1.appMigrationEpoch.folder),
57
59
  }),
58
60
  });
59
61
  const { error } = await migrator.migrateToLatest();
@@ -76,6 +78,214 @@ async function useLocalKysely(args = {}) {
76
78
  await (0, digest_1.ensureDigestFunction)(kysely);
77
79
  await (0, digest_1.ensureGenRandomBytesFunction)(kysely);
78
80
  await migrateToLatest(kysely);
81
+ await (0, kysely_1.sql) `alter schema public rename to regional_public`.execute(kysely);
82
+ await (0, kysely_1.sql) `alter schema core rename to regional_core`.execute(kysely);
83
+ await (0, kysely_1.sql) `create schema public`.execute(kysely);
84
+ await (0, kysely_1.sql) `create schema core`.execute(kysely);
85
+ const controlPlaneBootstrapKysely = (0, plugins_1.getKysely)(dialect, {
86
+ repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane-bootstrap`,
87
+ });
88
+ const controlPlaneMigrator = new kysely_1.Migrator({
89
+ db: controlPlaneBootstrapKysely,
90
+ migrationTableSchema: 'public',
91
+ migrationTableName: 'control_plane_kysely_migration',
92
+ migrationLockTableName: 'control_plane_kysely_migration_lock',
93
+ provider: new kysely_1.FileMigrationProvider({
94
+ fs: node_fs_1.promises,
95
+ path,
96
+ migrationFolder: path.join(exports.root, 'control-plane-migrations'),
97
+ }),
98
+ });
99
+ const { error: controlPlaneMigrationError } = await controlPlaneMigrator.migrateToLatest();
100
+ if (controlPlaneMigrationError) {
101
+ throw controlPlaneMigrationError;
102
+ }
103
+ await (0, kysely_1.sql) `alter table core.flow set schema public`.execute(controlPlaneBootstrapKysely);
104
+ await (0, kysely_1.sql) `alter table core.issue_message_overwrite set schema public`.execute(controlPlaneBootstrapKysely);
105
+ await (0, kysely_1.sql) `drop schema core`.execute(controlPlaneBootstrapKysely);
106
+ await (0, kysely_1.sql) `alter schema public rename to control_plane`.execute(controlPlaneBootstrapKysely);
107
+ await (0, kysely_1.sql) `alter schema regional_public rename to public`.execute(controlPlaneBootstrapKysely);
108
+ await (0, kysely_1.sql) `alter schema regional_core rename to core`.execute(controlPlaneBootstrapKysely);
109
+ await (0, kysely_1.sql) `
110
+ do $$
111
+ declare
112
+ definition text;
113
+ begin
114
+ select pg_get_functiondef(
115
+ 'control_plane.normalize_tenant_slug(text)'::regprocedure
116
+ ) into definition;
117
+ execute replace(definition, 'public.', 'control_plane.');
118
+
119
+ select pg_get_functiondef(
120
+ 'control_plane.build_unique_tenant_slug(text,uuid)'::regprocedure
121
+ ) into definition;
122
+ execute replace(definition, 'public.', 'control_plane.');
123
+ end;
124
+ $$;
125
+ `.execute(controlPlaneBootstrapKysely);
126
+ await (0, kysely_1.sql) `
127
+ insert into control_plane.app (
128
+ authentication,
129
+ category,
130
+ color,
131
+ created_at,
132
+ icon,
133
+ icon_round,
134
+ id,
135
+ info,
136
+ name,
137
+ type,
138
+ version
139
+ )
140
+ select
141
+ authentication,
142
+ category,
143
+ color,
144
+ created_at,
145
+ icon,
146
+ icon_round,
147
+ id,
148
+ info,
149
+ name,
150
+ type,
151
+ version
152
+ from public.app
153
+ on conflict (id) do nothing;
154
+ `.execute(controlPlaneBootstrapKysely);
155
+ await (0, kysely_1.sql) `
156
+ insert into control_plane.currency (name)
157
+ select name
158
+ from public.currency
159
+ on conflict (name) do nothing;
160
+ `.execute(controlPlaneBootstrapKysely);
161
+ await (0, kysely_1.sql) `
162
+ insert into control_plane.booking_channel (
163
+ channel_ref,
164
+ color,
165
+ created_at,
166
+ icon,
167
+ icon_provider,
168
+ id,
169
+ last_generate_run,
170
+ logo,
171
+ logo_provider,
172
+ selected_booking_channel_icon_candidate_id,
173
+ selected_booking_channel_logo_candidate_id,
174
+ unique_ref,
175
+ updated_at
176
+ )
177
+ select
178
+ channel_ref,
179
+ color,
180
+ created_at,
181
+ icon,
182
+ icon_provider,
183
+ id,
184
+ last_generate_run,
185
+ logo,
186
+ logo_provider,
187
+ selected_booking_channel_icon_candidate_id,
188
+ selected_booking_channel_logo_candidate_id,
189
+ unique_ref,
190
+ updated_at
191
+ from public.booking_channel
192
+ on conflict (id) do nothing;
193
+ `.execute(controlPlaneBootstrapKysely);
194
+ await (0, kysely_1.sql) `
195
+ insert into control_plane.booking_channel_icon_candidate (
196
+ booking_channel_id,
197
+ cloudflare_image_id,
198
+ color,
199
+ comment,
200
+ created_at,
201
+ external_icon,
202
+ height,
203
+ id,
204
+ provider,
205
+ source,
206
+ updated_at,
207
+ width
208
+ )
209
+ select
210
+ booking_channel_id,
211
+ cloudflare_image_id,
212
+ color,
213
+ comment,
214
+ created_at,
215
+ external_icon,
216
+ height,
217
+ id,
218
+ provider,
219
+ source,
220
+ updated_at,
221
+ width
222
+ from public.booking_channel_icon_candidate
223
+ on conflict (id) do nothing;
224
+ `.execute(controlPlaneBootstrapKysely);
225
+ await (0, kysely_1.sql) `
226
+ insert into control_plane.tenant (
227
+ billing_partner_id,
228
+ billing_plan,
229
+ created_at,
230
+ data_region,
231
+ id,
232
+ name,
233
+ partner_id,
234
+ slug,
235
+ status,
236
+ storage_realm,
237
+ type,
238
+ unique_ref,
239
+ updated_at
240
+ )
241
+ select
242
+ billing_partner_id,
243
+ billing_plan,
244
+ created_at,
245
+ data_region,
246
+ id,
247
+ name,
248
+ partner_id,
249
+ slug,
250
+ status,
251
+ storage_realm,
252
+ type,
253
+ unique_ref,
254
+ updated_at
255
+ from public.tenant
256
+ on conflict (id) do nothing;
257
+ `.execute(controlPlaneBootstrapKysely);
258
+ await (0, kysely_1.sql) `
259
+ insert into control_plane.token (
260
+ created_at,
261
+ expires_at,
262
+ id,
263
+ nano_id,
264
+ payload,
265
+ tenant_id,
266
+ type,
267
+ user_id
268
+ )
269
+ select
270
+ created_at,
271
+ expires_at,
272
+ id,
273
+ nano_id,
274
+ payload,
275
+ tenant_id,
276
+ type,
277
+ user_id
278
+ from public.token
279
+ on conflict (id) do nothing;
280
+ `.execute(controlPlaneBootstrapKysely);
281
+ const controlPlaneKysely = (0, control_plane_1.withControlPlaneSchema)((0, plugins_1.getKysely)(dialect, {
282
+ repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane`,
283
+ log: args.log,
284
+ }), 'control_plane', 'control_plane');
285
+ controlPlaneKysely.destroy = async () => { };
286
+ Object.defineProperty(kysely, 'controlPlaneKysely', {
287
+ value: controlPlaneKysely,
288
+ });
79
289
  const originalDestroy = kysely.destroy.bind(kysely);
80
290
  kysely.destroy = async () => {
81
291
  if (isDestroyed)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"src/","sources":["local/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,wCAgCC;AApED,qCAAyC;AACzC,gDAAkC;AAClC,iDAA8C;AAC9C,mCAAyE;AACzE,iEAAsD;AACtD,wCAAuC;AAEvC,qCAA8E;AAEjE,QAAA,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACrC,QAAA,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAI,EAAE,WAAW,CAAC,CAAC;AAOrD,KAAK,UAAU,eAAe,CAAC,MAAmC;IAChE,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAAC;QAC5B,EAAE,EAAE,MAAM;QACV,oBAAoB,EAAE,MAAM;QAC5B,kBAAkB,EAAE,kBAAkB;QACtC,sBAAsB,EAAE,uBAAuB;QAC/C,QAAQ,EAAE,IAAI,8BAAqB,CAAC;YAClC,EAAE,EAAF,kBAAE;YACF,IAAI;YACJ,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,YAAI,EAAE,YAAY,CAAC;SAC/C,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;IACnD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,OAA8B,EAAE;IACnE,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,iCAAiC;IAEjC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAQ,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC;QACxB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,qCAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,mBAAS,EAAC,OAAO,EAAE;QAChC,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,cAAc;QACtD,GAAG,EAAE,IAAI,EAAE,GAAG;KACf,CAAC,CAAC;IACH,MAAM,IAAA,6BAAoB,EAAC,MAAM,CAAC,CAAC;IACnC,MAAM,IAAA,qCAA4B,EAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,eAAe,CAAC,MAAqC,CAAC,CAAC;IAE7D,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,WAAW;YAAE,OAAO;QACxB,WAAW,GAAG,IAAI,CAAC;QACnB,wCAAwC;QACxC,MAAM,eAAe,EAAE,CAAC;QACxB,cAAc;QACd,0EAA0E;QAC1E,IAAI;IACN,CAAC,CAAC;IAEF,iFAAiF;IAEjF,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { PGlite } from '@electric-sql/pglite';\nimport { FileMigrationProvider, type LogConfig, Migrator } from 'kysely';\nimport { PGliteDialect } from 'kysely-pglite-dialect';\nimport { getKysely } from '../plugins';\nimport type { DB } from '../v1.generated';\nimport { ensureDigestFunction, ensureGenRandomBytesFunction } from './digest';\n\nexport const root = path.join(__dirname, '../..');\nexport const dumpPath = path.join(root, '.data.tar');\n\nexport type UseLocalKyselyOptions = {\n repositoryName?: string;\n log?: true | LogConfig;\n};\n\nasync function migrateToLatest(kysely: import('kysely').Kysely<DB>) {\n const migrator = new Migrator({\n db: kysely,\n migrationTableSchema: 'core',\n migrationTableName: 'kysely_migration',\n migrationLockTableName: 'kysely_migration_lock',\n provider: new FileMigrationProvider({\n fs,\n path,\n migrationFolder: path.join(root, 'migrations'),\n }),\n });\n\n const { error } = await migrator.migrateToLatest();\n if (error) {\n throw error;\n }\n}\n\nexport async function useLocalKysely(args: UseLocalKyselyOptions = {}) {\n let isDestroyed = false;\n // const now = performance.now();\n\n const dump = Bun.file(dumpPath);\n\n const pglite = new PGlite({\n loadDataDir: dump,\n });\n const dialect = new PGliteDialect(pglite);\n const kysely = getKysely(dialect, {\n repositoryName: args?.repositoryName ?? 'localTesting',\n log: args?.log,\n });\n await ensureDigestFunction(kysely);\n await ensureGenRandomBytesFunction(kysely);\n await migrateToLatest(kysely as import('kysely').Kysely<DB>);\n\n const originalDestroy = kysely.destroy.bind(kysely);\n kysely.destroy = async () => {\n if (isDestroyed) return;\n isDestroyed = true;\n //const destroyTime = performance.now();\n await originalDestroy();\n //console.log(\n // `Database destroyed: ${Math.round(performance.now() - destroyTime)}ms`\n //);\n };\n\n // console.log(`Database initialized: ${Math.round(performance.now() - now)}ms`);\n\n return kysely;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["local/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { PGlite } from '@electric-sql/pglite';\nimport { FileMigrationProvider, type LogConfig, Migrator, sql } from 'kysely';\nimport { PGliteDialect } from 'kysely-pglite-dialect';\nimport { type ControlPlaneDB, withControlPlaneSchema } from '../control-plane';\nimport type { ControlPlaneKysely } from '../index';\nimport { appMigrationEpoch } from '../migration';\nimport { getKysely } from '../plugins';\nimport type { DB } from '../v1.generated';\nimport { ensureDigestFunction, ensureGenRandomBytesFunction } from './digest';\n\nexport const root = path.join(__dirname, '../..');\nexport const dumpPath = path.join(root, '.data.tar');\n\nexport type UseLocalKyselyOptions = {\n repositoryName?: string;\n log?: true | LogConfig;\n};\n\nexport type LocalKysely = import('kysely').Kysely<DB> & {\n controlPlaneKysely: ControlPlaneKysely;\n};\n\nasync function migrateToLatest<Database>(\n kysely: import('kysely').Kysely<Database>\n) {\n const migrator = new Migrator({\n db: kysely,\n migrationTableSchema: appMigrationEpoch.tableSchema,\n migrationTableName: appMigrationEpoch.tableName,\n migrationLockTableName: appMigrationEpoch.lockTableName,\n provider: new FileMigrationProvider({\n fs,\n path,\n migrationFolder: path.join(root, appMigrationEpoch.folder),\n }),\n });\n\n const { error } = await migrator.migrateToLatest();\n if (error) {\n throw error;\n }\n}\n\nexport async function useLocalKysely(\n args: UseLocalKyselyOptions = {}\n): Promise<LocalKysely> {\n let isDestroyed = false;\n // const now = performance.now();\n\n const dump = Bun.file(dumpPath);\n\n const pglite = new PGlite({\n loadDataDir: dump,\n });\n const dialect = new PGliteDialect(pglite);\n const kysely = getKysely<DB>(dialect, {\n repositoryName: args?.repositoryName ?? 'localTesting',\n log: args?.log,\n });\n await ensureDigestFunction(kysely);\n await ensureGenRandomBytesFunction(kysely);\n await migrateToLatest(kysely);\n\n await sql`alter schema public rename to regional_public`.execute(kysely);\n await sql`alter schema core rename to regional_core`.execute(kysely);\n await sql`create schema public`.execute(kysely);\n await sql`create schema core`.execute(kysely);\n\n const controlPlaneBootstrapKysely = getKysely<ControlPlaneDB>(dialect, {\n repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane-bootstrap`,\n });\n const controlPlaneMigrator = new Migrator({\n db: controlPlaneBootstrapKysely,\n migrationTableSchema: 'public',\n migrationTableName: 'control_plane_kysely_migration',\n migrationLockTableName: 'control_plane_kysely_migration_lock',\n provider: new FileMigrationProvider({\n fs,\n path,\n migrationFolder: path.join(root, 'control-plane-migrations'),\n }),\n });\n const { error: controlPlaneMigrationError } =\n await controlPlaneMigrator.migrateToLatest();\n if (controlPlaneMigrationError) {\n throw controlPlaneMigrationError;\n }\n\n await sql`alter table core.flow set schema public`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`alter table core.issue_message_overwrite set schema public`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`drop schema core`.execute(controlPlaneBootstrapKysely);\n await sql`alter schema public rename to control_plane`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`alter schema regional_public rename to public`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`alter schema regional_core rename to core`.execute(\n controlPlaneBootstrapKysely\n );\n await sql`\n do $$\n declare\n definition text;\n begin\n select pg_get_functiondef(\n 'control_plane.normalize_tenant_slug(text)'::regprocedure\n ) into definition;\n execute replace(definition, 'public.', 'control_plane.');\n\n select pg_get_functiondef(\n 'control_plane.build_unique_tenant_slug(text,uuid)'::regprocedure\n ) into definition;\n execute replace(definition, 'public.', 'control_plane.');\n end;\n $$;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.app (\n authentication,\n category,\n color,\n created_at,\n icon,\n icon_round,\n id,\n info,\n name,\n type,\n version\n )\n select\n authentication,\n category,\n color,\n created_at,\n icon,\n icon_round,\n id,\n info,\n name,\n type,\n version\n from public.app\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.currency (name)\n select name\n from public.currency\n on conflict (name) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.booking_channel (\n channel_ref,\n color,\n created_at,\n icon,\n icon_provider,\n id,\n last_generate_run,\n logo,\n logo_provider,\n selected_booking_channel_icon_candidate_id,\n selected_booking_channel_logo_candidate_id,\n unique_ref,\n updated_at\n )\n select\n channel_ref,\n color,\n created_at,\n icon,\n icon_provider,\n id,\n last_generate_run,\n logo,\n logo_provider,\n selected_booking_channel_icon_candidate_id,\n selected_booking_channel_logo_candidate_id,\n unique_ref,\n updated_at\n from public.booking_channel\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.booking_channel_icon_candidate (\n booking_channel_id,\n cloudflare_image_id,\n color,\n comment,\n created_at,\n external_icon,\n height,\n id,\n provider,\n source,\n updated_at,\n width\n )\n select\n booking_channel_id,\n cloudflare_image_id,\n color,\n comment,\n created_at,\n external_icon,\n height,\n id,\n provider,\n source,\n updated_at,\n width\n from public.booking_channel_icon_candidate\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.tenant (\n billing_partner_id,\n billing_plan,\n created_at,\n data_region,\n id,\n name,\n partner_id,\n slug,\n status,\n storage_realm,\n type,\n unique_ref,\n updated_at\n )\n select\n billing_partner_id,\n billing_plan,\n created_at,\n data_region,\n id,\n name,\n partner_id,\n slug,\n status,\n storage_realm,\n type,\n unique_ref,\n updated_at\n from public.tenant\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n await sql`\n insert into control_plane.token (\n created_at,\n expires_at,\n id,\n nano_id,\n payload,\n tenant_id,\n type,\n user_id\n )\n select\n created_at,\n expires_at,\n id,\n nano_id,\n payload,\n tenant_id,\n type,\n user_id\n from public.token\n on conflict (id) do nothing;\n `.execute(controlPlaneBootstrapKysely);\n\n const controlPlaneKysely = withControlPlaneSchema(\n getKysely<ControlPlaneDB>(dialect, {\n repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane`,\n log: args.log,\n }),\n 'control_plane',\n 'control_plane'\n );\n controlPlaneKysely.destroy = async () => {};\n Object.defineProperty(kysely, 'controlPlaneKysely', {\n value: controlPlaneKysely,\n });\n\n const originalDestroy = kysely.destroy.bind(kysely);\n kysely.destroy = async () => {\n if (isDestroyed) return;\n isDestroyed = true;\n //const destroyTime = performance.now();\n await originalDestroy();\n //console.log(\n // `Database destroyed: ${Math.round(performance.now() - destroyTime)}ms`\n //);\n };\n\n // console.log(`Database initialized: ${Math.round(performance.now() - now)}ms`);\n\n return kysely as LocalKysely;\n}\n"]}
@@ -9,6 +9,7 @@ exports.prunePulledSchemaFile = prunePulledSchemaFile;
9
9
  exports.prunePulledSchema = prunePulledSchema;
10
10
  const promises_1 = require("node:fs/promises");
11
11
  const node_path_1 = require("node:path");
12
+ const error_1 = require("../error");
12
13
  const START_MARKER = '-- VRP legacy-column-prune:start';
13
14
  const END_MARKER = '-- VRP legacy-column-prune:end';
14
15
  const hasuraAuditTriggerPattern = /^CREATE TRIGGER "(notify_hasura_audit_[^"]+)" [\s\S]*? ON ([^\s;]+) FOR EACH ROW EXECUTE FUNCTION hdb_catalog\."notify_hasura_audit_[^"]+"\(\);$/gm;
@@ -118,7 +119,9 @@ function applyPruneBlock(sql, columns) {
118
119
  if (startAt !== -1) {
119
120
  const endAt = sql.indexOf(END_MARKER, startAt);
120
121
  if (endAt === -1) {
121
- throw new Error(`Malformed legacy prune block in initial SQL: missing "${END_MARKER}".`);
122
+ throw new error_1.KyselyError('Malformed legacy prune block in initial SQL', {
123
+ missingMarker: END_MARKER,
124
+ });
122
125
  }
123
126
  const tailStart = endAt + END_MARKER.length;
124
127
  const afterTail = sql.slice(tailStart).replace(/^\s*\n/, '');
@@ -1 +1 @@
1
- {"version":3,"file":"prune-pulled-schema.js","sourceRoot":"src/","sources":["local/prune-pulled-schema.ts"],"names":[],"mappings":";;;AAkFA,gEAcC;AAED,0CA0BC;AAED,sDAUC;AAED,0CA0BC;AAED,sDAaC;AAED,8CAGC;AAxLD,+CAAuD;AACvD,yCAAiC;AAEjC,MAAM,YAAY,GAAG,kCAAkC,CAAC;AACxD,MAAM,UAAU,GAAG,gCAAgC,CAAC;AAQpD,MAAM,yBAAyB,GAC7B,oJAAoJ,CAAC;AAOvJ;;;GAGG;AACU,QAAA,wBAAwB,GAAwB;IAC3D;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,SAAS;KAClB;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,sBAAsB;KAC/B;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,UAAU;KACnB;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,KAAK;KACd;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,aAAa;KACtB;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,OAAO;KAChB;IACD;QACE,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,wBAAwB;QAC/B,MAAM,EAAE,+BAA+B;KACxC;IACD;QACE,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,wBAAwB;QAC/B,MAAM,EAAE,6BAA6B;KACtC;IACD;QACE,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,oBAAoB;QAC3B,MAAM,EAAE,YAAY;KACrB;IACD;QACE,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,YAAY;KACrB;CACF,CAAC;AAEF,SAAgB,0BAA0B,CAAC,GAAW;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IAErD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAA0B,CAAC;QAChD,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;QAEhC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,eAAe,CAC7B,OAAqC,EACrC,sBAAqD,EAAE;IAEvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAClC,CAAC,IAAI,EAAE,EAAE,CACP,eAAe,IAAI,CAAC,KAAK,0BAA0B,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,KAAK,EAAE,CACrF,CAAC;IACF,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,GAAG,CAC/C,CAAC,OAAO,EAAE,EAAE,CACV,2BAA2B,OAAO,CAAC,IAAI,QAAQ,OAAO,CAAC,KAAK,mBAAmB,CAClF,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,gDAAgD;QAChD,GAAG,gBAAgB;QACnB,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC;gBACE,EAAE;gBACF,qDAAqD;gBACrD,GAAG,iBAAiB;aACrB;YACH,CAAC,CAAC,EAAE,CAAC;QACP,UAAU;KACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAqC;IACzE,MAAM,KAAK,GAAG;QACZ,0CAA0C,OAAO,CAAC,MAAM,4DAA4D;KACrH,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,eAAe,CAC7B,GAAW,EACX,OAAqC;IAErC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1C,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,yDAAyD,UAAU,IAAI,CACxE,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;QAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,GAAG,IAAI,OAAO,eAAe,CAAC,OAAO,EAAE,mBAAmB,CAAC,IAAI,CAAC;AACzE,CAAC;AAEM,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,gCAAwB,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,OAAO,KAAK,QAAQ,CAAC;IACrC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAA,oBAAS,EAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,sCAAsC,MAAM,GAAG,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,gCAAwB,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;IAC9D,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,GAAG;IAChB,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CACL,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC5C,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED,CAAC,KAAK,IAAI,EAAE;IACV,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;AACH,CAAC,CAAC,EAAE,CAAC","sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst START_MARKER = '-- VRP legacy-column-prune:start';\nconst END_MARKER = '-- VRP legacy-column-prune:end';\n\nexport type LegacyColumnPrune = {\n table: `${string}.${string}`;\n column: string;\n issue: string;\n};\n\nconst hasuraAuditTriggerPattern =\n /^CREATE TRIGGER \"(notify_hasura_audit_[^\"]+)\" [\\s\\S]*? ON ([^\\s;]+) FOR EACH ROW EXECUTE FUNCTION hdb_catalog\\.\"notify_hasura_audit_[^\"]+\"\\(\\);$/gm;\n\nexport type HasuraAuditTrigger = {\n name: string;\n table: `${string}.${string}`;\n};\n\n/**\n * Active removals currently validated by runtime + type usage.\n * Add new entries here incrementally to surface compile/runtime callers.\n */\nexport const activeLegacyColumnPrunes: LegacyColumnPrune[] = [\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'fly_app',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'default_machine_size',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'endpoint',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'uid',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'plugin_data',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'config',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'flows',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner_statement',\n column: 'cent_accounting_balance_start',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner_statement',\n column: 'cent_accounting_balance_end',\n },\n {\n issue: 'PRO-12855',\n table: 'accounting.contact',\n column: 'pms_status',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner',\n column: 'pms_status',\n },\n];\n\nexport function extractHasuraAuditTriggers(sql: string): HasuraAuditTrigger[] {\n const unique = new Map<string, HasuraAuditTrigger>();\n\n for (const match of sql.matchAll(hasuraAuditTriggerPattern)) {\n const name = match[1];\n const table = match[2] as `${string}.${string}`;\n const key = `${name}::${table}`;\n\n if (!unique.has(key)) {\n unique.set(key, { name, table });\n }\n }\n\n return [...unique.values()];\n}\n\nexport function buildPruneBlock(\n columns: readonly LegacyColumnPrune[],\n hasuraAuditTriggers: readonly HasuraAuditTrigger[] = []\n): string {\n const columnStatements = columns.map(\n (item) =>\n `ALTER TABLE ${item.table} DROP COLUMN IF EXISTS ${item.column}; -- ${item.issue}`\n );\n const triggerStatements = hasuraAuditTriggers.map(\n (trigger) =>\n `DROP TRIGGER IF EXISTS \"${trigger.name}\" ON ${trigger.table}; -- hasura-audit`\n );\n\n return [\n START_MARKER,\n '-- Managed by src/local/prune-pulled-schema.ts',\n ...columnStatements,\n ...(triggerStatements.length > 0\n ? [\n '',\n '-- Disable Hasura audit triggers in local bootstrap',\n ...triggerStatements,\n ]\n : []),\n END_MARKER,\n ].join('\\n');\n}\n\nexport function buildPruneReminderLog(columns: readonly LegacyColumnPrune[]) {\n const lines = [\n `[kysely] Legacy column prune reminder (${columns.length} columns). Remove these from production schema when ready:`,\n ];\n\n for (const item of columns) {\n lines.push(` - ${item.table}.${item.column} [${item.issue}]`);\n }\n\n return lines;\n}\n\nexport function applyPruneBlock(\n sql: string,\n columns: readonly LegacyColumnPrune[]\n): string {\n const hasuraAuditTriggers = extractHasuraAuditTriggers(sql);\n const startAt = sql.indexOf(START_MARKER);\n\n let base = sql;\n if (startAt !== -1) {\n const endAt = sql.indexOf(END_MARKER, startAt);\n if (endAt === -1) {\n throw new Error(\n `Malformed legacy prune block in initial SQL: missing \"${END_MARKER}\".`\n );\n }\n const tailStart = endAt + END_MARKER.length;\n const afterTail = sql.slice(tailStart).replace(/^\\s*\\n/, '');\n base = `${sql.slice(0, startAt).trimEnd()}\\n${afterTail}`;\n }\n\n const next = base.trimEnd();\n if (columns.length === 0) {\n return `${next}\\n`;\n }\n\n return `${next}\\n\\n${buildPruneBlock(columns, hasuraAuditTriggers)}\\n`;\n}\n\nexport async function prunePulledSchemaFile(filePath: string) {\n const original = await readFile(filePath, 'utf8');\n const updated = applyPruneBlock(original, activeLegacyColumnPrunes);\n const changed = updated !== original;\n if (changed) {\n await writeFile(filePath, updated, 'utf8');\n }\n\n const status = changed ? 'applied' : 'already up to date';\n console.log(`[kysely] Legacy column prune block ${status}.`);\n for (const line of buildPruneReminderLog(activeLegacyColumnPrunes)) {\n console.log(line);\n }\n}\n\nexport async function prunePulledSchema(root: string) {\n const filePath = join(root, 'initial/0000000000000-init.sql');\n await prunePulledSchemaFile(filePath);\n}\n\nasync function run() {\n await prunePulledSchema(process.cwd());\n}\n\nfunction isDirectExecution() {\n const entryPath = process.argv[1];\n if (!entryPath) {\n return false;\n }\n\n return (\n entryPath.endsWith('prune-pulled-schema.ts') ||\n entryPath.endsWith('prune-pulled-schema.js')\n );\n}\n\n(async () => {\n if (isDirectExecution()) {\n await run();\n }\n})();\n"]}
1
+ {"version":3,"file":"prune-pulled-schema.js","sourceRoot":"src/","sources":["local/prune-pulled-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { KyselyError } from '../error';\n\nconst START_MARKER = '-- VRP legacy-column-prune:start';\nconst END_MARKER = '-- VRP legacy-column-prune:end';\n\nexport type LegacyColumnPrune = {\n table: `${string}.${string}`;\n column: string;\n issue: string;\n};\n\nconst hasuraAuditTriggerPattern =\n /^CREATE TRIGGER \"(notify_hasura_audit_[^\"]+)\" [\\s\\S]*? ON ([^\\s;]+) FOR EACH ROW EXECUTE FUNCTION hdb_catalog\\.\"notify_hasura_audit_[^\"]+\"\\(\\);$/gm;\n\nexport type HasuraAuditTrigger = {\n name: string;\n table: `${string}.${string}`;\n};\n\n/**\n * Active removals currently validated by runtime + type usage.\n * Add new entries here incrementally to surface compile/runtime callers.\n */\nexport const activeLegacyColumnPrunes: LegacyColumnPrune[] = [\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'fly_app',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'default_machine_size',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'endpoint',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'uid',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'plugin_data',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'config',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'flows',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner_statement',\n column: 'cent_accounting_balance_start',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner_statement',\n column: 'cent_accounting_balance_end',\n },\n {\n issue: 'PRO-12855',\n table: 'accounting.contact',\n column: 'pms_status',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner',\n column: 'pms_status',\n },\n];\n\nexport function extractHasuraAuditTriggers(sql: string): HasuraAuditTrigger[] {\n const unique = new Map<string, HasuraAuditTrigger>();\n\n for (const match of sql.matchAll(hasuraAuditTriggerPattern)) {\n const name = match[1];\n const table = match[2] as `${string}.${string}`;\n const key = `${name}::${table}`;\n\n if (!unique.has(key)) {\n unique.set(key, { name, table });\n }\n }\n\n return [...unique.values()];\n}\n\nexport function buildPruneBlock(\n columns: readonly LegacyColumnPrune[],\n hasuraAuditTriggers: readonly HasuraAuditTrigger[] = []\n): string {\n const columnStatements = columns.map(\n (item) =>\n `ALTER TABLE ${item.table} DROP COLUMN IF EXISTS ${item.column}; -- ${item.issue}`\n );\n const triggerStatements = hasuraAuditTriggers.map(\n (trigger) =>\n `DROP TRIGGER IF EXISTS \"${trigger.name}\" ON ${trigger.table}; -- hasura-audit`\n );\n\n return [\n START_MARKER,\n '-- Managed by src/local/prune-pulled-schema.ts',\n ...columnStatements,\n ...(triggerStatements.length > 0\n ? [\n '',\n '-- Disable Hasura audit triggers in local bootstrap',\n ...triggerStatements,\n ]\n : []),\n END_MARKER,\n ].join('\\n');\n}\n\nexport function buildPruneReminderLog(columns: readonly LegacyColumnPrune[]) {\n const lines = [\n `[kysely] Legacy column prune reminder (${columns.length} columns). Remove these from production schema when ready:`,\n ];\n\n for (const item of columns) {\n lines.push(` - ${item.table}.${item.column} [${item.issue}]`);\n }\n\n return lines;\n}\n\nexport function applyPruneBlock(\n sql: string,\n columns: readonly LegacyColumnPrune[]\n): string {\n const hasuraAuditTriggers = extractHasuraAuditTriggers(sql);\n const startAt = sql.indexOf(START_MARKER);\n\n let base = sql;\n if (startAt !== -1) {\n const endAt = sql.indexOf(END_MARKER, startAt);\n if (endAt === -1) {\n throw new KyselyError('Malformed legacy prune block in initial SQL', {\n missingMarker: END_MARKER,\n });\n }\n const tailStart = endAt + END_MARKER.length;\n const afterTail = sql.slice(tailStart).replace(/^\\s*\\n/, '');\n base = `${sql.slice(0, startAt).trimEnd()}\\n${afterTail}`;\n }\n\n const next = base.trimEnd();\n if (columns.length === 0) {\n return `${next}\\n`;\n }\n\n return `${next}\\n\\n${buildPruneBlock(columns, hasuraAuditTriggers)}\\n`;\n}\n\nexport async function prunePulledSchemaFile(filePath: string) {\n const original = await readFile(filePath, 'utf8');\n const updated = applyPruneBlock(original, activeLegacyColumnPrunes);\n const changed = updated !== original;\n if (changed) {\n await writeFile(filePath, updated, 'utf8');\n }\n\n const status = changed ? 'applied' : 'already up to date';\n console.log(`[kysely] Legacy column prune block ${status}.`);\n for (const line of buildPruneReminderLog(activeLegacyColumnPrunes)) {\n console.log(line);\n }\n}\n\nexport async function prunePulledSchema(root: string) {\n const filePath = join(root, 'initial/0000000000000-init.sql');\n await prunePulledSchemaFile(filePath);\n}\n\nasync function run() {\n await prunePulledSchema(process.cwd());\n}\n\nfunction isDirectExecution() {\n const entryPath = process.argv[1];\n if (!entryPath) {\n return false;\n }\n\n return (\n entryPath.endsWith('prune-pulled-schema.ts') ||\n entryPath.endsWith('prune-pulled-schema.js')\n );\n}\n\n(async () => {\n if (isDirectExecution()) {\n await run();\n }\n})();\n"]}
@@ -0,0 +1,7 @@
1
+ export declare const appMigrationEpoch: {
2
+ readonly baseline: "0000000000000-baseline";
3
+ readonly folder: "migrations-v2";
4
+ readonly lockTableName: "kysely_migration_lock";
5
+ readonly tableName: "kysely_migration";
6
+ readonly tableSchema: "kysely_v2";
7
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appMigrationEpoch = void 0;
4
+ exports.appMigrationEpoch = {
5
+ baseline: '0000000000000-baseline',
6
+ folder: 'migrations-v2',
7
+ lockTableName: 'kysely_migration_lock',
8
+ tableName: 'kysely_migration',
9
+ tableSchema: 'kysely_v2',
10
+ };
11
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"src/","sources":["migration.ts"],"names":[],"mappings":";;;AAAa,QAAA,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,wBAAwB;IAClC,MAAM,EAAE,eAAe;IACvB,aAAa,EAAE,uBAAuB;IACtC,SAAS,EAAE,kBAAkB;IAC7B,WAAW,EAAE,WAAW;CAChB,CAAC","sourcesContent":["export const appMigrationEpoch = {\n baseline: '0000000000000-baseline',\n folder: 'migrations-v2',\n lockTableName: 'kysely_migration_lock',\n tableName: 'kysely_migration',\n tableSchema: 'kysely_v2',\n} as const;\n"]}
@@ -9,16 +9,6 @@ export declare function whereListingIsActive(eb: ExpressionBuilder<DB & {
9
9
  }, 'l'>, today?: string): import("kysely").ExpressionWrapper<DB & {
10
10
  l: PublicListing;
11
11
  }, "l", import("kysely/dist/cjs/util/type-utils").SqlBool>;
12
- export declare function selectListingIsInactive(eb: ExpressionBuilder<DB & {
13
- l: PublicListing;
14
- }, 'l'>, today?: string): import("kysely").ExpressionWrapper<DB & {
15
- l: PublicListing;
16
- }, "l", import("kysely/dist/cjs/util/type-utils").SqlBool>;
17
- export declare function selectListingIsActive(eb: ExpressionBuilder<DB & {
18
- l: PublicListing;
19
- }, 'l'>, today?: string): import("kysely").ExpressionWrapper<DB & {
20
- l: PublicListing;
21
- }, "l", import("kysely/dist/cjs/util/type-utils").SqlBool>;
22
12
  export declare function selectListingStatus(eb: ExpressionBuilder<DB & {
23
13
  l: PublicListing;
24
14
  }, 'l'>, today?: string): import("kysely").ExpressionWrapper<DB & {
@@ -2,22 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.whereListingIsInactive = whereListingIsInactive;
4
4
  exports.whereListingIsActive = whereListingIsActive;
5
- exports.selectListingIsInactive = selectListingIsInactive;
6
- exports.selectListingIsActive = selectListingIsActive;
7
5
  exports.selectListingStatus = selectListingStatus;
8
6
  const utils_1 = require("@vrplatform/utils");
9
7
  const isomorphic_1 = require("../../isomorphic");
8
+ const status_1 = require("../tenant/status");
10
9
  function hasActiveListing(eb, today) {
11
10
  return eb.exists(eb
12
11
  .selectFrom('public.tenant as tenant')
13
- .leftJoin('public.tenant as billingPartner', 'billingPartner.id', 'tenant.calculatedBillingPartnerId')
14
12
  .select('tenant.id')
15
13
  .whereRef('tenant.id', '=', 'l.tenantId')
16
- .where('tenant.calculatedStatus', '=', 'active')
17
- .where((eb2) => eb2.or([
18
- eb2('tenant.calculatedBillingPartnerId', 'is', null),
19
- eb2('billingPartner.calculatedStatus', '=', 'active'),
20
- ]))
14
+ .where(status_1.whereTenantActive)
21
15
  .where((eb2) => eb2.or([
22
16
  eb2.and([
23
17
  eb2('tenant.isGeneralLedger', '=', false),
@@ -72,12 +66,6 @@ function whereListingIsInactive(eb, today = (0, utils_1.day)().yyyymmdd()) {
72
66
  function whereListingIsActive(eb, today = (0, utils_1.day)().yyyymmdd()) {
73
67
  return hasActiveListing(eb, today);
74
68
  }
75
- function selectListingIsInactive(eb, today = (0, utils_1.day)().yyyymmdd()) {
76
- return whereListingIsInactive(eb, today);
77
- }
78
- function selectListingIsActive(eb, today = (0, utils_1.day)().yyyymmdd()) {
79
- return whereListingIsActive(eb, today);
80
- }
81
69
  function selectListingStatus(eb, today = (0, utils_1.day)().yyyymmdd()) {
82
70
  return eb
83
71
  .case()
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/listing/status.ts"],"names":[],"mappings":"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","sourcesContent":["import { day } from '@vrplatform/utils';\nimport type { DB, ExpressionBuilder, PublicListing } from '../../isomorphic';\nimport { sql } from '../../isomorphic';\n\nfunction hasActiveListing(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n return eb.exists(\n eb\n .selectFrom('public.tenant as tenant')\n .leftJoin(\n 'public.tenant as billingPartner',\n 'billingPartner.id',\n 'tenant.calculatedBillingPartnerId'\n )\n .select('tenant.id')\n .whereRef('tenant.id', '=', 'l.tenantId')\n .where('tenant.calculatedStatus', '=', 'active')\n .where((eb2) =>\n eb2.or([\n eb2('tenant.calculatedBillingPartnerId', 'is', null),\n eb2('billingPartner.calculatedStatus', '=', 'active'),\n ])\n )\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('tenant.isGeneralLedger', '=', false),\n eb('l.calculatedStatus', '=', 'active'),\n ]),\n eb2.and([\n eb2('tenant.isGeneralLedger', '=', true),\n eb.not(hasInactiveOwnership(eb, today)),\n ]),\n ])\n )\n .limit(1)\n );\n}\n\nfunction hasInactiveOwnership(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n const onDate = day(today).toDate();\n return eb.exists(\n eb\n .selectFrom('public.listingOwnershipPeriod as lop')\n .select('lop.id')\n .where(\n 'lop.listingId',\n '=',\n sql<string>`coalesce(${sql.ref('l.parentId')}, ${sql.ref('l.id')})`\n )\n .whereRef('lop.tenantId', '=', 'l.tenantId')\n .where('lop.setListingInactive', '=', true)\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', '>=', onDate),\n ]),\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', 'is', null),\n ]),\n ])\n )\n .limit(1)\n );\n}\n\nfunction hasInactiveListing(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n return eb.exists(\n eb\n .selectFrom('public.tenant as tenant')\n .select('tenant.id')\n .whereRef('tenant.id', '=', 'l.tenantId')\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('tenant.isGeneralLedger', '=', false),\n eb('l.calculatedStatus', '=', 'inactive'),\n ]),\n eb2.and([\n eb2('tenant.isGeneralLedger', '=', true),\n hasInactiveOwnership(eb, today),\n ]),\n ])\n )\n );\n}\n\nexport function whereListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return hasInactiveListing(eb, today);\n}\n\nexport function whereListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return hasActiveListing(eb, today);\n}\n\nexport function selectListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return whereListingIsInactive(eb, today);\n}\n\nexport function selectListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return whereListingIsActive(eb, today);\n}\n\nexport function selectListingStatus(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return eb\n .case()\n .when(whereListingIsInactive(eb, today))\n .then('inactive')\n .else('active')\n .end();\n}\n"]}
1
+ {"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/listing/status.ts"],"names":[],"mappings":"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","sourcesContent":["import { day } from '@vrplatform/utils';\nimport type { DB, ExpressionBuilder, PublicListing } from '../../isomorphic';\nimport { sql } from '../../isomorphic';\nimport { whereTenantActive } from '../tenant/status';\n\nfunction hasActiveListing(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n return eb.exists(\n eb\n .selectFrom('public.tenant as tenant')\n .select('tenant.id')\n .whereRef('tenant.id', '=', 'l.tenantId')\n .where(whereTenantActive)\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('tenant.isGeneralLedger', '=', false),\n eb('l.calculatedStatus', '=', 'active'),\n ]),\n eb2.and([\n eb2('tenant.isGeneralLedger', '=', true),\n eb.not(hasInactiveOwnership(eb, today)),\n ]),\n ])\n )\n .limit(1)\n );\n}\n\nfunction hasInactiveOwnership(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n const onDate = day(today).toDate();\n return eb.exists(\n eb\n .selectFrom('public.listingOwnershipPeriod as lop')\n .select('lop.id')\n .where(\n 'lop.listingId',\n '=',\n sql<string>`coalesce(${sql.ref('l.parentId')}, ${sql.ref('l.id')})`\n )\n .whereRef('lop.tenantId', '=', 'l.tenantId')\n .where('lop.setListingInactive', '=', true)\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', '>=', onDate),\n ]),\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', 'is', null),\n ]),\n ])\n )\n .limit(1)\n );\n}\n\nfunction hasInactiveListing(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n return eb.exists(\n eb\n .selectFrom('public.tenant as tenant')\n .select('tenant.id')\n .whereRef('tenant.id', '=', 'l.tenantId')\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('tenant.isGeneralLedger', '=', false),\n eb('l.calculatedStatus', '=', 'inactive'),\n ]),\n eb2.and([\n eb2('tenant.isGeneralLedger', '=', true),\n hasInactiveOwnership(eb, today),\n ]),\n ])\n )\n );\n}\n\nexport function whereListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return hasInactiveListing(eb, today);\n}\n\nexport function whereListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return hasActiveListing(eb, today);\n}\n\nexport function selectListingStatus(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return eb\n .case()\n .when(whereListingIsInactive(eb, today))\n .then('inactive')\n .else('active')\n .end();\n}\n"]}
@@ -1,17 +1,14 @@
1
- import type { DB, ExpressionBuilder, PublicTenant } from '../../isomorphic';
1
+ import { type DB, type ExpressionBuilder, type PublicTenant, type SqlBool } from '../../isomorphic';
2
2
  type TenantExpressionBuilder = ExpressionBuilder<DB & {
3
3
  tenant: PublicTenant;
4
4
  }, 'tenant'>;
5
5
  export declare function whereTenantActive(eb: TenantExpressionBuilder): import("kysely").ExpressionWrapper<DB & {
6
6
  tenant: PublicTenant;
7
- }, "tenant", import("kysely/dist/cjs/util/type-utils").SqlBool>;
8
- export declare function whereTenantNotTestTeam(eb: TenantExpressionBuilder, testTeamId: string): import("kysely").ExpressionWrapper<DB & {
9
- tenant: PublicTenant;
10
- }, "tenant", import("kysely/dist/cjs/util/type-utils").SqlBool>;
11
- export declare function whereTenantShouldBePaid(eb: TenantExpressionBuilder, { includePartnerTeams, today, }?: {
7
+ }, "tenant", SqlBool>;
8
+ export declare function whereTenantNotTestTeam(testTeamId: string): import("kysely").RawBuilder<SqlBool>;
9
+ export declare function whereTenantShouldBePaid(eb: TenantExpressionBuilder, { includePartnerTeams, }?: {
12
10
  includePartnerTeams?: boolean;
13
- today?: Date | string;
14
11
  }): import("kysely").ExpressionWrapper<DB & {
15
12
  tenant: PublicTenant;
16
- }, "tenant", import("kysely/dist/cjs/util/type-utils").SqlBool>;
13
+ }, "tenant", SqlBool>;
17
14
  export {};
@@ -3,38 +3,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.whereTenantActive = whereTenantActive;
4
4
  exports.whereTenantNotTestTeam = whereTenantNotTestTeam;
5
5
  exports.whereTenantShouldBePaid = whereTenantShouldBePaid;
6
- const utils_1 = require("@vrplatform/utils");
6
+ const isomorphic_1 = require("../../isomorphic");
7
+ const billing_partner_1 = require("./billing-partner");
7
8
  function whereTenantActive(eb) {
8
9
  return eb.and([
9
10
  eb('tenant.calculatedStatus', '=', 'active'),
10
- eb.exists(eb
11
+ eb.not(eb.exists(eb
11
12
  .selectFrom('public.tenant as billingPartner')
12
13
  .select('billingPartner.id')
13
- .whereRef('billingPartner.id', '=', 'tenant.calculatedBillingPartnerId')
14
- .where('billingPartner.calculatedStatus', '=', 'active')),
14
+ .where('billingPartner.id', '=', eb.fn.coalesce('tenant.calculatedBillingPartnerId', eb.val((0, billing_partner_1.getCalculatedBillingPartnerId)({}))))
15
+ .where('billingPartner.calculatedStatus', 'is distinct from', 'active'))),
15
16
  ]);
16
17
  }
17
- function whereTenantNotTestTeam(eb, testTeamId) {
18
- return eb.and([
19
- eb('tenant.id', '!=', testTeamId),
20
- eb.or([
21
- eb('tenant.partnerId', 'is', null),
22
- eb('tenant.partnerId', '!=', testTeamId),
23
- ]),
24
- eb.or([
25
- eb('tenant.billingPartnerId', 'is', null),
26
- eb('tenant.billingPartnerId', '!=', testTeamId),
27
- ]),
28
- ]);
18
+ function whereTenantNotTestTeam(testTeamId) {
19
+ return (0, isomorphic_1.sql) `(
20
+ ${isomorphic_1.sql.ref('tenant.id')} != ${testTeamId}
21
+ and (
22
+ ${isomorphic_1.sql.ref('tenant.partnerId')} is null
23
+ or ${isomorphic_1.sql.ref('tenant.partnerId')} != ${testTeamId}
24
+ )
25
+ and (
26
+ ${isomorphic_1.sql.ref('tenant.billingPartnerId')} is null
27
+ or ${isomorphic_1.sql.ref('tenant.billingPartnerId')} != ${testTeamId}
28
+ )
29
+ )`;
29
30
  }
30
- function whereTenantShouldBePaid(eb, { includePartnerTeams = false, today = (0, utils_1.day)().yyyymmdd(), } = {}) {
31
+ function whereTenantShouldBePaid(eb, { includePartnerTeams = false, } = {}) {
31
32
  return eb.and([
32
33
  whereTenantActive(eb),
33
34
  eb('tenant.isOnboarding', '=', false),
34
- eb.or([
35
- eb('tenant.trialUntil', '<', today),
36
- eb('tenant.trialUntil', 'is', null),
37
- ]),
38
35
  ...(includePartnerTeams
39
36
  ? []
40
37
  : [eb('tenant.calculatedIsBillable', '=', true)]),
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/tenant/status.ts"],"names":[],"mappings":";;AAQA,8CAWC;AAED,wDAeC;AAED,0DAqBC;AA3DD,6CAAwC;AAQxC,SAAgB,iBAAiB,CAAC,EAA2B;IAC3D,OAAO,EAAE,CAAC,GAAG,CAAC;QACZ,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE,QAAQ,CAAC;QAC5C,EAAE,CAAC,MAAM,CACP,EAAE;aACC,UAAU,CAAC,iCAAiC,CAAC;aAC7C,MAAM,CAAC,mBAAmB,CAAC;aAC3B,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE,mCAAmC,CAAC;aACvE,KAAK,CAAC,iCAAiC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAC3D;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,sBAAsB,CACpC,EAA2B,EAC3B,UAAkB;IAElB,OAAO,EAAE,CAAC,GAAG,CAAC;QACZ,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC;QACjC,EAAE,CAAC,EAAE,CAAC;YACJ,EAAE,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,CAAC;YAClC,EAAE,CAAC,kBAAkB,EAAE,IAAI,EAAE,UAAU,CAAC;SACzC,CAAC;QACF,EAAE,CAAC,EAAE,CAAC;YACJ,EAAE,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,CAAC;YACzC,EAAE,CAAC,yBAAyB,EAAE,IAAI,EAAE,UAAU,CAAC;SAChD,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,uBAAuB,CACrC,EAA2B,EAC3B,EACE,mBAAmB,GAAG,KAAK,EAC3B,KAAK,GAAG,IAAA,WAAG,GAAE,CAAC,QAAQ,EAAE,MAItB,EAAE;IAEN,OAAO,EAAE,CAAC,GAAG,CAAC;QACZ,iBAAiB,CAAC,EAAE,CAAC;QACrB,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE,KAAK,CAAC;QACrC,EAAE,CAAC,EAAE,CAAC;YACJ,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE,KAAK,CAAC;YACnC,EAAE,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAC;SACpC,CAAC;QACF,GAAG,CAAC,mBAAmB;YACrB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;KACpD,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { day } from '@vrplatform/utils';\nimport type { DB, ExpressionBuilder, PublicTenant } from '../../isomorphic';\n\ntype TenantExpressionBuilder = ExpressionBuilder<\n DB & { tenant: PublicTenant },\n 'tenant'\n>;\n\nexport function whereTenantActive(eb: TenantExpressionBuilder) {\n return eb.and([\n eb('tenant.calculatedStatus', '=', 'active'),\n eb.exists(\n eb\n .selectFrom('public.tenant as billingPartner')\n .select('billingPartner.id')\n .whereRef('billingPartner.id', '=', 'tenant.calculatedBillingPartnerId')\n .where('billingPartner.calculatedStatus', '=', 'active')\n ),\n ]);\n}\n\nexport function whereTenantNotTestTeam(\n eb: TenantExpressionBuilder,\n testTeamId: string\n) {\n return eb.and([\n eb('tenant.id', '!=', testTeamId),\n eb.or([\n eb('tenant.partnerId', 'is', null),\n eb('tenant.partnerId', '!=', testTeamId),\n ]),\n eb.or([\n eb('tenant.billingPartnerId', 'is', null),\n eb('tenant.billingPartnerId', '!=', testTeamId),\n ]),\n ]);\n}\n\nexport function whereTenantShouldBePaid(\n eb: TenantExpressionBuilder,\n {\n includePartnerTeams = false,\n today = day().yyyymmdd(),\n }: {\n includePartnerTeams?: boolean;\n today?: Date | string;\n } = {}\n) {\n return eb.and([\n whereTenantActive(eb),\n eb('tenant.isOnboarding', '=', false),\n eb.or([\n eb('tenant.trialUntil', '<', today),\n eb('tenant.trialUntil', 'is', null),\n ]),\n ...(includePartnerTeams\n ? []\n : [eb('tenant.calculatedIsBillable', '=', true)]),\n ]);\n}\n"]}
1
+ {"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/tenant/status.ts"],"names":[],"mappings":";;AAcA,8CAwBC;AAED,wDAYC;AAED,0DAeC;AArED,iDAM0B;AAC1B,uDAAkE;AAOlE,SAAgB,iBAAiB,CAAC,EAA2B;IAC3D,OAAO,EAAE,CAAC,GAAG,CAAC;QACZ,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE,QAAQ,CAAC;QAC5C,EAAE,CAAC,GAAG,CACJ,EAAE,CAAC,MAAM,CACP,EAAE;aACC,UAAU,CAAC,iCAAiC,CAAC;aAC7C,MAAM,CAAC,mBAAmB,CAAC;aAC3B,KAAK,CACJ,mBAAmB,EACnB,GAAG,EACH,EAAE,CAAC,EAAE,CAAC,QAAQ,CACZ,mCAAmC,EACnC,EAAE,CAAC,GAAG,CAAC,IAAA,+CAA6B,EAAC,EAAE,CAAC,CAAC,CAC1C,CACF;aACA,KAAK,CACJ,iCAAiC,EACjC,kBAAkB,EAClB,QAAQ,CACT,CACJ,CACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,sBAAsB,CAAC,UAAkB;IACvD,OAAO,IAAA,gBAAG,EAAS;MACf,gBAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,UAAU;;QAEnC,gBAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC;WACxB,gBAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,UAAU;;;QAG/C,gBAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC;WAC/B,gBAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,OAAO,UAAU;;IAE1D,CAAC;AACL,CAAC;AAED,SAAgB,uBAAuB,CACrC,EAA2B,EAC3B,EACE,mBAAmB,GAAG,KAAK,MAGzB,EAAE;IAEN,OAAO,EAAE,CAAC,GAAG,CAAC;QACZ,iBAAiB,CAAC,EAAE,CAAC;QACrB,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE,KAAK,CAAC;QACrC,GAAG,CAAC,mBAAmB;YACrB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;KACpD,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n sql,\n type DB,\n type ExpressionBuilder,\n type PublicTenant,\n type SqlBool,\n} from '../../isomorphic';\nimport { getCalculatedBillingPartnerId } from './billing-partner';\n\ntype TenantExpressionBuilder = ExpressionBuilder<\n DB & { tenant: PublicTenant },\n 'tenant'\n>;\n\nexport function whereTenantActive(eb: TenantExpressionBuilder) {\n return eb.and([\n eb('tenant.calculatedStatus', '=', 'active'),\n eb.not(\n eb.exists(\n eb\n .selectFrom('public.tenant as billingPartner')\n .select('billingPartner.id')\n .where(\n 'billingPartner.id',\n '=',\n eb.fn.coalesce(\n 'tenant.calculatedBillingPartnerId',\n eb.val(getCalculatedBillingPartnerId({}))\n )\n )\n .where(\n 'billingPartner.calculatedStatus',\n 'is distinct from',\n 'active'\n )\n )\n ),\n ]);\n}\n\nexport function whereTenantNotTestTeam(testTeamId: string) {\n return sql<SqlBool>`(\n ${sql.ref('tenant.id')} != ${testTeamId}\n and (\n ${sql.ref('tenant.partnerId')} is null\n or ${sql.ref('tenant.partnerId')} != ${testTeamId}\n )\n and (\n ${sql.ref('tenant.billingPartnerId')} is null\n or ${sql.ref('tenant.billingPartnerId')} != ${testTeamId}\n )\n )`;\n}\n\nexport function whereTenantShouldBePaid(\n eb: TenantExpressionBuilder,\n {\n includePartnerTeams = false,\n }: {\n includePartnerTeams?: boolean;\n } = {}\n) {\n return eb.and([\n whereTenantActive(eb),\n eb('tenant.isOnboarding', '=', false),\n ...(includePartnerTeams\n ? []\n : [eb('tenant.calculatedIsBillable', '=', true)]),\n ]);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Kysely } from './index';
1
+ import type { ControlPlaneKysely, Kysely } from './index';
2
2
  export declare const tenantDataRegions: readonly ["ap", "crunchy", "eu", "hostaway", "us"];
3
3
  export type TenantDataRegion = (typeof tenantDataRegions)[number];
4
4
  export type RegionEnvironment = Record<string, string | undefined>;
@@ -10,6 +10,10 @@ type UseAsyncRegionalKysely = (connectionString: string, options?: {
10
10
  repositoryName?: string;
11
11
  probe?: true;
12
12
  }) => Promise<Kysely>;
13
+ type UseAsyncControlPlaneKysely = (connectionString: string, options?: {
14
+ repositoryName?: string;
15
+ probe?: true;
16
+ }) => Promise<ControlPlaneKysely>;
13
17
  export declare function useTenantDatabaseKysely(dataRegion: TenantDataRegion, repositoryName: string, env: RegionEnvironment, options?: {
14
18
  useAsyncKysely?: UseAsyncRegionalKysely;
15
19
  probe?: true;
@@ -32,6 +36,7 @@ export declare function resolveTenantKysely({ connectionId, slug, tenantId, repo
32
36
  tenantId?: string;
33
37
  repositoryName: string;
34
38
  env: RegionEnvironment;
39
+ useAsyncControlPlaneKysely?: UseAsyncControlPlaneKysely;
35
40
  useAsyncKysely?: UseAsyncRegionalKysely;
36
41
  probe?: true;
37
42
  }): Promise<TenantKysely>;