@wtfalch/foundry 0.1.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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/dist/apply.d.ts +27 -0
  3. package/dist/apply.js +1 -0
  4. package/dist/index.d.ts +17 -0
  5. package/dist/index.js +7 -0
  6. package/dist/migrations/0001_declared_org.sql +61 -0
  7. package/dist/migrations/0002_applied_state.sql +43 -0
  8. package/dist/migrations/0003_foundry_runs.sql +53 -0
  9. package/dist/migrations/0004_slug_unique.sql +26 -0
  10. package/dist/migrations/0005_spend_limits.sql +34 -0
  11. package/dist/migrations/0006_buyer_identity.sql +31 -0
  12. package/dist/migrations/0007_site.sql +18 -0
  13. package/dist/org.d.ts +276 -0
  14. package/dist/org.js +29 -0
  15. package/dist/plan/diff.d.ts +52 -0
  16. package/dist/plan/diff.js +302 -0
  17. package/dist/plan/index.d.ts +8 -0
  18. package/dist/plan/index.js +4 -0
  19. package/dist/plan/live.d.ts +62 -0
  20. package/dist/plan/live.js +12 -0
  21. package/dist/plan/plan-apply.d.ts +107 -0
  22. package/dist/plan/plan-apply.js +172 -0
  23. package/dist/plan/providers-readers.d.ts +86 -0
  24. package/dist/plan/providers-readers.js +83 -0
  25. package/dist/plan.d.ts +50 -0
  26. package/dist/plan.js +1 -0
  27. package/dist/runner/db.d.ts +8 -0
  28. package/dist/runner/db.js +1 -0
  29. package/dist/runner/errors.d.ts +37 -0
  30. package/dist/runner/errors.js +57 -0
  31. package/dist/runner/index.d.ts +4 -0
  32. package/dist/runner/index.js +2 -0
  33. package/dist/runner/runner.d.ts +6 -0
  34. package/dist/runner/runner.js +137 -0
  35. package/dist/runner/schema.d.ts +163 -0
  36. package/dist/runner/schema.js +25 -0
  37. package/dist/runner/types.d.ts +97 -0
  38. package/dist/runner/types.js +1 -0
  39. package/dist/slug.d.ts +38 -0
  40. package/dist/slug.js +141 -0
  41. package/dist/state.d.ts +63 -0
  42. package/dist/state.js +1 -0
  43. package/dist/store/postgres.d.ts +43 -0
  44. package/dist/store/postgres.js +267 -0
  45. package/dist/store/schema.d.ts +615 -0
  46. package/dist/store/schema.js +59 -0
  47. package/dist/store.d.ts +23 -0
  48. package/dist/store.js +1 -0
  49. package/package.json +49 -0
