@kernhq/module-billing 0.2.0

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 (46) hide show
  1. package/LICENSE +662 -0
  2. package/dist/contract.d.ts +965 -0
  3. package/dist/contract.d.ts.map +1 -0
  4. package/dist/contract.js +265 -0
  5. package/dist/contract.js.map +1 -0
  6. package/dist/server/index.d.ts +11 -0
  7. package/dist/server/index.d.ts.map +1 -0
  8. package/dist/server/index.js +165 -0
  9. package/dist/server/index.js.map +1 -0
  10. package/dist/server/router.d.ts +697 -0
  11. package/dist/server/router.d.ts.map +1 -0
  12. package/dist/server/router.js +126 -0
  13. package/dist/server/router.js.map +1 -0
  14. package/dist/server/schema.d.ts +1030 -0
  15. package/dist/server/schema.d.ts.map +1 -0
  16. package/dist/server/schema.js +137 -0
  17. package/dist/server/schema.js.map +1 -0
  18. package/dist/server/services/entitlements.d.ts +3 -0
  19. package/dist/server/services/entitlements.d.ts.map +1 -0
  20. package/dist/server/services/entitlements.js +68 -0
  21. package/dist/server/services/entitlements.js.map +1 -0
  22. package/dist/server/services/plans.d.ts +20 -0
  23. package/dist/server/services/plans.d.ts.map +1 -0
  24. package/dist/server/services/plans.js +122 -0
  25. package/dist/server/services/plans.js.map +1 -0
  26. package/dist/server/services/stripe.d.ts +42 -0
  27. package/dist/server/services/stripe.d.ts.map +1 -0
  28. package/dist/server/services/stripe.js +267 -0
  29. package/dist/server/services/stripe.js.map +1 -0
  30. package/dist/server/services/subscriptions.d.ts +35 -0
  31. package/dist/server/services/subscriptions.d.ts.map +1 -0
  32. package/dist/server/services/subscriptions.js +193 -0
  33. package/dist/server/services/subscriptions.js.map +1 -0
  34. package/dist/server/services/usage.d.ts +40 -0
  35. package/dist/server/services/usage.d.ts.map +1 -0
  36. package/dist/server/services/usage.js +98 -0
  37. package/dist/server/services/usage.js.map +1 -0
  38. package/migrations/0000_init.sql +82 -0
  39. package/migrations/0001_rls.sql +18 -0
  40. package/migrations/meta/0000_snapshot.json +580 -0
  41. package/migrations/meta/_journal.json +20 -0
  42. package/package.json +73 -0
  43. package/src/client/api.ts +15 -0
  44. package/src/client/format.test.ts +64 -0
  45. package/src/client/index.ts +81 -0
  46. package/src/contract.ts +311 -0
