@vrplatform/kysely 1.3.45-4997 → 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
@@ -1,8 +1,10 @@
1
1
  import { promises as fs } from 'node:fs';
2
2
  import * as path from 'node:path';
3
3
  import { PGlite } from '@electric-sql/pglite';
4
- import { FileMigrationProvider, Migrator } from 'kysely';
4
+ import { FileMigrationProvider, Migrator, sql } from 'kysely';
5
5
  import { PGliteDialect } from 'kysely-pglite-dialect';
6
+ import { withControlPlaneSchema } from '../control-plane';
7
+ import { appMigrationEpoch } from '../migration';
6
8
  import { getKysely } from '../plugins';
7
9
  import { ensureDigestFunction, ensureGenRandomBytesFunction } from './digest';
8
10
  export const root = path.join(__dirname, '../..');
@@ -10,13 +12,13 @@ export const dumpPath = path.join(root, '.data.tar');
10
12
  async function migrateToLatest(kysely) {
11
13
  const migrator = new Migrator({
12
14
  db: kysely,
13
- migrationTableSchema: 'core',
14
- migrationTableName: 'kysely_migration',
15
- migrationLockTableName: 'kysely_migration_lock',
15
+ migrationTableSchema: appMigrationEpoch.tableSchema,
16
+ migrationTableName: appMigrationEpoch.tableName,
17
+ migrationLockTableName: appMigrationEpoch.lockTableName,
16
18
  provider: new FileMigrationProvider({
17
19
  fs,
18
20
  path,
19
- migrationFolder: path.join(root, 'migrations'),
21
+ migrationFolder: path.join(root, appMigrationEpoch.folder),
20
22
  }),
21
23
  });
22
24
  const { error } = await migrator.migrateToLatest();
@@ -39,6 +41,214 @@ export async function useLocalKysely(args = {}) {
39
41
  await ensureDigestFunction(kysely);
40
42
  await ensureGenRandomBytesFunction(kysely);
41
43
  await migrateToLatest(kysely);
44
+ await sql `alter schema public rename to regional_public`.execute(kysely);
45
+ await sql `alter schema core rename to regional_core`.execute(kysely);
46
+ await sql `create schema public`.execute(kysely);
47
+ await sql `create schema core`.execute(kysely);
48
+ const controlPlaneBootstrapKysely = getKysely(dialect, {
49
+ repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane-bootstrap`,
50
+ });
51
+ const controlPlaneMigrator = new Migrator({
52
+ db: controlPlaneBootstrapKysely,
53
+ migrationTableSchema: 'public',
54
+ migrationTableName: 'control_plane_kysely_migration',
55
+ migrationLockTableName: 'control_plane_kysely_migration_lock',
56
+ provider: new FileMigrationProvider({
57
+ fs,
58
+ path,
59
+ migrationFolder: path.join(root, 'control-plane-migrations'),
60
+ }),
61
+ });
62
+ const { error: controlPlaneMigrationError } = await controlPlaneMigrator.migrateToLatest();
63
+ if (controlPlaneMigrationError) {
64
+ throw controlPlaneMigrationError;
65
+ }
66
+ await sql `alter table core.flow set schema public`.execute(controlPlaneBootstrapKysely);
67
+ await sql `alter table core.issue_message_overwrite set schema public`.execute(controlPlaneBootstrapKysely);
68
+ await sql `drop schema core`.execute(controlPlaneBootstrapKysely);
69
+ await sql `alter schema public rename to control_plane`.execute(controlPlaneBootstrapKysely);
70
+ await sql `alter schema regional_public rename to public`.execute(controlPlaneBootstrapKysely);
71
+ await sql `alter schema regional_core rename to core`.execute(controlPlaneBootstrapKysely);
72
+ await sql `
73
+ do $$
74
+ declare
75
+ definition text;
76
+ begin
77
+ select pg_get_functiondef(
78
+ 'control_plane.normalize_tenant_slug(text)'::regprocedure
79
+ ) into definition;
80
+ execute replace(definition, 'public.', 'control_plane.');
81
+
82
+ select pg_get_functiondef(
83
+ 'control_plane.build_unique_tenant_slug(text,uuid)'::regprocedure
84
+ ) into definition;
85
+ execute replace(definition, 'public.', 'control_plane.');
86
+ end;
87
+ $$;
88
+ `.execute(controlPlaneBootstrapKysely);
89
+ await sql `
90
+ insert into control_plane.app (
91
+ authentication,
92
+ category,
93
+ color,
94
+ created_at,
95
+ icon,
96
+ icon_round,
97
+ id,
98
+ info,
99
+ name,
100
+ type,
101
+ version
102
+ )
103
+ select
104
+ authentication,
105
+ category,
106
+ color,
107
+ created_at,
108
+ icon,
109
+ icon_round,
110
+ id,
111
+ info,
112
+ name,
113
+ type,
114
+ version
115
+ from public.app
116
+ on conflict (id) do nothing;
117
+ `.execute(controlPlaneBootstrapKysely);
118
+ await sql `
119
+ insert into control_plane.currency (name)
120
+ select name
121
+ from public.currency
122
+ on conflict (name) do nothing;
123
+ `.execute(controlPlaneBootstrapKysely);
124
+ await sql `
125
+ insert into control_plane.booking_channel (
126
+ channel_ref,
127
+ color,
128
+ created_at,
129
+ icon,
130
+ icon_provider,
131
+ id,
132
+ last_generate_run,
133
+ logo,
134
+ logo_provider,
135
+ selected_booking_channel_icon_candidate_id,
136
+ selected_booking_channel_logo_candidate_id,
137
+ unique_ref,
138
+ updated_at
139
+ )
140
+ select
141
+ channel_ref,
142
+ color,
143
+ created_at,
144
+ icon,
145
+ icon_provider,
146
+ id,
147
+ last_generate_run,
148
+ logo,
149
+ logo_provider,
150
+ selected_booking_channel_icon_candidate_id,
151
+ selected_booking_channel_logo_candidate_id,
152
+ unique_ref,
153
+ updated_at
154
+ from public.booking_channel
155
+ on conflict (id) do nothing;
156
+ `.execute(controlPlaneBootstrapKysely);
157
+ await sql `
158
+ insert into control_plane.booking_channel_icon_candidate (
159
+ booking_channel_id,
160
+ cloudflare_image_id,
161
+ color,
162
+ comment,
163
+ created_at,
164
+ external_icon,
165
+ height,
166
+ id,
167
+ provider,
168
+ source,
169
+ updated_at,
170
+ width
171
+ )
172
+ select
173
+ booking_channel_id,
174
+ cloudflare_image_id,
175
+ color,
176
+ comment,
177
+ created_at,
178
+ external_icon,
179
+ height,
180
+ id,
181
+ provider,
182
+ source,
183
+ updated_at,
184
+ width
185
+ from public.booking_channel_icon_candidate
186
+ on conflict (id) do nothing;
187
+ `.execute(controlPlaneBootstrapKysely);
188
+ await sql `
189
+ insert into control_plane.tenant (
190
+ billing_partner_id,
191
+ billing_plan,
192
+ created_at,
193
+ data_region,
194
+ id,
195
+ name,
196
+ partner_id,
197
+ slug,
198
+ status,
199
+ storage_realm,
200
+ type,
201
+ unique_ref,
202
+ updated_at
203
+ )
204
+ select
205
+ billing_partner_id,
206
+ billing_plan,
207
+ created_at,
208
+ data_region,
209
+ id,
210
+ name,
211
+ partner_id,
212
+ slug,
213
+ status,
214
+ storage_realm,
215
+ type,
216
+ unique_ref,
217
+ updated_at
218
+ from public.tenant
219
+ on conflict (id) do nothing;
220
+ `.execute(controlPlaneBootstrapKysely);
221
+ await sql `
222
+ insert into control_plane.token (
223
+ created_at,
224
+ expires_at,
225
+ id,
226
+ nano_id,
227
+ payload,
228
+ tenant_id,
229
+ type,
230
+ user_id
231
+ )
232
+ select
233
+ created_at,
234
+ expires_at,
235
+ id,
236
+ nano_id,
237
+ payload,
238
+ tenant_id,
239
+ type,
240
+ user_id
241
+ from public.token
242
+ on conflict (id) do nothing;
243
+ `.execute(controlPlaneBootstrapKysely);
244
+ const controlPlaneKysely = withControlPlaneSchema(getKysely(dialect, {
245
+ repositoryName: `${args.repositoryName ?? 'localTesting'}/control-plane`,
246
+ log: args.log,
247
+ }), 'control_plane', 'control_plane');
248
+ controlPlaneKysely.destroy = async () => { };
249
+ Object.defineProperty(kysely, 'controlPlaneKysely', {
250
+ value: controlPlaneKysely,
251
+ });
42
252
  const originalDestroy = kysely.destroy.bind(kysely);
43
253
  kysely.destroy = async () => {
44
254
  if (isDestroyed)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"src/","sources":["local/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAkB,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AAOrD,KAAK,UAAU,eAAe,CAAC,MAAmC;IAChE,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;QAC5B,EAAE,EAAE,MAAM;QACV,oBAAoB,EAAE,MAAM;QAC5B,kBAAkB,EAAE,kBAAkB;QACtC,sBAAsB,EAAE,uBAAuB;QAC/C,QAAQ,EAAE,IAAI,qBAAqB,CAAC;YAClC,EAAE;YACF,IAAI;YACJ,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,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;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B,EAAE;IACnE,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,iCAAiC;IAEjC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE;QAChC,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,cAAc;QACtD,GAAG,EAAE,IAAI,EAAE,GAAG;KACf,CAAC,CAAC;IACH,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,4BAA4B,CAAC,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"]}
@@ -1,5 +1,6 @@
1
1
  import { readFile, writeFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
+ import { KyselyError } from '../error';
3
4
  const START_MARKER = '-- VRP legacy-column-prune:start';
4
5
  const END_MARKER = '-- VRP legacy-column-prune:end';
5
6
  const hasuraAuditTriggerPattern = /^CREATE TRIGGER "(notify_hasura_audit_[^"]+)" [\s\S]*? ON ([^\s;]+) FOR EACH ROW EXECUTE FUNCTION hdb_catalog\."notify_hasura_audit_[^"]+"\(\);$/gm;
@@ -109,7 +110,9 @@ export function applyPruneBlock(sql, columns) {
109
110
  if (startAt !== -1) {
110
111
  const endAt = sql.indexOf(END_MARKER, startAt);
111
112
  if (endAt === -1) {
112
- throw new Error(`Malformed legacy prune block in initial SQL: missing "${END_MARKER}".`);
113
+ throw new KyselyError('Malformed legacy prune block in initial SQL', {
114
+ missingMarker: END_MARKER,
115
+ });
113
116
  }
114
117
  const tailStart = endAt + END_MARKER.length;
115
118
  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":"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","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,8 @@
1
+ export const appMigrationEpoch = {
2
+ baseline: '0000000000000-baseline',
3
+ folder: 'migrations-v2',
4
+ lockTableName: 'kysely_migration_lock',
5
+ tableName: 'kysely_migration',
6
+ tableSchema: 'kysely_v2',
7
+ };
8
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"src/","sources":["migration.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,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 & {
@@ -1,16 +1,12 @@
1
1
  import { day } from '@vrplatform/utils';
2
2
  import { sql } from '../../isomorphic';
3
+ import { whereTenantActive } from '../tenant/status';
3
4
  function hasActiveListing(eb, today) {
4
5
  return eb.exists(eb
5
6
  .selectFrom('public.tenant as tenant')
6
- .leftJoin('public.tenant as billingPartner', 'billingPartner.id', 'tenant.calculatedBillingPartnerId')
7
7
  .select('tenant.id')
8
8
  .whereRef('tenant.id', '=', 'l.tenantId')
9
- .where('tenant.calculatedStatus', '=', 'active')
10
- .where((eb2) => eb2.or([
11
- eb2('tenant.calculatedBillingPartnerId', 'is', null),
12
- eb2('billingPartner.calculatedStatus', '=', 'active'),
13
- ]))
9
+ .where(whereTenantActive)
14
10
  .where((eb2) => eb2.or([
15
11
  eb2.and([
16
12
  eb2('tenant.isGeneralLedger', '=', false),
@@ -65,12 +61,6 @@ export function whereListingIsInactive(eb, today = day().yyyymmdd()) {
65
61
  export function whereListingIsActive(eb, today = day().yyyymmdd()) {
66
62
  return hasActiveListing(eb, today);
67
63
  }
68
- export function selectListingIsInactive(eb, today = day().yyyymmdd()) {
69
- return whereListingIsInactive(eb, today);
70
- }
71
- export function selectListingIsActive(eb, today = day().yyyymmdd()) {
72
- return whereListingIsActive(eb, today);
73
- }
74
64
  export function selectListingStatus(eb, today = day().yyyymmdd()) {
75
65
  return eb
76
66
  .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 {};
@@ -1,35 +1,32 @@
1
- import { day } from '@vrplatform/utils';
1
+ import { sql, } from '../../isomorphic';
2
+ import { getCalculatedBillingPartnerId } from './billing-partner';
2
3
  export function whereTenantActive(eb) {
3
4
  return eb.and([
4
5
  eb('tenant.calculatedStatus', '=', 'active'),
5
- eb.exists(eb
6
+ eb.not(eb.exists(eb
6
7
  .selectFrom('public.tenant as billingPartner')
7
8
  .select('billingPartner.id')
8
- .whereRef('billingPartner.id', '=', 'tenant.calculatedBillingPartnerId')
9
- .where('billingPartner.calculatedStatus', '=', 'active')),
9
+ .where('billingPartner.id', '=', eb.fn.coalesce('tenant.calculatedBillingPartnerId', eb.val(getCalculatedBillingPartnerId({}))))
10
+ .where('billingPartner.calculatedStatus', 'is distinct from', 'active'))),
10
11
  ]);
11
12
  }
12
- export function whereTenantNotTestTeam(eb, testTeamId) {
13
- return eb.and([
14
- eb('tenant.id', '!=', testTeamId),
15
- eb.or([
16
- eb('tenant.partnerId', 'is', null),
17
- eb('tenant.partnerId', '!=', testTeamId),
18
- ]),
19
- eb.or([
20
- eb('tenant.billingPartnerId', 'is', null),
21
- eb('tenant.billingPartnerId', '!=', testTeamId),
22
- ]),
23
- ]);
13
+ export function whereTenantNotTestTeam(testTeamId) {
14
+ return sql `(
15
+ ${sql.ref('tenant.id')} != ${testTeamId}
16
+ and (
17
+ ${sql.ref('tenant.partnerId')} is null
18
+ or ${sql.ref('tenant.partnerId')} != ${testTeamId}
19
+ )
20
+ and (
21
+ ${sql.ref('tenant.billingPartnerId')} is null
22
+ or ${sql.ref('tenant.billingPartnerId')} != ${testTeamId}
23
+ )
24
+ )`;
24
25
  }
25
- export function whereTenantShouldBePaid(eb, { includePartnerTeams = false, today = day().yyyymmdd(), } = {}) {
26
+ export function whereTenantShouldBePaid(eb, { includePartnerTeams = false, } = {}) {
26
27
  return eb.and([
27
28
  whereTenantActive(eb),
28
29
  eb('tenant.isOnboarding', '=', false),
29
- eb.or([
30
- eb('tenant.trialUntil', '<', today),
31
- eb('tenant.trialUntil', 'is', null),
32
- ]),
33
30
  ...(includePartnerTeams
34
31
  ? []
35
32
  : [eb('tenant.calculatedIsBillable', '=', true)]),
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/tenant/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAQxC,MAAM,UAAU,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,MAAM,UAAU,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,MAAM,UAAU,uBAAuB,CACrC,EAA2B,EAC3B,EACE,mBAAmB,GAAG,KAAK,EAC3B,KAAK,GAAG,GAAG,EAAE,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":"AAAA,OAAO,EACL,GAAG,GAKJ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAOlE,MAAM,UAAU,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,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAC1C,CACF;aACA,KAAK,CACJ,iCAAiC,EACjC,kBAAkB,EAClB,QAAQ,CACT,CACJ,CACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,GAAG,CAAS;MACf,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,UAAU;;QAEnC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC;WACxB,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,UAAU;;;QAG/C,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC;WAC/B,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,OAAO,UAAU;;IAE1D,CAAC;AACL,CAAC;AAED,MAAM,UAAU,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>;
@@ -74,6 +74,10 @@ async function defaultUseAsyncKysely(connectionString, options) {
74
74
  const { useAsyncKysely } = await import('./index');
75
75
  return await useAsyncKysely(connectionString, options);
76
76
  }
77
+ async function defaultUseAsyncControlPlaneKysely(connectionString, options) {
78
+ const { useAsyncControlPlaneKysely } = await import('./index');
79
+ return await useAsyncControlPlaneKysely(connectionString, options);
80
+ }
77
81
  export async function useTenantDatabaseKysely(dataRegion, repositoryName, env, options = {}) {
78
82
  const open = options.useAsyncKysely ?? defaultUseAsyncKysely;
79
83
  return await open(resolveTenantDatabaseUrl(dataRegion, env), {
@@ -94,26 +98,26 @@ export async function resolveTenantKysely({ connectionId, slug, tenantId, reposi
94
98
  const controlPlaneDatabaseUrl = env.CONTROL_PLANE_DATABASE_URL;
95
99
  if (!controlPlaneDatabaseUrl)
96
100
  throw new Error('CONTROL_PLANE_DATABASE_URL is required');
97
- const controlPlane = await (options.useAsyncKysely ?? defaultUseAsyncKysely)(controlPlaneDatabaseUrl, {
101
+ const controlPlane = await (options.useAsyncControlPlaneKysely ?? defaultUseAsyncControlPlaneKysely)(controlPlaneDatabaseUrl, {
98
102
  repositoryName: `${repositoryName}/control-plane`,
99
103
  probe: options.probe,
100
104
  });
101
105
  let tenant;
102
106
  try {
103
107
  const query = controlPlane
104
- .selectFrom('public.tenant')
108
+ .selectFrom('controlPlane.tenant as tenant')
105
109
  .select([
106
- 'public.tenant.id as id',
107
- 'public.tenant.slug as slug',
108
- 'public.tenant.dataRegion as dataRegion',
110
+ 'tenant.id as id',
111
+ 'tenant.slug as slug',
112
+ 'tenant.dataRegion as dataRegion',
109
113
  ]);
110
114
  tenant = await (slug
111
- ? query.where('public.tenant.slug', '=', slug)
115
+ ? query.where('tenant.slug', '=', slug)
112
116
  : connectionId
113
117
  ? query
114
- .innerJoin('public.connectionRoute', 'public.connectionRoute.tenantId', 'public.tenant.id')
115
- .where('public.connectionRoute.connectionId', '=', connectionId)
116
- : query.where('public.tenant.id', '=', tenantId)).executeTakeFirst();
118
+ .innerJoin('controlPlane.connectionRoute as connectionRoute', 'connectionRoute.tenantId', 'tenant.id')
119
+ .where('connectionRoute.connectionId', '=', connectionId)
120
+ : query.where('tenant.id', '=', tenantId)).executeTakeFirst();
117
121
  }
118
122
  finally {
119
123
  await controlPlane.destroy();