@@ -0,0 +1,615 @@
1
+ import type { Checkpoint } from '../state.js';
2
+ /**
3
+ * Mirrors `migrations/0001_declared_org.sql`, which is the source of truth:
4
+ * the SQL carries the CHECKs drizzle-kit does not generate here (this
5
+ * package has no drizzle-kit journal — hand-written migrations only, per
6
+ * app-template's convention). See that file for what each column means.
7
+ */
8
+ export declare const declaredOrgs: import("drizzle-orm/pg-core").PgTableWithColumns<{
9
+ name: "foundry_declared_orgs";
10
+ schema: undefined;
11
+ columns: {
12
+ id: import("drizzle-orm/pg-core").PgColumn<{
13
+ name: "id";
14
+ tableName: "foundry_declared_orgs";
15
+ dataType: "string";
16
+ columnType: "PgText";
17
+ data: string;
18
+ driverParam: string;
19
+ notNull: true;
20
+ hasDefault: false;
21
+ isPrimaryKey: true;
22
+ isAutoincrement: false;
23
+ hasRuntimeDefault: false;
24
+ enumValues: [string, ...string[]];
25
+ baseColumn: never;
26
+ identity: undefined;
27
+ generated: undefined;
28
+ }, {}, {}>;
29
+ slug: import("drizzle-orm/pg-core").PgColumn<{
30
+ name: "slug";
31
+ tableName: "foundry_declared_orgs";
32
+ dataType: "string";
33
+ columnType: "PgText";
34
+ data: string;
35
+ driverParam: string;
36
+ notNull: true;
37
+ hasDefault: false;
38
+ isPrimaryKey: false;
39
+ isAutoincrement: false;
40
+ hasRuntimeDefault: false;
41
+ enumValues: [string, ...string[]];
42
+ baseColumn: never;
43
+ identity: undefined;
44
+ generated: undefined;
45
+ }, {}, {}>;
46
+ displayName: import("drizzle-orm/pg-core").PgColumn<{
47
+ name: "display_name";
48
+ tableName: "foundry_declared_orgs";
49
+ dataType: "string";
50
+ columnType: "PgText";
51
+ data: string;
52
+ driverParam: string;
53
+ notNull: true;
54
+ hasDefault: false;
55
+ isPrimaryKey: false;
56
+ isAutoincrement: false;
57
+ hasRuntimeDefault: false;
58
+ enumValues: [string, ...string[]];
59
+ baseColumn: never;
60
+ identity: undefined;
61
+ generated: undefined;
62
+ }, {}, {}>;
63
+ domain: import("drizzle-orm/pg-core").PgColumn<{
64
+ name: "domain";
65
+ tableName: "foundry_declared_orgs";
66
+ dataType: "string";
67
+ columnType: "PgText";
68
+ data: string;
69
+ driverParam: string;
70
+ notNull: false;
71
+ hasDefault: false;
72
+ isPrimaryKey: false;
73
+ isAutoincrement: false;
74
+ hasRuntimeDefault: false;
75
+ enumValues: [string, ...string[]];
76
+ baseColumn: never;
77
+ identity: undefined;
78
+ generated: undefined;
79
+ }, {}, {}>;
80
+ mailMode: import("drizzle-orm/pg-core").PgColumn<{
81
+ name: "mail_mode";
82
+ tableName: "foundry_declared_orgs";
83
+ dataType: "string";
84
+ columnType: "PgText";
85
+ data: string;
86
+ driverParam: string;
87
+ notNull: true;
88
+ hasDefault: true;
89
+ isPrimaryKey: false;
90
+ isAutoincrement: false;
91
+ hasRuntimeDefault: false;
92
+ enumValues: [string, ...string[]];
93
+ baseColumn: never;
94
+ identity: undefined;
95
+ generated: undefined;
96
+ }, {}, {}>;
97
+ mailUsesDomain: import("drizzle-orm/pg-core").PgColumn<{
98
+ name: "mail_uses_domain";
99
+ tableName: "foundry_declared_orgs";
100
+ dataType: "boolean";
101
+ columnType: "PgBoolean";
102
+ data: boolean;
103
+ driverParam: boolean;
104
+ notNull: true;
105
+ hasDefault: true;
106
+ isPrimaryKey: false;
107
+ isAutoincrement: false;
108
+ hasRuntimeDefault: false;
109
+ enumValues: undefined;
110
+ baseColumn: never;
111
+ identity: undefined;
112
+ generated: undefined;
113
+ }, {}, {}>;
114
+ chatUsesDomain: import("drizzle-orm/pg-core").PgColumn<{
115
+ name: "chat_uses_domain";
116
+ tableName: "foundry_declared_orgs";
117
+ dataType: "boolean";
118
+ columnType: "PgBoolean";
119
+ data: boolean;
120
+ driverParam: boolean;
121
+ notNull: true;
122
+ hasDefault: true;
123
+ isPrimaryKey: false;
124
+ isAutoincrement: false;
125
+ hasRuntimeDefault: false;
126
+ enumValues: undefined;
127
+ baseColumn: never;
128
+ identity: undefined;
129
+ generated: undefined;
130
+ }, {}, {}>;
131
+ callsUsesDomain: import("drizzle-orm/pg-core").PgColumn<{
132
+ name: "calls_uses_domain";
133
+ tableName: "foundry_declared_orgs";
134
+ dataType: "boolean";
135
+ columnType: "PgBoolean";
136
+ data: boolean;
137
+ driverParam: boolean;
138
+ notNull: true;
139
+ hasDefault: true;
140
+ isPrimaryKey: false;
141
+ isAutoincrement: false;
142
+ hasRuntimeDefault: false;
143
+ enumValues: undefined;
144
+ baseColumn: never;
145
+ identity: undefined;
146
+ generated: undefined;
147
+ }, {}, {}>;
148
+ issuerUsesDomain: import("drizzle-orm/pg-core").PgColumn<{
149
+ name: "issuer_uses_domain";
150
+ tableName: "foundry_declared_orgs";
151
+ dataType: "boolean";
152
+ columnType: "PgBoolean";
153
+ data: boolean;
154
+ driverParam: boolean;
155
+ notNull: true;
156
+ hasDefault: true;
157
+ isPrimaryKey: false;
158
+ isAutoincrement: false;
159
+ hasRuntimeDefault: false;
160
+ enumValues: undefined;
161
+ baseColumn: never;
162
+ identity: undefined;
163
+ generated: undefined;
164
+ }, {}, {}>;
165
+ siteEnabled: import("drizzle-orm/pg-core").PgColumn<{
166
+ name: "site_enabled";
167
+ tableName: "foundry_declared_orgs";
168
+ dataType: "boolean";
169
+ columnType: "PgBoolean";
170
+ data: boolean;
171
+ driverParam: boolean;
172
+ notNull: true;
173
+ hasDefault: true;
174
+ isPrimaryKey: false;
175
+ isAutoincrement: false;
176
+ hasRuntimeDefault: false;
177
+ enumValues: undefined;
178
+ baseColumn: never;
179
+ identity: undefined;
180
+ generated: undefined;
181
+ }, {}, {}>;
182
+ siteUsesDomain: import("drizzle-orm/pg-core").PgColumn<{
183
+ name: "site_uses_domain";
184
+ tableName: "foundry_declared_orgs";
185
+ dataType: "boolean";
186
+ columnType: "PgBoolean";
187
+ data: boolean;
188
+ driverParam: boolean;
189
+ notNull: true;
190
+ hasDefault: true;
191
+ isPrimaryKey: false;
192
+ isAutoincrement: false;
193
+ hasRuntimeDefault: false;
194
+ enumValues: undefined;
195
+ baseColumn: never;
196
+ identity: undefined;
197
+ generated: undefined;
198
+ }, {}, {}>;
199
+ ssoEnabled: import("drizzle-orm/pg-core").PgColumn<{
200
+ name: "sso_enabled";
201
+ tableName: "foundry_declared_orgs";
202
+ dataType: "boolean";
203
+ columnType: "PgBoolean";
204
+ data: boolean;
205
+ driverParam: boolean;
206
+ notNull: true;
207
+ hasDefault: true;
208
+ isPrimaryKey: false;
209
+ isAutoincrement: false;
210
+ hasRuntimeDefault: false;
211
+ enumValues: undefined;
212
+ baseColumn: never;
213
+ identity: undefined;
214
+ generated: undefined;
215
+ }, {}, {}>;
216
+ guestsEnabled: import("drizzle-orm/pg-core").PgColumn<{
217
+ name: "guests_enabled";
218
+ tableName: "foundry_declared_orgs";
219
+ dataType: "boolean";
220
+ columnType: "PgBoolean";
221
+ data: boolean;
222
+ driverParam: boolean;
223
+ notNull: true;
224
+ hasDefault: true;
225
+ isPrimaryKey: false;
226
+ isAutoincrement: false;
227
+ hasRuntimeDefault: false;
228
+ enumValues: undefined;
229
+ baseColumn: never;
230
+ identity: undefined;
231
+ generated: undefined;
232
+ }, {}, {}>;
233
+ soloEnabled: import("drizzle-orm/pg-core").PgColumn<{
234
+ name: "solo_enabled";
235
+ tableName: "foundry_declared_orgs";
236
+ dataType: "boolean";
237
+ columnType: "PgBoolean";
238
+ data: boolean;
239
+ driverParam: boolean;
240
+ notNull: true;
241
+ hasDefault: true;
242
+ isPrimaryKey: false;
243
+ isAutoincrement: false;
244
+ hasRuntimeDefault: false;
245
+ enumValues: undefined;
246
+ baseColumn: never;
247
+ identity: undefined;
248
+ generated: undefined;
249
+ }, {}, {}>;
250
+ storageLimitBytes: import("drizzle-orm/pg-core").PgColumn<{
251
+ name: "storage_limit_bytes";
252
+ tableName: "foundry_declared_orgs";
253
+ dataType: "string";
254
+ columnType: "PgText";
255
+ data: string;
256
+ driverParam: string;
257
+ notNull: false;
258
+ hasDefault: false;
259
+ isPrimaryKey: false;
260
+ isAutoincrement: false;
261
+ hasRuntimeDefault: false;
262
+ enumValues: [string, ...string[]];
263
+ baseColumn: never;
264
+ identity: undefined;
265
+ generated: undefined;
266
+ }, {}, {}>;
267
+ storageLimitMicros: import("drizzle-orm/pg-core").PgColumn<{
268
+ name: "storage_limit_micros";
269
+ tableName: "foundry_declared_orgs";
270
+ dataType: "string";
271
+ columnType: "PgText";
272
+ data: string;
273
+ driverParam: string;
274
+ notNull: false;
275
+ hasDefault: false;
276
+ isPrimaryKey: false;
277
+ isAutoincrement: false;
278
+ hasRuntimeDefault: false;
279
+ enumValues: [string, ...string[]];
280
+ baseColumn: never;
281
+ identity: undefined;
282
+ generated: undefined;
283
+ }, {}, {}>;
284
+ aiLimitMicros: import("drizzle-orm/pg-core").PgColumn<{
285
+ name: "ai_limit_micros";
286
+ tableName: "foundry_declared_orgs";
287
+ dataType: "string";
288
+ columnType: "PgText";
289
+ data: string;
290
+ driverParam: string;
291
+ notNull: false;
292
+ hasDefault: false;
293
+ isPrimaryKey: false;
294
+ isAutoincrement: false;
295
+ hasRuntimeDefault: false;
296
+ enumValues: [string, ...string[]];
297
+ baseColumn: never;
298
+ identity: undefined;
299
+ generated: undefined;
300
+ }, {}, {}>;
301
+ legalName: import("drizzle-orm/pg-core").PgColumn<{
302
+ name: "legal_name";
303
+ tableName: "foundry_declared_orgs";
304
+ dataType: "string";
305
+ columnType: "PgText";
306
+ data: string;
307
+ driverParam: string;
308
+ notNull: false;
309
+ hasDefault: false;
310
+ isPrimaryKey: false;
311
+ isAutoincrement: false;
312
+ hasRuntimeDefault: false;
313
+ enumValues: [string, ...string[]];
314
+ baseColumn: never;
315
+ identity: undefined;
316
+ generated: undefined;
317
+ }, {}, {}>;
318
+ orgNumber: import("drizzle-orm/pg-core").PgColumn<{
319
+ name: "org_number";
320
+ tableName: "foundry_declared_orgs";
321
+ dataType: "string";
322
+ columnType: "PgText";
323
+ data: string;
324
+ driverParam: string;
325
+ notNull: false;
326
+ hasDefault: false;
327
+ isPrimaryKey: false;
328
+ isAutoincrement: false;
329
+ hasRuntimeDefault: false;
330
+ enumValues: [string, ...string[]];
331
+ baseColumn: never;
332
+ identity: undefined;
333
+ generated: undefined;
334
+ }, {}, {}>;
335
+ addressStreet: import("drizzle-orm/pg-core").PgColumn<{
336
+ name: "address_street";
337
+ tableName: "foundry_declared_orgs";
338
+ dataType: "string";
339
+ columnType: "PgText";
340
+ data: string;
341
+ driverParam: string;
342
+ notNull: false;
343
+ hasDefault: false;
344
+ isPrimaryKey: false;
345
+ isAutoincrement: false;
346
+ hasRuntimeDefault: false;
347
+ enumValues: [string, ...string[]];
348
+ baseColumn: never;
349
+ identity: undefined;
350
+ generated: undefined;
351
+ }, {}, {}>;
352
+ addressPostalCode: import("drizzle-orm/pg-core").PgColumn<{
353
+ name: "address_postal_code";
354
+ tableName: "foundry_declared_orgs";
355
+ dataType: "string";
356
+ columnType: "PgText";
357
+ data: string;
358
+ driverParam: string;
359
+ notNull: false;
360
+ hasDefault: false;
361
+ isPrimaryKey: false;
362
+ isAutoincrement: false;
363
+ hasRuntimeDefault: false;
364
+ enumValues: [string, ...string[]];
365
+ baseColumn: never;
366
+ identity: undefined;
367
+ generated: undefined;
368
+ }, {}, {}>;
369
+ addressCity: import("drizzle-orm/pg-core").PgColumn<{
370
+ name: "address_city";
371
+ tableName: "foundry_declared_orgs";
372
+ dataType: "string";
373
+ columnType: "PgText";
374
+ data: string;
375
+ driverParam: string;
376
+ notNull: false;
377
+ hasDefault: false;
378
+ isPrimaryKey: false;
379
+ isAutoincrement: false;
380
+ hasRuntimeDefault: false;
381
+ enumValues: [string, ...string[]];
382
+ baseColumn: never;
383
+ identity: undefined;
384
+ generated: undefined;
385
+ }, {}, {}>;
386
+ addressCountry: import("drizzle-orm/pg-core").PgColumn<{
387
+ name: "address_country";
388
+ tableName: "foundry_declared_orgs";
389
+ dataType: "string";
390
+ columnType: "PgText";
391
+ data: string;
392
+ driverParam: string;
393
+ notNull: false;
394
+ hasDefault: false;
395
+ isPrimaryKey: false;
396
+ isAutoincrement: false;
397
+ hasRuntimeDefault: false;
398
+ enumValues: [string, ...string[]];
399
+ baseColumn: never;
400
+ identity: undefined;
401
+ generated: undefined;
402
+ }, {}, {}>;
403
+ vatRegistered: import("drizzle-orm/pg-core").PgColumn<{
404
+ name: "vat_registered";
405
+ tableName: "foundry_declared_orgs";
406
+ dataType: "boolean";
407
+ columnType: "PgBoolean";
408
+ data: boolean;
409
+ driverParam: boolean;
410
+ notNull: false;
411
+ hasDefault: false;
412
+ isPrimaryKey: false;
413
+ isAutoincrement: false;
414
+ hasRuntimeDefault: false;
415
+ enumValues: undefined;
416
+ baseColumn: never;
417
+ identity: undefined;
418
+ generated: undefined;
419
+ }, {}, {}>;
420
+ bespokeAppRepo: import("drizzle-orm/pg-core").PgColumn<{
421
+ name: "bespoke_app_repo";
422
+ tableName: "foundry_declared_orgs";
423
+ dataType: "string";
424
+ columnType: "PgText";
425
+ data: string;
426
+ driverParam: string;
427
+ notNull: false;
428
+ hasDefault: false;
429
+ isPrimaryKey: false;
430
+ isAutoincrement: false;
431
+ hasRuntimeDefault: false;
432
+ enumValues: [string, ...string[]];
433
+ baseColumn: never;
434
+ identity: undefined;
435
+ generated: undefined;
436
+ }, {}, {}>;
437
+ adoptedAppForm: import("drizzle-orm/pg-core").PgColumn<{
438
+ name: "adopted_app_form";
439
+ tableName: "foundry_declared_orgs";
440
+ dataType: "string";
441
+ columnType: "PgText";
442
+ data: string;
443
+ driverParam: string;
444
+ notNull: false;
445
+ hasDefault: false;
446
+ isPrimaryKey: false;
447
+ isAutoincrement: false;
448
+ hasRuntimeDefault: false;
449
+ enumValues: [string, ...string[]];
450
+ baseColumn: never;
451
+ identity: undefined;
452
+ generated: undefined;
453
+ }, {}, {}>;
454
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
455
+ name: "created_at";
456
+ tableName: "foundry_declared_orgs";
457
+ dataType: "date";
458
+ columnType: "PgTimestamp";
459
+ data: Date;
460
+ driverParam: string;
461
+ notNull: true;
462
+ hasDefault: true;
463
+ isPrimaryKey: false;
464
+ isAutoincrement: false;
465
+ hasRuntimeDefault: false;
466
+ enumValues: undefined;
467
+ baseColumn: never;
468
+ identity: undefined;
469
+ generated: undefined;
470
+ }, {}, {}>;
471
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
472
+ name: "updated_at";
473
+ tableName: "foundry_declared_orgs";
474
+ dataType: "date";
475
+ columnType: "PgTimestamp";
476
+ data: Date;
477
+ driverParam: string;
478
+ notNull: true;
479
+ hasDefault: true;
480
+ isPrimaryKey: false;
481
+ isAutoincrement: false;
482
+ hasRuntimeDefault: false;
483
+ enumValues: undefined;
484
+ baseColumn: never;
485
+ identity: undefined;
486
+ generated: undefined;
487
+ }, {}, {}>;
488
+ };
489
+ dialect: "pg";
490
+ }>;
491
+ /**
492
+ * Mirrors `migrations/0002_applied_state.sql`. `serviceIds` and
493
+ * `failedFields` are typed through drizzle's `$type` so a caller reading
494
+ * this table directly (rather than through `DeclaredOrgStore`) still gets
495
+ * `state.ts`'s shapes back rather than bare `unknown` jsonb.
496
+ */
497
+ export declare const foundryAppliedState: import("drizzle-orm/pg-core").PgTableWithColumns<{
498
+ name: "foundry_applied_state";
499
+ schema: undefined;
500
+ columns: {
501
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
502
+ name: "org_id";
503
+ tableName: "foundry_applied_state";
504
+ dataType: "string";
505
+ columnType: "PgText";
506
+ data: string;
507
+ driverParam: string;
508
+ notNull: true;
509
+ hasDefault: false;
510
+ isPrimaryKey: true;
511
+ isAutoincrement: false;
512
+ hasRuntimeDefault: false;
513
+ enumValues: [string, ...string[]];
514
+ baseColumn: never;
515
+ identity: undefined;
516
+ generated: undefined;
517
+ }, {}, {}>;
518
+ serviceIds: import("drizzle-orm/pg-core").PgColumn<{
519
+ name: "service_ids";
520
+ tableName: "foundry_applied_state";
521
+ dataType: "json";
522
+ columnType: "PgJsonb";
523
+ data: Record<string, string>;
524
+ driverParam: unknown;
525
+ notNull: true;
526
+ hasDefault: true;
527
+ isPrimaryKey: false;
528
+ isAutoincrement: false;
529
+ hasRuntimeDefault: false;
530
+ enumValues: undefined;
531
+ baseColumn: never;
532
+ identity: undefined;
533
+ generated: undefined;
534
+ }, {}, {
535
+ $type: Record<string, string>;
536
+ }>;
537
+ checkpoints: import("drizzle-orm/pg-core").PgColumn<{
538
+ name: "checkpoints";
539
+ tableName: "foundry_applied_state";
540
+ dataType: "json";
541
+ columnType: "PgJsonb";
542
+ data: Checkpoint[];
543
+ driverParam: unknown;
544
+ notNull: true;
545
+ hasDefault: true;
546
+ isPrimaryKey: false;
547
+ isAutoincrement: false;
548
+ hasRuntimeDefault: false;
549
+ enumValues: undefined;
550
+ baseColumn: never;
551
+ identity: undefined;
552
+ generated: undefined;
553
+ }, {}, {
554
+ $type: Checkpoint[];
555
+ }>;
556
+ failedFields: import("drizzle-orm/pg-core").PgColumn<{
557
+ name: "failed_fields";
558
+ tableName: "foundry_applied_state";
559
+ dataType: "json";
560
+ columnType: "PgJsonb";
561
+ data: string[];
562
+ driverParam: unknown;
563
+ notNull: true;
564
+ hasDefault: true;
565
+ isPrimaryKey: false;
566
+ isAutoincrement: false;
567
+ hasRuntimeDefault: false;
568
+ enumValues: undefined;
569
+ baseColumn: never;
570
+ identity: undefined;
571
+ generated: undefined;
572
+ }, {}, {
573
+ $type: string[];
574
+ }>;
575
+ lastAppliedAt: import("drizzle-orm/pg-core").PgColumn<{
576
+ name: "last_applied_at";
577
+ tableName: "foundry_applied_state";
578
+ dataType: "date";
579
+ columnType: "PgTimestamp";
580
+ data: Date;
581
+ driverParam: string;
582
+ notNull: false;
583
+ hasDefault: false;
584
+ isPrimaryKey: false;
585
+ isAutoincrement: false;
586
+ hasRuntimeDefault: false;
587
+ enumValues: undefined;
588
+ baseColumn: never;
589
+ identity: undefined;
590
+ generated: undefined;
591
+ }, {}, {}>;
592
+ lastAppliedDeclaredOrgVersion: import("drizzle-orm/pg-core").PgColumn<{
593
+ name: "last_applied_declared_org_version";
594
+ tableName: "foundry_applied_state";
595
+ dataType: "string";
596
+ columnType: "PgText";
597
+ data: string;
598
+ driverParam: string;
599
+ notNull: false;
600
+ hasDefault: false;
601
+ isPrimaryKey: false;
602
+ isAutoincrement: false;
603
+ hasRuntimeDefault: false;
604
+ enumValues: [string, ...string[]];
605
+ baseColumn: never;
606
+ identity: undefined;
607
+ generated: undefined;
608
+ }, {}, {}>;
609
+ };
610
+ dialect: "pg";
611
+ }>;
612
+ export type DeclaredOrgRow = typeof declaredOrgs.$inferSelect;
613
+ export type NewDeclaredOrgRow = typeof declaredOrgs.$inferInsert;
614
+ export type AppliedStateRow = typeof foundryAppliedState.$inferSelect;
615
+ export type NewAppliedStateRow = typeof foundryAppliedState.$inferInsert;
@@ -0,0 +1,59 @@
1
+ import { boolean, jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core';
2
+ /**
3
+ * Mirrors `migrations/0001_declared_org.sql`, which is the source of truth:
4
+ * the SQL carries the CHECKs drizzle-kit does not generate here (this
5
+ * package has no drizzle-kit journal — hand-written migrations only, per
6
+ * app-template's convention). See that file for what each column means.
7
+ */
8
+ export const declaredOrgs = pgTable('foundry_declared_orgs', {
9
+ id: text('id').primaryKey(),
10
+ slug: text('slug').notNull(),
11
+ displayName: text('display_name').notNull(),
12
+ domain: text('domain'),
13
+ mailMode: text('mail_mode').notNull().default('off'),
14
+ mailUsesDomain: boolean('mail_uses_domain').notNull().default(false),
15
+ chatUsesDomain: boolean('chat_uses_domain').notNull().default(false),
16
+ callsUsesDomain: boolean('calls_uses_domain').notNull().default(false),
17
+ issuerUsesDomain: boolean('issuer_uses_domain').notNull().default(false),
18
+ // SiteConfig (org.ts, T10). A brand new org has no cms site.
19
+ siteEnabled: boolean('site_enabled').notNull().default(false),
20
+ siteUsesDomain: boolean('site_uses_domain').notNull().default(false),
21
+ ssoEnabled: boolean('sso_enabled').notNull().default(false),
22
+ guestsEnabled: boolean('guests_enabled').notNull().default(false),
23
+ soloEnabled: boolean('solo_enabled').notNull().default(false),
24
+ // StorageConfig / AiConfig (org.ts, #27). Bigint-safe decimal strings of
25
+ // non-negative integers, stored as text like every other declared-org
26
+ // string field -- never numeric, since a limit can exceed what a JS
27
+ // `number` safely holds. null means uncapped.
28
+ storageLimitBytes: text('storage_limit_bytes'),
29
+ storageLimitMicros: text('storage_limit_micros'),
30
+ aiLimitMicros: text('ai_limit_micros'),
31
+ // BuyerIdentity (org.ts, #67). The customer's own identity for invoices,
32
+ // shaped like @wtfalch/invoicing's Party. All seven nullable -- a brand
33
+ // new org has none of them.
34
+ legalName: text('legal_name'),
35
+ orgNumber: text('org_number'),
36
+ addressStreet: text('address_street'),
37
+ addressPostalCode: text('address_postal_code'),
38
+ addressCity: text('address_city'),
39
+ addressCountry: text('address_country'),
40
+ vatRegistered: boolean('vat_registered'),
41
+ bespokeAppRepo: text('bespoke_app_repo'),
42
+ adoptedAppForm: text('adopted_app_form'),
43
+ createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
44
+ updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
45
+ });
46
+ /**
47
+ * Mirrors `migrations/0002_applied_state.sql`. `serviceIds` and
48
+ * `failedFields` are typed through drizzle's `$type` so a caller reading
49
+ * this table directly (rather than through `DeclaredOrgStore`) still gets
50
+ * `state.ts`'s shapes back rather than bare `unknown` jsonb.
51
+ */
52
+ export const foundryAppliedState = pgTable('foundry_applied_state', {
53
+ orgId: text('org_id').primaryKey(),
54
+ serviceIds: jsonb('service_ids').notNull().default({}).$type(),
55
+ checkpoints: jsonb('checkpoints').notNull().default([]).$type(),
56
+ failedFields: jsonb('failed_fields').notNull().default([]).$type(),
57
+ lastAppliedAt: timestamp('last_applied_at', { withTimezone: true }),
58
+ lastAppliedDeclaredOrgVersion: text('last_applied_declared_org_version'),
59
+ });
@@ -0,0 +1,23 @@
1
+ import type { DeclaredOrg, OrgId } from './org.js';
2
+ import type { AppliedState } from './state.js';
3
+ /**
4
+ * The persistence seam https://github.com/wtfalch/foundry/issues/18
5
+ * implements: create, read and edit a {@link DeclaredOrg}, and read and
6
+ * write the {@link AppliedState} next to it.
7
+ *
8
+ * Decided in #10 (resolved): both live in foundry's own database with the
9
+ * operator page as the only editor — never git, unlike app-template's
10
+ * bootstrap state.
11
+ */
12
+ export interface DeclaredOrgStore {
13
+ create(org: DeclaredOrg): Promise<void>;
14
+ get(id: OrgId): Promise<DeclaredOrg | null>;
15
+ /**
16
+ * Combinations foundry knows are impossible are rejected with a reason
17
+ * (#18 "Done when"), so a caller must be ready for this to throw rather
18
+ * than silently drop a field.
19
+ */
20
+ update(id: OrgId, patch: Partial<DeclaredOrg>): Promise<DeclaredOrg>;
21
+ getAppliedState(id: OrgId): Promise<AppliedState | null>;
22
+ putAppliedState(state: AppliedState): Promise<void>;
23
+ }
package/dist/store.js ADDED
@@ -0,0 +1 @@
1
+ export {};