@@ -0,0 +1,1030 @@
1
+ export declare const schema: import("drizzle-orm/pg-core").PgSchema<"mod_billing">;
2
+ /**
3
+ * # Why most of this module is not row-level secured
4
+ *
5
+ * Kern's rule is that a module's tenant tables carry `workspace_id` and RLS. Billing is the one place
6
+ * that rule does not fit, and it is worth saying exactly why rather than leaving the next person to
7
+ * assume it was forgotten.
8
+ *
9
+ * A subscription row is not the workspace's data. It is the **instance operator's** record *about*
10
+ * that workspace: what they charge it, whether it has paid, whether it is suspended. Two things
11
+ * follow, and neither is possible under RLS, which returns nothing at all when `app.workspace_id` is
12
+ * unset:
13
+ *
14
+ * - the instance console lists every workspace on the instance in one query — that screen is the
15
+ * whole reason an operator can run Kern as a service;
16
+ * - the dunning and reconcile jobs enumerate workspaces before they can pick one.
17
+ *
18
+ * So `plans`, `subscriptions`, `workspace_usage`, `overrides` and `webhook_events` are operator
19
+ * tables, and their isolation is enforced in the procedure layer: every workspace-facing procedure
20
+ * filters by the caller's own workspace and checks `billing.subscription.view|manage` first.
21
+ *
22
+ * `invoices` is the exception that proves it. An invoice **is** the customer's own record, read on
23
+ * their own billing screen, so it is a proper tenant table with RLS — see `TENANT_TABLES` below.
24
+ */
25
+ /** The catalogue. Instance-scoped: a plan belongs to the instance, not to any workspace. */
26
+ export declare const plans: import("drizzle-orm/pg-core").PgTableWithColumns<{
27
+ name: "plans";
28
+ schema: "mod_billing";
29
+ columns: {
30
+ id: import("drizzle-orm/pg-core").PgColumn<{
31
+ name: "id";
32
+ tableName: "plans";
33
+ dataType: "string";
34
+ columnType: "PgUUID";
35
+ data: string;
36
+ driverParam: string;
37
+ notNull: true;
38
+ hasDefault: true;
39
+ isPrimaryKey: true;
40
+ isAutoincrement: false;
41
+ hasRuntimeDefault: false;
42
+ enumValues: undefined;
43
+ baseColumn: never;
44
+ identity: undefined;
45
+ generated: undefined;
46
+ }, {}, {}>;
47
+ slug: import("drizzle-orm/pg-core").PgColumn<{
48
+ name: "slug";
49
+ tableName: "plans";
50
+ dataType: "string";
51
+ columnType: "PgText";
52
+ data: string;
53
+ driverParam: string;
54
+ notNull: true;
55
+ hasDefault: false;
56
+ isPrimaryKey: false;
57
+ isAutoincrement: false;
58
+ hasRuntimeDefault: false;
59
+ enumValues: [string, ...string[]];
60
+ baseColumn: never;
61
+ identity: undefined;
62
+ generated: undefined;
63
+ }, {}, {}>;
64
+ name: import("drizzle-orm/pg-core").PgColumn<{
65
+ name: "name";
66
+ tableName: "plans";
67
+ dataType: "string";
68
+ columnType: "PgText";
69
+ data: string;
70
+ driverParam: string;
71
+ notNull: true;
72
+ hasDefault: false;
73
+ isPrimaryKey: false;
74
+ isAutoincrement: false;
75
+ hasRuntimeDefault: false;
76
+ enumValues: [string, ...string[]];
77
+ baseColumn: never;
78
+ identity: undefined;
79
+ generated: undefined;
80
+ }, {}, {}>;
81
+ description: import("drizzle-orm/pg-core").PgColumn<{
82
+ name: "description";
83
+ tableName: "plans";
84
+ dataType: "string";
85
+ columnType: "PgText";
86
+ data: string;
87
+ driverParam: string;
88
+ notNull: true;
89
+ hasDefault: true;
90
+ isPrimaryKey: false;
91
+ isAutoincrement: false;
92
+ hasRuntimeDefault: false;
93
+ enumValues: [string, ...string[]];
94
+ baseColumn: never;
95
+ identity: undefined;
96
+ generated: undefined;
97
+ }, {}, {}>;
98
+ priceMinor: import("drizzle-orm/pg-core").PgColumn<{
99
+ name: "price_minor";
100
+ tableName: "plans";
101
+ dataType: "number";
102
+ columnType: "PgInteger";
103
+ data: number;
104
+ driverParam: string | number;
105
+ notNull: true;
106
+ hasDefault: true;
107
+ isPrimaryKey: false;
108
+ isAutoincrement: false;
109
+ hasRuntimeDefault: false;
110
+ enumValues: undefined;
111
+ baseColumn: never;
112
+ identity: undefined;
113
+ generated: undefined;
114
+ }, {}, {}>;
115
+ currency: import("drizzle-orm/pg-core").PgColumn<{
116
+ name: "currency";
117
+ tableName: "plans";
118
+ dataType: "string";
119
+ columnType: "PgText";
120
+ data: string;
121
+ driverParam: string;
122
+ notNull: true;
123
+ hasDefault: true;
124
+ isPrimaryKey: false;
125
+ isAutoincrement: false;
126
+ hasRuntimeDefault: false;
127
+ enumValues: [string, ...string[]];
128
+ baseColumn: never;
129
+ identity: undefined;
130
+ generated: undefined;
131
+ }, {}, {}>;
132
+ interval: import("drizzle-orm/pg-core").PgColumn<{
133
+ name: "interval";
134
+ tableName: "plans";
135
+ dataType: "string";
136
+ columnType: "PgText";
137
+ data: string;
138
+ driverParam: string;
139
+ notNull: true;
140
+ hasDefault: true;
141
+ isPrimaryKey: false;
142
+ isAutoincrement: false;
143
+ hasRuntimeDefault: false;
144
+ enumValues: [string, ...string[]];
145
+ baseColumn: never;
146
+ identity: undefined;
147
+ generated: undefined;
148
+ }, {}, {}>;
149
+ perSeat: import("drizzle-orm/pg-core").PgColumn<{
150
+ name: "per_seat";
151
+ tableName: "plans";
152
+ dataType: "boolean";
153
+ columnType: "PgBoolean";
154
+ data: boolean;
155
+ driverParam: boolean;
156
+ notNull: true;
157
+ hasDefault: true;
158
+ isPrimaryKey: false;
159
+ isAutoincrement: false;
160
+ hasRuntimeDefault: false;
161
+ enumValues: undefined;
162
+ baseColumn: never;
163
+ identity: undefined;
164
+ generated: undefined;
165
+ }, {}, {}>;
166
+ trialDays: import("drizzle-orm/pg-core").PgColumn<{
167
+ name: "trial_days";
168
+ tableName: "plans";
169
+ dataType: "number";
170
+ columnType: "PgInteger";
171
+ data: number;
172
+ driverParam: string | number;
173
+ notNull: true;
174
+ hasDefault: true;
175
+ isPrimaryKey: false;
176
+ isAutoincrement: false;
177
+ hasRuntimeDefault: false;
178
+ enumValues: undefined;
179
+ baseColumn: never;
180
+ identity: undefined;
181
+ generated: undefined;
182
+ }, {}, {}>;
183
+ limits: import("drizzle-orm/pg-core").PgColumn<{
184
+ name: string;
185
+ tableName: "plans";
186
+ dataType: "json";
187
+ columnType: "PgJsonb";
188
+ data: unknown;
189
+ driverParam: unknown;
190
+ notNull: true;
191
+ hasDefault: true;
192
+ isPrimaryKey: false;
193
+ isAutoincrement: false;
194
+ hasRuntimeDefault: false;
195
+ enumValues: undefined;
196
+ baseColumn: never;
197
+ identity: undefined;
198
+ generated: undefined;
199
+ }, {}, {}>;
200
+ stripePriceId: import("drizzle-orm/pg-core").PgColumn<{
201
+ name: "stripe_price_id";
202
+ tableName: "plans";
203
+ dataType: "string";
204
+ columnType: "PgText";
205
+ data: string;
206
+ driverParam: string;
207
+ notNull: false;
208
+ hasDefault: false;
209
+ isPrimaryKey: false;
210
+ isAutoincrement: false;
211
+ hasRuntimeDefault: false;
212
+ enumValues: [string, ...string[]];
213
+ baseColumn: never;
214
+ identity: undefined;
215
+ generated: undefined;
216
+ }, {}, {}>;
217
+ highlights: import("drizzle-orm/pg-core").PgColumn<{
218
+ name: string;
219
+ tableName: "plans";
220
+ dataType: "json";
221
+ columnType: "PgJsonb";
222
+ data: unknown;
223
+ driverParam: unknown;
224
+ notNull: true;
225
+ hasDefault: true;
226
+ isPrimaryKey: false;
227
+ isAutoincrement: false;
228
+ hasRuntimeDefault: false;
229
+ enumValues: undefined;
230
+ baseColumn: never;
231
+ identity: undefined;
232
+ generated: undefined;
233
+ }, {}, {}>;
234
+ published: import("drizzle-orm/pg-core").PgColumn<{
235
+ name: "published";
236
+ tableName: "plans";
237
+ dataType: "boolean";
238
+ columnType: "PgBoolean";
239
+ data: boolean;
240
+ driverParam: boolean;
241
+ notNull: true;
242
+ hasDefault: true;
243
+ isPrimaryKey: false;
244
+ isAutoincrement: false;
245
+ hasRuntimeDefault: false;
246
+ enumValues: undefined;
247
+ baseColumn: never;
248
+ identity: undefined;
249
+ generated: undefined;
250
+ }, {}, {}>;
251
+ order: import("drizzle-orm/pg-core").PgColumn<{
252
+ name: "order";
253
+ tableName: "plans";
254
+ dataType: "number";
255
+ columnType: "PgInteger";
256
+ data: number;
257
+ driverParam: string | number;
258
+ notNull: true;
259
+ hasDefault: true;
260
+ isPrimaryKey: false;
261
+ isAutoincrement: false;
262
+ hasRuntimeDefault: false;
263
+ enumValues: undefined;
264
+ baseColumn: never;
265
+ identity: undefined;
266
+ generated: undefined;
267
+ }, {}, {}>;
268
+ archivedAt: import("drizzle-orm/pg-core").PgColumn<{
269
+ name: string;
270
+ tableName: "plans";
271
+ dataType: "date";
272
+ columnType: "PgTimestamp";
273
+ data: Date;
274
+ driverParam: string;
275
+ notNull: false;
276
+ hasDefault: false;
277
+ isPrimaryKey: false;
278
+ isAutoincrement: false;
279
+ hasRuntimeDefault: false;
280
+ enumValues: undefined;
281
+ baseColumn: never;
282
+ identity: undefined;
283
+ generated: undefined;
284
+ }, {}, {}>;
285
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
286
+ name: string;
287
+ tableName: "plans";
288
+ dataType: "date";
289
+ columnType: "PgTimestamp";
290
+ data: Date;
291
+ driverParam: string;
292
+ notNull: true;
293
+ hasDefault: true;
294
+ isPrimaryKey: false;
295
+ isAutoincrement: false;
296
+ hasRuntimeDefault: false;
297
+ enumValues: undefined;
298
+ baseColumn: never;
299
+ identity: undefined;
300
+ generated: undefined;
301
+ }, {}, {}>;
302
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
303
+ name: string;
304
+ tableName: "plans";
305
+ dataType: "date";
306
+ columnType: "PgTimestamp";
307
+ data: Date;
308
+ driverParam: string;
309
+ notNull: true;
310
+ hasDefault: true;
311
+ isPrimaryKey: false;
312
+ isAutoincrement: false;
313
+ hasRuntimeDefault: false;
314
+ enumValues: undefined;
315
+ baseColumn: never;
316
+ identity: undefined;
317
+ generated: undefined;
318
+ }, {}, {}>;
319
+ };
320
+ dialect: "pg";
321
+ }>;
322
+ /** One per workspace. Operator table — see the note at the top of this file. */
323
+ export declare const subscriptions: import("drizzle-orm/pg-core").PgTableWithColumns<{
324
+ name: "subscriptions";
325
+ schema: "mod_billing";
326
+ columns: {
327
+ workspaceId: import("drizzle-orm/pg-core").PgColumn<{
328
+ name: "workspace_id";
329
+ tableName: "subscriptions";
330
+ dataType: "string";
331
+ columnType: "PgUUID";
332
+ data: string;
333
+ driverParam: string;
334
+ notNull: true;
335
+ hasDefault: false;
336
+ isPrimaryKey: true;
337
+ isAutoincrement: false;
338
+ hasRuntimeDefault: false;
339
+ enumValues: undefined;
340
+ baseColumn: never;
341
+ identity: undefined;
342
+ generated: undefined;
343
+ }, {}, {}>;
344
+ planId: import("drizzle-orm/pg-core").PgColumn<{
345
+ name: "plan_id";
346
+ tableName: "subscriptions";
347
+ dataType: "string";
348
+ columnType: "PgUUID";
349
+ data: string;
350
+ driverParam: string;
351
+ notNull: false;
352
+ hasDefault: false;
353
+ isPrimaryKey: false;
354
+ isAutoincrement: false;
355
+ hasRuntimeDefault: false;
356
+ enumValues: undefined;
357
+ baseColumn: never;
358
+ identity: undefined;
359
+ generated: undefined;
360
+ }, {}, {}>;
361
+ status: import("drizzle-orm/pg-core").PgColumn<{
362
+ name: "status";
363
+ tableName: "subscriptions";
364
+ dataType: "string";
365
+ columnType: "PgText";
366
+ data: string;
367
+ driverParam: string;
368
+ notNull: true;
369
+ hasDefault: true;
370
+ isPrimaryKey: false;
371
+ isAutoincrement: false;
372
+ hasRuntimeDefault: false;
373
+ enumValues: [string, ...string[]];
374
+ baseColumn: never;
375
+ identity: undefined;
376
+ generated: undefined;
377
+ }, {}, {}>;
378
+ seatsPurchased: import("drizzle-orm/pg-core").PgColumn<{
379
+ name: "seats_purchased";
380
+ tableName: "subscriptions";
381
+ dataType: "number";
382
+ columnType: "PgInteger";
383
+ data: number;
384
+ driverParam: string | number;
385
+ notNull: true;
386
+ hasDefault: true;
387
+ isPrimaryKey: false;
388
+ isAutoincrement: false;
389
+ hasRuntimeDefault: false;
390
+ enumValues: undefined;
391
+ baseColumn: never;
392
+ identity: undefined;
393
+ generated: undefined;
394
+ }, {}, {}>;
395
+ trialEndsAt: import("drizzle-orm/pg-core").PgColumn<{
396
+ name: string;
397
+ tableName: "subscriptions";
398
+ dataType: "date";
399
+ columnType: "PgTimestamp";
400
+ data: Date;
401
+ driverParam: string;
402
+ notNull: false;
403
+ hasDefault: false;
404
+ isPrimaryKey: false;
405
+ isAutoincrement: false;
406
+ hasRuntimeDefault: false;
407
+ enumValues: undefined;
408
+ baseColumn: never;
409
+ identity: undefined;
410
+ generated: undefined;
411
+ }, {}, {}>;
412
+ currentPeriodEnd: import("drizzle-orm/pg-core").PgColumn<{
413
+ name: string;
414
+ tableName: "subscriptions";
415
+ dataType: "date";
416
+ columnType: "PgTimestamp";
417
+ data: Date;
418
+ driverParam: string;
419
+ notNull: false;
420
+ hasDefault: false;
421
+ isPrimaryKey: false;
422
+ isAutoincrement: false;
423
+ hasRuntimeDefault: false;
424
+ enumValues: undefined;
425
+ baseColumn: never;
426
+ identity: undefined;
427
+ generated: undefined;
428
+ }, {}, {}>;
429
+ cancelAtPeriodEnd: import("drizzle-orm/pg-core").PgColumn<{
430
+ name: "cancel_at_period_end";
431
+ tableName: "subscriptions";
432
+ dataType: "boolean";
433
+ columnType: "PgBoolean";
434
+ data: boolean;
435
+ driverParam: boolean;
436
+ notNull: true;
437
+ hasDefault: true;
438
+ isPrimaryKey: false;
439
+ isAutoincrement: false;
440
+ hasRuntimeDefault: false;
441
+ enumValues: undefined;
442
+ baseColumn: never;
443
+ identity: undefined;
444
+ generated: undefined;
445
+ }, {}, {}>;
446
+ stripeCustomerId: import("drizzle-orm/pg-core").PgColumn<{
447
+ name: "stripe_customer_id";
448
+ tableName: "subscriptions";
449
+ dataType: "string";
450
+ columnType: "PgText";
451
+ data: string;
452
+ driverParam: string;
453
+ notNull: false;
454
+ hasDefault: false;
455
+ isPrimaryKey: false;
456
+ isAutoincrement: false;
457
+ hasRuntimeDefault: false;
458
+ enumValues: [string, ...string[]];
459
+ baseColumn: never;
460
+ identity: undefined;
461
+ generated: undefined;
462
+ }, {}, {}>;
463
+ stripeSubscriptionId: import("drizzle-orm/pg-core").PgColumn<{
464
+ name: "stripe_subscription_id";
465
+ tableName: "subscriptions";
466
+ dataType: "string";
467
+ columnType: "PgText";
468
+ data: string;
469
+ driverParam: string;
470
+ notNull: false;
471
+ hasDefault: false;
472
+ isPrimaryKey: false;
473
+ isAutoincrement: false;
474
+ hasRuntimeDefault: false;
475
+ enumValues: [string, ...string[]];
476
+ baseColumn: never;
477
+ identity: undefined;
478
+ generated: undefined;
479
+ }, {}, {}>;
480
+ graceEndsAt: import("drizzle-orm/pg-core").PgColumn<{
481
+ name: string;
482
+ tableName: "subscriptions";
483
+ dataType: "date";
484
+ columnType: "PgTimestamp";
485
+ data: Date;
486
+ driverParam: string;
487
+ notNull: false;
488
+ hasDefault: false;
489
+ isPrimaryKey: false;
490
+ isAutoincrement: false;
491
+ hasRuntimeDefault: false;
492
+ enumValues: undefined;
493
+ baseColumn: never;
494
+ identity: undefined;
495
+ generated: undefined;
496
+ }, {}, {}>;
497
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
498
+ name: string;
499
+ tableName: "subscriptions";
500
+ dataType: "date";
501
+ columnType: "PgTimestamp";
502
+ data: Date;
503
+ driverParam: string;
504
+ notNull: true;
505
+ hasDefault: true;
506
+ isPrimaryKey: false;
507
+ isAutoincrement: false;
508
+ hasRuntimeDefault: false;
509
+ enumValues: undefined;
510
+ baseColumn: never;
511
+ identity: undefined;
512
+ generated: undefined;
513
+ }, {}, {}>;
514
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
515
+ name: string;
516
+ tableName: "subscriptions";
517
+ dataType: "date";
518
+ columnType: "PgTimestamp";
519
+ data: Date;
520
+ driverParam: string;
521
+ notNull: true;
522
+ hasDefault: true;
523
+ isPrimaryKey: false;
524
+ isAutoincrement: false;
525
+ hasRuntimeDefault: false;
526
+ enumValues: undefined;
527
+ baseColumn: never;
528
+ identity: undefined;
529
+ generated: undefined;
530
+ }, {}, {}>;
531
+ };
532
+ dialect: "pg";
533
+ }>;
534
+ /**
535
+ * What a workspace is actually using.
536
+ *
537
+ * Kept as a counter rather than recomputed, because `sum(files.size)` on every upload is a scan of
538
+ * the workspace's whole file table. Event subscriptions move it; a nightly job recomputes the truth
539
+ * and logs the drift rather than silently papering over it, because silent correction hides the bug
540
+ * that caused the drift.
541
+ */
542
+ export declare const workspaceUsage: import("drizzle-orm/pg-core").PgTableWithColumns<{
543
+ name: "workspace_usage";
544
+ schema: "mod_billing";
545
+ columns: {
546
+ workspaceId: import("drizzle-orm/pg-core").PgColumn<{
547
+ name: "workspace_id";
548
+ tableName: "workspace_usage";
549
+ dataType: "string";
550
+ columnType: "PgUUID";
551
+ data: string;
552
+ driverParam: string;
553
+ notNull: true;
554
+ hasDefault: false;
555
+ isPrimaryKey: true;
556
+ isAutoincrement: false;
557
+ hasRuntimeDefault: false;
558
+ enumValues: undefined;
559
+ baseColumn: never;
560
+ identity: undefined;
561
+ generated: undefined;
562
+ }, {}, {}>;
563
+ seats: import("drizzle-orm/pg-core").PgColumn<{
564
+ name: "seats";
565
+ tableName: "workspace_usage";
566
+ dataType: "number";
567
+ columnType: "PgInteger";
568
+ data: number;
569
+ driverParam: string | number;
570
+ notNull: true;
571
+ hasDefault: true;
572
+ isPrimaryKey: false;
573
+ isAutoincrement: false;
574
+ hasRuntimeDefault: false;
575
+ enumValues: undefined;
576
+ baseColumn: never;
577
+ identity: undefined;
578
+ generated: undefined;
579
+ }, {}, {}>;
580
+ storageBytes: import("drizzle-orm/pg-core").PgColumn<{
581
+ name: "storage_bytes";
582
+ tableName: "workspace_usage";
583
+ dataType: "number";
584
+ columnType: "PgBigInt53";
585
+ data: number;
586
+ driverParam: string | number;
587
+ notNull: true;
588
+ hasDefault: true;
589
+ isPrimaryKey: false;
590
+ isAutoincrement: false;
591
+ hasRuntimeDefault: false;
592
+ enumValues: undefined;
593
+ baseColumn: never;
594
+ identity: undefined;
595
+ generated: undefined;
596
+ }, {}, {}>;
597
+ reconciledAt: import("drizzle-orm/pg-core").PgColumn<{
598
+ name: string;
599
+ tableName: "workspace_usage";
600
+ dataType: "date";
601
+ columnType: "PgTimestamp";
602
+ data: Date;
603
+ driverParam: string;
604
+ notNull: false;
605
+ hasDefault: false;
606
+ isPrimaryKey: false;
607
+ isAutoincrement: false;
608
+ hasRuntimeDefault: false;
609
+ enumValues: undefined;
610
+ baseColumn: never;
611
+ identity: undefined;
612
+ generated: undefined;
613
+ }, {}, {}>;
614
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
615
+ name: string;
616
+ tableName: "workspace_usage";
617
+ dataType: "date";
618
+ columnType: "PgTimestamp";
619
+ data: Date;
620
+ driverParam: string;
621
+ notNull: true;
622
+ hasDefault: true;
623
+ isPrimaryKey: false;
624
+ isAutoincrement: false;
625
+ hasRuntimeDefault: false;
626
+ enumValues: undefined;
627
+ baseColumn: never;
628
+ identity: undefined;
629
+ generated: undefined;
630
+ }, {}, {}>;
631
+ };
632
+ dialect: "pg";
633
+ }>;
634
+ /** Per-workspace limit overrides, so an account can be comped without inventing a plan for it. */
635
+ export declare const overrides: import("drizzle-orm/pg-core").PgTableWithColumns<{
636
+ name: "overrides";
637
+ schema: "mod_billing";
638
+ columns: {
639
+ workspaceId: import("drizzle-orm/pg-core").PgColumn<{
640
+ name: "workspace_id";
641
+ tableName: "overrides";
642
+ dataType: "string";
643
+ columnType: "PgUUID";
644
+ data: string;
645
+ driverParam: string;
646
+ notNull: true;
647
+ hasDefault: false;
648
+ isPrimaryKey: true;
649
+ isAutoincrement: false;
650
+ hasRuntimeDefault: false;
651
+ enumValues: undefined;
652
+ baseColumn: never;
653
+ identity: undefined;
654
+ generated: undefined;
655
+ }, {}, {}>;
656
+ limits: import("drizzle-orm/pg-core").PgColumn<{
657
+ name: string;
658
+ tableName: "overrides";
659
+ dataType: "json";
660
+ columnType: "PgJsonb";
661
+ data: unknown;
662
+ driverParam: unknown;
663
+ notNull: true;
664
+ hasDefault: true;
665
+ isPrimaryKey: false;
666
+ isAutoincrement: false;
667
+ hasRuntimeDefault: false;
668
+ enumValues: undefined;
669
+ baseColumn: never;
670
+ identity: undefined;
671
+ generated: undefined;
672
+ }, {}, {}>;
673
+ note: import("drizzle-orm/pg-core").PgColumn<{
674
+ name: "note";
675
+ tableName: "overrides";
676
+ dataType: "string";
677
+ columnType: "PgText";
678
+ data: string;
679
+ driverParam: string;
680
+ notNull: true;
681
+ hasDefault: true;
682
+ isPrimaryKey: false;
683
+ isAutoincrement: false;
684
+ hasRuntimeDefault: false;
685
+ enumValues: [string, ...string[]];
686
+ baseColumn: never;
687
+ identity: undefined;
688
+ generated: undefined;
689
+ }, {}, {}>;
690
+ createdBy: import("drizzle-orm/pg-core").PgColumn<{
691
+ name: "created_by";
692
+ tableName: "overrides";
693
+ dataType: "string";
694
+ columnType: "PgUUID";
695
+ data: string;
696
+ driverParam: string;
697
+ notNull: false;
698
+ hasDefault: false;
699
+ isPrimaryKey: false;
700
+ isAutoincrement: false;
701
+ hasRuntimeDefault: false;
702
+ enumValues: undefined;
703
+ baseColumn: never;
704
+ identity: undefined;
705
+ generated: undefined;
706
+ }, {}, {}>;
707
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
708
+ name: string;
709
+ tableName: "overrides";
710
+ dataType: "date";
711
+ columnType: "PgTimestamp";
712
+ data: Date;
713
+ driverParam: string;
714
+ notNull: true;
715
+ hasDefault: true;
716
+ isPrimaryKey: false;
717
+ isAutoincrement: false;
718
+ hasRuntimeDefault: false;
719
+ enumValues: undefined;
720
+ baseColumn: never;
721
+ identity: undefined;
722
+ generated: undefined;
723
+ }, {}, {}>;
724
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
725
+ name: string;
726
+ tableName: "overrides";
727
+ dataType: "date";
728
+ columnType: "PgTimestamp";
729
+ data: Date;
730
+ driverParam: string;
731
+ notNull: true;
732
+ hasDefault: true;
733
+ isPrimaryKey: false;
734
+ isAutoincrement: false;
735
+ hasRuntimeDefault: false;
736
+ enumValues: undefined;
737
+ baseColumn: never;
738
+ identity: undefined;
739
+ generated: undefined;
740
+ }, {}, {}>;
741
+ };
742
+ dialect: "pg";
743
+ }>;
744
+ /**
745
+ * The customer's own invoice history — a **tenant table**, read on their billing screen in their own
746
+ * workspace context. The operator reads invoices in Stripe, which is authoritative; this is a mirror
747
+ * kept so the screen does not have to call Stripe to render.
748
+ */
749
+ export declare const invoices: import("drizzle-orm/pg-core").PgTableWithColumns<{
750
+ name: "invoices";
751
+ schema: "mod_billing";
752
+ columns: {
753
+ id: import("drizzle-orm/pg-core").PgColumn<{
754
+ name: "id";
755
+ tableName: "invoices";
756
+ dataType: "string";
757
+ columnType: "PgUUID";
758
+ data: string;
759
+ driverParam: string;
760
+ notNull: true;
761
+ hasDefault: true;
762
+ isPrimaryKey: true;
763
+ isAutoincrement: false;
764
+ hasRuntimeDefault: false;
765
+ enumValues: undefined;
766
+ baseColumn: never;
767
+ identity: undefined;
768
+ generated: undefined;
769
+ }, {}, {}>;
770
+ workspaceId: import("drizzle-orm/pg-core").PgColumn<{
771
+ name: "workspace_id";
772
+ tableName: "invoices";
773
+ dataType: "string";
774
+ columnType: "PgUUID";
775
+ data: string;
776
+ driverParam: string;
777
+ notNull: true;
778
+ hasDefault: false;
779
+ isPrimaryKey: false;
780
+ isAutoincrement: false;
781
+ hasRuntimeDefault: false;
782
+ enumValues: undefined;
783
+ baseColumn: never;
784
+ identity: undefined;
785
+ generated: undefined;
786
+ }, {}, {}>;
787
+ stripeInvoiceId: import("drizzle-orm/pg-core").PgColumn<{
788
+ name: "stripe_invoice_id";
789
+ tableName: "invoices";
790
+ dataType: "string";
791
+ columnType: "PgText";
792
+ data: string;
793
+ driverParam: string;
794
+ notNull: false;
795
+ hasDefault: false;
796
+ isPrimaryKey: false;
797
+ isAutoincrement: false;
798
+ hasRuntimeDefault: false;
799
+ enumValues: [string, ...string[]];
800
+ baseColumn: never;
801
+ identity: undefined;
802
+ generated: undefined;
803
+ }, {}, {}>;
804
+ number: import("drizzle-orm/pg-core").PgColumn<{
805
+ name: "number";
806
+ tableName: "invoices";
807
+ dataType: "string";
808
+ columnType: "PgText";
809
+ data: string;
810
+ driverParam: string;
811
+ notNull: false;
812
+ hasDefault: false;
813
+ isPrimaryKey: false;
814
+ isAutoincrement: false;
815
+ hasRuntimeDefault: false;
816
+ enumValues: [string, ...string[]];
817
+ baseColumn: never;
818
+ identity: undefined;
819
+ generated: undefined;
820
+ }, {}, {}>;
821
+ status: import("drizzle-orm/pg-core").PgColumn<{
822
+ name: "status";
823
+ tableName: "invoices";
824
+ dataType: "string";
825
+ columnType: "PgText";
826
+ data: string;
827
+ driverParam: string;
828
+ notNull: true;
829
+ hasDefault: false;
830
+ isPrimaryKey: false;
831
+ isAutoincrement: false;
832
+ hasRuntimeDefault: false;
833
+ enumValues: [string, ...string[]];
834
+ baseColumn: never;
835
+ identity: undefined;
836
+ generated: undefined;
837
+ }, {}, {}>;
838
+ totalMinor: import("drizzle-orm/pg-core").PgColumn<{
839
+ name: "total_minor";
840
+ tableName: "invoices";
841
+ dataType: "number";
842
+ columnType: "PgInteger";
843
+ data: number;
844
+ driverParam: string | number;
845
+ notNull: true;
846
+ hasDefault: true;
847
+ isPrimaryKey: false;
848
+ isAutoincrement: false;
849
+ hasRuntimeDefault: false;
850
+ enumValues: undefined;
851
+ baseColumn: never;
852
+ identity: undefined;
853
+ generated: undefined;
854
+ }, {}, {}>;
855
+ currency: import("drizzle-orm/pg-core").PgColumn<{
856
+ name: "currency";
857
+ tableName: "invoices";
858
+ dataType: "string";
859
+ columnType: "PgText";
860
+ data: string;
861
+ driverParam: string;
862
+ notNull: true;
863
+ hasDefault: true;
864
+ isPrimaryKey: false;
865
+ isAutoincrement: false;
866
+ hasRuntimeDefault: false;
867
+ enumValues: [string, ...string[]];
868
+ baseColumn: never;
869
+ identity: undefined;
870
+ generated: undefined;
871
+ }, {}, {}>;
872
+ periodStart: import("drizzle-orm/pg-core").PgColumn<{
873
+ name: string;
874
+ tableName: "invoices";
875
+ dataType: "date";
876
+ columnType: "PgTimestamp";
877
+ data: Date;
878
+ driverParam: string;
879
+ notNull: false;
880
+ hasDefault: false;
881
+ isPrimaryKey: false;
882
+ isAutoincrement: false;
883
+ hasRuntimeDefault: false;
884
+ enumValues: undefined;
885
+ baseColumn: never;
886
+ identity: undefined;
887
+ generated: undefined;
888
+ }, {}, {}>;
889
+ periodEnd: import("drizzle-orm/pg-core").PgColumn<{
890
+ name: string;
891
+ tableName: "invoices";
892
+ dataType: "date";
893
+ columnType: "PgTimestamp";
894
+ data: Date;
895
+ driverParam: string;
896
+ notNull: false;
897
+ hasDefault: false;
898
+ isPrimaryKey: false;
899
+ isAutoincrement: false;
900
+ hasRuntimeDefault: false;
901
+ enumValues: undefined;
902
+ baseColumn: never;
903
+ identity: undefined;
904
+ generated: undefined;
905
+ }, {}, {}>;
906
+ hostedUrl: import("drizzle-orm/pg-core").PgColumn<{
907
+ name: "hosted_url";
908
+ tableName: "invoices";
909
+ dataType: "string";
910
+ columnType: "PgText";
911
+ data: string;
912
+ driverParam: string;
913
+ notNull: false;
914
+ hasDefault: false;
915
+ isPrimaryKey: false;
916
+ isAutoincrement: false;
917
+ hasRuntimeDefault: false;
918
+ enumValues: [string, ...string[]];
919
+ baseColumn: never;
920
+ identity: undefined;
921
+ generated: undefined;
922
+ }, {}, {}>;
923
+ pdfUrl: import("drizzle-orm/pg-core").PgColumn<{
924
+ name: "pdf_url";
925
+ tableName: "invoices";
926
+ dataType: "string";
927
+ columnType: "PgText";
928
+ data: string;
929
+ driverParam: string;
930
+ notNull: false;
931
+ hasDefault: false;
932
+ isPrimaryKey: false;
933
+ isAutoincrement: false;
934
+ hasRuntimeDefault: false;
935
+ enumValues: [string, ...string[]];
936
+ baseColumn: never;
937
+ identity: undefined;
938
+ generated: undefined;
939
+ }, {}, {}>;
940
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
941
+ name: string;
942
+ tableName: "invoices";
943
+ dataType: "date";
944
+ columnType: "PgTimestamp";
945
+ data: Date;
946
+ driverParam: string;
947
+ notNull: true;
948
+ hasDefault: true;
949
+ isPrimaryKey: false;
950
+ isAutoincrement: false;
951
+ hasRuntimeDefault: false;
952
+ enumValues: undefined;
953
+ baseColumn: never;
954
+ identity: undefined;
955
+ generated: undefined;
956
+ }, {}, {}>;
957
+ };
958
+ dialect: "pg";
959
+ }>;
960
+ /**
961
+ * Stripe event ids already applied.
962
+ *
963
+ * Stripe retries a webhook until it gets a 2xx, and it does not promise to deliver only once, so a
964
+ * handler that is not idempotent will double-count. The unique index is what makes the second
965
+ * delivery a no-op — checking then inserting is a race, so the insert *is* the check.
966
+ */
967
+ export declare const webhookEvents: import("drizzle-orm/pg-core").PgTableWithColumns<{
968
+ name: "webhook_events";
969
+ schema: "mod_billing";
970
+ columns: {
971
+ id: import("drizzle-orm/pg-core").PgColumn<{
972
+ name: "id";
973
+ tableName: "webhook_events";
974
+ dataType: "string";
975
+ columnType: "PgText";
976
+ data: string;
977
+ driverParam: string;
978
+ notNull: true;
979
+ hasDefault: false;
980
+ isPrimaryKey: true;
981
+ isAutoincrement: false;
982
+ hasRuntimeDefault: false;
983
+ enumValues: [string, ...string[]];
984
+ baseColumn: never;
985
+ identity: undefined;
986
+ generated: undefined;
987
+ }, {}, {}>;
988
+ type: import("drizzle-orm/pg-core").PgColumn<{
989
+ name: "type";
990
+ tableName: "webhook_events";
991
+ dataType: "string";
992
+ columnType: "PgText";
993
+ data: string;
994
+ driverParam: string;
995
+ notNull: true;
996
+ hasDefault: false;
997
+ isPrimaryKey: false;
998
+ isAutoincrement: false;
999
+ hasRuntimeDefault: false;
1000
+ enumValues: [string, ...string[]];
1001
+ baseColumn: never;
1002
+ identity: undefined;
1003
+ generated: undefined;
1004
+ }, {}, {}>;
1005
+ receivedAt: import("drizzle-orm/pg-core").PgColumn<{
1006
+ name: string;
1007
+ tableName: "webhook_events";
1008
+ dataType: "date";
1009
+ columnType: "PgTimestamp";
1010
+ data: Date;
1011
+ driverParam: string;
1012
+ notNull: true;
1013
+ hasDefault: true;
1014
+ isPrimaryKey: false;
1015
+ isAutoincrement: false;
1016
+ hasRuntimeDefault: false;
1017
+ enumValues: undefined;
1018
+ baseColumn: never;
1019
+ identity: undefined;
1020
+ generated: undefined;
1021
+ }, {}, {}>;
1022
+ };
1023
+ dialect: "pg";
1024
+ }>;
1025
+ /**
1026
+ * Tables that carry another workspace's rows and therefore must be row-level secured.
1027
+ * Deliberately short — see the note at the top of this file for why the rest are operator tables.
1028
+ */
1029
+ export declare const TENANT_TABLES: readonly ["invoices"];
1030
+ //# sourceMappingURL=schema.d.ts.map