@wtfalch/foundry 0.1.0 → 0.3.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 (41) hide show
  1. package/dist/apply.d.ts +14 -0
  2. package/dist/calls-sfu-deploy-support.d.ts +57 -0
  3. package/dist/calls-sfu-deploy-support.js +82 -0
  4. package/dist/calls-sfu.d.ts +175 -0
  5. package/dist/calls-sfu.js +239 -0
  6. package/dist/index.d.ts +11 -6
  7. package/dist/index.js +7 -4
  8. package/dist/migrate.d.ts +38 -0
  9. package/dist/migrate.js +47 -0
  10. package/dist/migrations/0008_hosting.sql +24 -0
  11. package/dist/migrations/0009_hosting_git_branch_build_pack.sql +14 -0
  12. package/dist/migrations/0010_owner.sql +13 -0
  13. package/dist/migrations/0011_test_org.sql +12 -0
  14. package/dist/migrations/0012_audit.sql +21 -0
  15. package/dist/migrations/0013_access_emails.sql +6 -0
  16. package/dist/org.d.ts +130 -0
  17. package/dist/org.js +102 -0
  18. package/dist/plan/diff.d.ts +20 -5
  19. package/dist/plan/diff.js +533 -9
  20. package/dist/plan/executor.d.ts +823 -0
  21. package/dist/plan/executor.js +1242 -0
  22. package/dist/plan/index.d.ts +6 -4
  23. package/dist/plan/index.js +3 -2
  24. package/dist/plan/live.d.ts +8 -4
  25. package/dist/plan/plan-apply.d.ts +114 -4
  26. package/dist/plan/plan-apply.js +266 -14
  27. package/dist/plan/providers-readers.d.ts +102 -14
  28. package/dist/plan/providers-readers.js +245 -16
  29. package/dist/provision.d.ts +56 -0
  30. package/dist/provision.js +69 -0
  31. package/dist/slug.d.ts +12 -18
  32. package/dist/slug.js +66 -0
  33. package/dist/state.d.ts +26 -5
  34. package/dist/store/audit.d.ts +8 -0
  35. package/dist/store/audit.js +43 -0
  36. package/dist/store/postgres.d.ts +3 -1
  37. package/dist/store/postgres.js +84 -2
  38. package/dist/store/schema.d.ts +378 -0
  39. package/dist/store/schema.js +32 -1
  40. package/dist/store.d.ts +12 -0
  41. package/package.json +15 -11
@@ -1,3 +1,5 @@
1
+ import type { IssuerApp } from '../org.js';
2
+ import type { Plan } from '../plan.js';
1
3
  import type { Checkpoint } from '../state.js';
2
4
  /**
3
5
  * Mirrors `migrations/0001_declared_org.sql`, which is the source of truth:
@@ -196,6 +198,146 @@ export declare const declaredOrgs: import("drizzle-orm/pg-core").PgTableWithColu
196
198
  identity: undefined;
197
199
  generated: undefined;
198
200
  }, {}, {}>;
201
+ hostingEnabled: import("drizzle-orm/pg-core").PgColumn<{
202
+ name: "hosting_enabled";
203
+ tableName: "foundry_declared_orgs";
204
+ dataType: "boolean";
205
+ columnType: "PgBoolean";
206
+ data: boolean;
207
+ driverParam: boolean;
208
+ notNull: true;
209
+ hasDefault: true;
210
+ isPrimaryKey: false;
211
+ isAutoincrement: false;
212
+ hasRuntimeDefault: false;
213
+ enumValues: undefined;
214
+ baseColumn: never;
215
+ identity: undefined;
216
+ generated: undefined;
217
+ }, {}, {}>;
218
+ hostingUsesDomain: import("drizzle-orm/pg-core").PgColumn<{
219
+ name: "hosting_uses_domain";
220
+ tableName: "foundry_declared_orgs";
221
+ dataType: "boolean";
222
+ columnType: "PgBoolean";
223
+ data: boolean;
224
+ driverParam: boolean;
225
+ notNull: true;
226
+ hasDefault: true;
227
+ isPrimaryKey: false;
228
+ isAutoincrement: false;
229
+ hasRuntimeDefault: false;
230
+ enumValues: undefined;
231
+ baseColumn: never;
232
+ identity: undefined;
233
+ generated: undefined;
234
+ }, {}, {}>;
235
+ hostingDatabase: import("drizzle-orm/pg-core").PgColumn<{
236
+ name: "hosting_database";
237
+ tableName: "foundry_declared_orgs";
238
+ dataType: "boolean";
239
+ columnType: "PgBoolean";
240
+ data: boolean;
241
+ driverParam: boolean;
242
+ notNull: true;
243
+ hasDefault: true;
244
+ isPrimaryKey: false;
245
+ isAutoincrement: false;
246
+ hasRuntimeDefault: false;
247
+ enumValues: undefined;
248
+ baseColumn: never;
249
+ identity: undefined;
250
+ generated: undefined;
251
+ }, {}, {}>;
252
+ hostingTunnel: import("drizzle-orm/pg-core").PgColumn<{
253
+ name: "hosting_tunnel";
254
+ tableName: "foundry_declared_orgs";
255
+ dataType: "boolean";
256
+ columnType: "PgBoolean";
257
+ data: boolean;
258
+ driverParam: boolean;
259
+ notNull: true;
260
+ hasDefault: true;
261
+ isPrimaryKey: false;
262
+ isAutoincrement: false;
263
+ hasRuntimeDefault: false;
264
+ enumValues: undefined;
265
+ baseColumn: never;
266
+ identity: undefined;
267
+ generated: undefined;
268
+ }, {}, {}>;
269
+ hostingGitBranch: import("drizzle-orm/pg-core").PgColumn<{
270
+ name: "hosting_git_branch";
271
+ tableName: "foundry_declared_orgs";
272
+ dataType: "string";
273
+ columnType: "PgText";
274
+ data: string;
275
+ driverParam: string;
276
+ notNull: true;
277
+ hasDefault: true;
278
+ isPrimaryKey: false;
279
+ isAutoincrement: false;
280
+ hasRuntimeDefault: false;
281
+ enumValues: [string, ...string[]];
282
+ baseColumn: never;
283
+ identity: undefined;
284
+ generated: undefined;
285
+ }, {}, {}>;
286
+ hostingBuildPack: import("drizzle-orm/pg-core").PgColumn<{
287
+ name: "hosting_build_pack";
288
+ tableName: "foundry_declared_orgs";
289
+ dataType: "string";
290
+ columnType: "PgText";
291
+ data: string;
292
+ driverParam: string;
293
+ notNull: true;
294
+ hasDefault: true;
295
+ isPrimaryKey: false;
296
+ isAutoincrement: false;
297
+ hasRuntimeDefault: false;
298
+ enumValues: [string, ...string[]];
299
+ baseColumn: never;
300
+ identity: undefined;
301
+ generated: undefined;
302
+ }, {}, {}>;
303
+ hostingIssuerApps: import("drizzle-orm/pg-core").PgColumn<{
304
+ name: "hosting_issuer_apps";
305
+ tableName: "foundry_declared_orgs";
306
+ dataType: "json";
307
+ columnType: "PgJsonb";
308
+ data: IssuerApp[];
309
+ driverParam: unknown;
310
+ notNull: true;
311
+ hasDefault: true;
312
+ isPrimaryKey: false;
313
+ isAutoincrement: false;
314
+ hasRuntimeDefault: false;
315
+ enumValues: undefined;
316
+ baseColumn: never;
317
+ identity: undefined;
318
+ generated: undefined;
319
+ }, {}, {
320
+ $type: IssuerApp[];
321
+ }>;
322
+ hostingAccessEmails: import("drizzle-orm/pg-core").PgColumn<{
323
+ name: "hosting_access_emails";
324
+ tableName: "foundry_declared_orgs";
325
+ dataType: "json";
326
+ columnType: "PgJsonb";
327
+ data: string[];
328
+ driverParam: unknown;
329
+ notNull: true;
330
+ hasDefault: true;
331
+ isPrimaryKey: false;
332
+ isAutoincrement: false;
333
+ hasRuntimeDefault: false;
334
+ enumValues: undefined;
335
+ baseColumn: never;
336
+ identity: undefined;
337
+ generated: undefined;
338
+ }, {}, {
339
+ $type: string[];
340
+ }>;
199
341
  ssoEnabled: import("drizzle-orm/pg-core").PgColumn<{
200
342
  name: "sso_enabled";
201
343
  tableName: "foundry_declared_orgs";
@@ -451,6 +593,74 @@ export declare const declaredOrgs: import("drizzle-orm/pg-core").PgTableWithColu
451
593
  identity: undefined;
452
594
  generated: undefined;
453
595
  }, {}, {}>;
596
+ ownerEmail: import("drizzle-orm/pg-core").PgColumn<{
597
+ name: "owner_email";
598
+ tableName: "foundry_declared_orgs";
599
+ dataType: "string";
600
+ columnType: "PgText";
601
+ data: string;
602
+ driverParam: string;
603
+ notNull: false;
604
+ hasDefault: false;
605
+ isPrimaryKey: false;
606
+ isAutoincrement: false;
607
+ hasRuntimeDefault: false;
608
+ enumValues: [string, ...string[]];
609
+ baseColumn: never;
610
+ identity: undefined;
611
+ generated: undefined;
612
+ }, {}, {}>;
613
+ ownerGivenName: import("drizzle-orm/pg-core").PgColumn<{
614
+ name: "owner_given_name";
615
+ tableName: "foundry_declared_orgs";
616
+ dataType: "string";
617
+ columnType: "PgText";
618
+ data: string;
619
+ driverParam: string;
620
+ notNull: false;
621
+ hasDefault: false;
622
+ isPrimaryKey: false;
623
+ isAutoincrement: false;
624
+ hasRuntimeDefault: false;
625
+ enumValues: [string, ...string[]];
626
+ baseColumn: never;
627
+ identity: undefined;
628
+ generated: undefined;
629
+ }, {}, {}>;
630
+ ownerFamilyName: import("drizzle-orm/pg-core").PgColumn<{
631
+ name: "owner_family_name";
632
+ tableName: "foundry_declared_orgs";
633
+ dataType: "string";
634
+ columnType: "PgText";
635
+ data: string;
636
+ driverParam: string;
637
+ notNull: false;
638
+ hasDefault: false;
639
+ isPrimaryKey: false;
640
+ isAutoincrement: false;
641
+ hasRuntimeDefault: false;
642
+ enumValues: [string, ...string[]];
643
+ baseColumn: never;
644
+ identity: undefined;
645
+ generated: undefined;
646
+ }, {}, {}>;
647
+ isTest: import("drizzle-orm/pg-core").PgColumn<{
648
+ name: "is_test";
649
+ tableName: "foundry_declared_orgs";
650
+ dataType: "boolean";
651
+ columnType: "PgBoolean";
652
+ data: boolean;
653
+ driverParam: boolean;
654
+ notNull: true;
655
+ hasDefault: true;
656
+ isPrimaryKey: false;
657
+ isAutoincrement: false;
658
+ hasRuntimeDefault: false;
659
+ enumValues: undefined;
660
+ baseColumn: never;
661
+ identity: undefined;
662
+ generated: undefined;
663
+ }, {}, {}>;
454
664
  createdAt: import("drizzle-orm/pg-core").PgColumn<{
455
665
  name: "created_at";
456
666
  tableName: "foundry_declared_orgs";
@@ -609,7 +819,175 @@ export declare const foundryAppliedState: import("drizzle-orm/pg-core").PgTableW
609
819
  };
610
820
  dialect: "pg";
611
821
  }>;
822
+ /** Mirrors `migrations/0012_audit.sql`, the source of truth (#85). */
823
+ export declare const foundryAuditEvents: import("drizzle-orm/pg-core").PgTableWithColumns<{
824
+ name: "foundry_audit_events";
825
+ schema: undefined;
826
+ columns: {
827
+ id: import("drizzle-orm/pg-core").PgColumn<{
828
+ name: "id";
829
+ tableName: "foundry_audit_events";
830
+ dataType: "number";
831
+ columnType: "PgBigSerial53";
832
+ data: number;
833
+ driverParam: number;
834
+ notNull: true;
835
+ hasDefault: true;
836
+ isPrimaryKey: true;
837
+ isAutoincrement: false;
838
+ hasRuntimeDefault: false;
839
+ enumValues: undefined;
840
+ baseColumn: never;
841
+ identity: undefined;
842
+ generated: undefined;
843
+ }, {}, {}>;
844
+ at: import("drizzle-orm/pg-core").PgColumn<{
845
+ name: "at";
846
+ tableName: "foundry_audit_events";
847
+ dataType: "date";
848
+ columnType: "PgTimestamp";
849
+ data: Date;
850
+ driverParam: string;
851
+ notNull: true;
852
+ hasDefault: false;
853
+ isPrimaryKey: false;
854
+ isAutoincrement: false;
855
+ hasRuntimeDefault: false;
856
+ enumValues: undefined;
857
+ baseColumn: never;
858
+ identity: undefined;
859
+ generated: undefined;
860
+ }, {}, {}>;
861
+ kind: import("drizzle-orm/pg-core").PgColumn<{
862
+ name: "kind";
863
+ tableName: "foundry_audit_events";
864
+ dataType: "string";
865
+ columnType: "PgText";
866
+ data: "plan" | "apply" | "destroy";
867
+ driverParam: string;
868
+ notNull: true;
869
+ hasDefault: false;
870
+ isPrimaryKey: false;
871
+ isAutoincrement: false;
872
+ hasRuntimeDefault: false;
873
+ enumValues: [string, ...string[]];
874
+ baseColumn: never;
875
+ identity: undefined;
876
+ generated: undefined;
877
+ }, {}, {
878
+ $type: "plan" | "apply" | "destroy";
879
+ }>;
880
+ actorId: import("drizzle-orm/pg-core").PgColumn<{
881
+ name: "actor_id";
882
+ tableName: "foundry_audit_events";
883
+ dataType: "string";
884
+ columnType: "PgText";
885
+ data: string;
886
+ driverParam: string;
887
+ notNull: true;
888
+ hasDefault: false;
889
+ isPrimaryKey: false;
890
+ isAutoincrement: false;
891
+ hasRuntimeDefault: false;
892
+ enumValues: [string, ...string[]];
893
+ baseColumn: never;
894
+ identity: undefined;
895
+ generated: undefined;
896
+ }, {}, {}>;
897
+ actorDisplay: import("drizzle-orm/pg-core").PgColumn<{
898
+ name: "actor_display";
899
+ tableName: "foundry_audit_events";
900
+ dataType: "string";
901
+ columnType: "PgText";
902
+ data: string;
903
+ driverParam: string;
904
+ notNull: true;
905
+ hasDefault: false;
906
+ isPrimaryKey: false;
907
+ isAutoincrement: false;
908
+ hasRuntimeDefault: false;
909
+ enumValues: [string, ...string[]];
910
+ baseColumn: never;
911
+ identity: undefined;
912
+ generated: undefined;
913
+ }, {}, {}>;
914
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
915
+ name: "org_id";
916
+ tableName: "foundry_audit_events";
917
+ dataType: "string";
918
+ columnType: "PgText";
919
+ data: string;
920
+ driverParam: string;
921
+ notNull: true;
922
+ hasDefault: false;
923
+ isPrimaryKey: false;
924
+ isAutoincrement: false;
925
+ hasRuntimeDefault: false;
926
+ enumValues: [string, ...string[]];
927
+ baseColumn: never;
928
+ identity: undefined;
929
+ generated: undefined;
930
+ }, {}, {}>;
931
+ outcome: import("drizzle-orm/pg-core").PgColumn<{
932
+ name: "outcome";
933
+ tableName: "foundry_audit_events";
934
+ dataType: "string";
935
+ columnType: "PgText";
936
+ data: "applied" | "refused" | "failed" | "destroyed";
937
+ driverParam: string;
938
+ notNull: false;
939
+ hasDefault: false;
940
+ isPrimaryKey: false;
941
+ isAutoincrement: false;
942
+ hasRuntimeDefault: false;
943
+ enumValues: [string, ...string[]];
944
+ baseColumn: never;
945
+ identity: undefined;
946
+ generated: undefined;
947
+ }, {}, {
948
+ $type: "applied" | "refused" | "failed" | "destroyed";
949
+ }>;
950
+ reason: import("drizzle-orm/pg-core").PgColumn<{
951
+ name: "reason";
952
+ tableName: "foundry_audit_events";
953
+ dataType: "string";
954
+ columnType: "PgText";
955
+ data: string;
956
+ driverParam: string;
957
+ notNull: false;
958
+ hasDefault: false;
959
+ isPrimaryKey: false;
960
+ isAutoincrement: false;
961
+ hasRuntimeDefault: false;
962
+ enumValues: [string, ...string[]];
963
+ baseColumn: never;
964
+ identity: undefined;
965
+ generated: undefined;
966
+ }, {}, {}>;
967
+ plan: import("drizzle-orm/pg-core").PgColumn<{
968
+ name: "plan";
969
+ tableName: "foundry_audit_events";
970
+ dataType: "json";
971
+ columnType: "PgJsonb";
972
+ data: Plan;
973
+ driverParam: unknown;
974
+ notNull: false;
975
+ hasDefault: false;
976
+ isPrimaryKey: false;
977
+ isAutoincrement: false;
978
+ hasRuntimeDefault: false;
979
+ enumValues: undefined;
980
+ baseColumn: never;
981
+ identity: undefined;
982
+ generated: undefined;
983
+ }, {}, {
984
+ $type: Plan;
985
+ }>;
986
+ };
987
+ dialect: "pg";
988
+ }>;
612
989
  export type DeclaredOrgRow = typeof declaredOrgs.$inferSelect;
613
990
  export type NewDeclaredOrgRow = typeof declaredOrgs.$inferInsert;
614
991
  export type AppliedStateRow = typeof foundryAppliedState.$inferSelect;
615
992
  export type NewAppliedStateRow = typeof foundryAppliedState.$inferInsert;
993
+ export type AuditEventRow = typeof foundryAuditEvents.$inferSelect;
@@ -1,4 +1,4 @@
1
- import { boolean, jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core';
1
+ import { bigserial, boolean, jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core';
2
2
  /**
3
3
  * Mirrors `migrations/0001_declared_org.sql`, which is the source of truth:
4
4
  * the SQL carries the CHECKs drizzle-kit does not generate here (this
@@ -18,6 +18,15 @@ export const declaredOrgs = pgTable('foundry_declared_orgs', {
18
18
  // SiteConfig (org.ts, T10). A brand new org has no cms site.
19
19
  siteEnabled: boolean('site_enabled').notNull().default(false),
20
20
  siteUsesDomain: boolean('site_uses_domain').notNull().default(false),
21
+ // HostingConfig (org.ts, #71). A brand new org has no hosted app.
22
+ hostingEnabled: boolean('hosting_enabled').notNull().default(false),
23
+ hostingUsesDomain: boolean('hosting_uses_domain').notNull().default(false),
24
+ hostingDatabase: boolean('hosting_database').notNull().default(false),
25
+ hostingTunnel: boolean('hosting_tunnel').notNull().default(false),
26
+ hostingGitBranch: text('hosting_git_branch').notNull().default('main'),
27
+ hostingBuildPack: text('hosting_build_pack').notNull().default('nixpacks'),
28
+ hostingIssuerApps: jsonb('hosting_issuer_apps').notNull().default([]).$type(),
29
+ hostingAccessEmails: jsonb('hosting_access_emails').notNull().default([]).$type(),
21
30
  ssoEnabled: boolean('sso_enabled').notNull().default(false),
22
31
  guestsEnabled: boolean('guests_enabled').notNull().default(false),
23
32
  soloEnabled: boolean('solo_enabled').notNull().default(false),
@@ -40,6 +49,16 @@ export const declaredOrgs = pgTable('foundry_declared_orgs', {
40
49
  vatRegistered: boolean('vat_registered'),
41
50
  bespokeAppRepo: text('bespoke_app_repo'),
42
51
  adoptedAppForm: text('adopted_app_form'),
52
+ // OwnerIdentity (org.ts): the org's owner, invited by ZITADEL email. All
53
+ // three nullable -- a brand new org has none of them, reassembled as one
54
+ // object only once all three are non-null (same shape as BuyerIdentity's
55
+ // own contact fields above).
56
+ ownerEmail: text('owner_email'),
57
+ ownerGivenName: text('owner_given_name'),
58
+ ownerFamilyName: text('owner_family_name'),
59
+ // `test: boolean` (org.ts): only a test org can be destroyed. A brand new
60
+ // org defaults to real (false).
61
+ isTest: boolean('is_test').notNull().default(false),
43
62
  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
44
63
  updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
45
64
  });
@@ -57,3 +76,15 @@ export const foundryAppliedState = pgTable('foundry_applied_state', {
57
76
  lastAppliedAt: timestamp('last_applied_at', { withTimezone: true }),
58
77
  lastAppliedDeclaredOrgVersion: text('last_applied_declared_org_version'),
59
78
  });
79
+ /** Mirrors `migrations/0012_audit.sql`, the source of truth (#85). */
80
+ export const foundryAuditEvents = pgTable('foundry_audit_events', {
81
+ id: bigserial('id', { mode: 'number' }).primaryKey(),
82
+ at: timestamp('at', { withTimezone: true }).notNull(),
83
+ kind: text('kind').notNull().$type(),
84
+ actorId: text('actor_id').notNull(),
85
+ actorDisplay: text('actor_display').notNull(),
86
+ orgId: text('org_id').notNull(),
87
+ outcome: text('outcome').$type(),
88
+ reason: text('reason'),
89
+ plan: jsonb('plan').$type(),
90
+ });
package/dist/store.d.ts CHANGED
@@ -12,6 +12,8 @@ import type { AppliedState } from './state.js';
12
12
  export interface DeclaredOrgStore {
13
13
  create(org: DeclaredOrg): Promise<void>;
14
14
  get(id: OrgId): Promise<DeclaredOrg | null>;
15
+ /** Whether any org already holds this slug. `slugFromName` asks it. */
16
+ slugTaken(slug: string): Promise<boolean>;
15
17
  /**
16
18
  * Combinations foundry knows are impossible are rejected with a reason
17
19
  * (#18 "Done when"), so a caller must be ready for this to throw rather
@@ -20,4 +22,14 @@ export interface DeclaredOrgStore {
20
22
  update(id: OrgId, patch: Partial<DeclaredOrg>): Promise<DeclaredOrg>;
21
23
  getAppliedState(id: OrgId): Promise<AppliedState | null>;
22
24
  putAppliedState(state: AppliedState): Promise<void>;
25
+ /**
26
+ * Removes the declared org and its applied state together. Called only by
27
+ * `FoundryPlanApply.destroy` (`plan/plan-apply.ts`), once every resource it
28
+ * recorded for this org has already been deleted from Coolify, Cloudflare
29
+ * and ZITADEL -- this is the last step, not the first. Idempotent: deleting
30
+ * an id that does not exist (or no longer has applied state) is a no-op,
31
+ * not an error, so a retried destroy that reaches this step twice never
32
+ * throws.
33
+ */
34
+ delete(id: OrgId): Promise<void>;
23
35
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wtfalch/foundry",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Foundry's SDK: the declared org's types, the plan and apply contracts, and the state store's interface.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,9 +9,7 @@
9
9
  },
10
10
  "license": "MIT",
11
11
  "type": "module",
12
- "files": [
13
- "dist"
14
- ],
12
+ "files": ["dist"],
15
13
  "exports": {
16
14
  ".": {
17
15
  "types": "./dist/index.d.ts",
@@ -27,11 +25,22 @@
27
25
  "engines": {
28
26
  "node": ">=22.0.0"
29
27
  },
28
+ "scripts": {
29
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && mkdir -p dist/migrations && find src/migrations -maxdepth 1 -name '*.sql' -exec cp {} dist/migrations/ \\;",
30
+ "typecheck": "tsc --noEmit",
31
+ "test": "vitest run",
32
+ "db:provision": "node scripts/foundry-db-provision.mjs",
33
+ "db:migrate": "node scripts/foundry-db-migrate.mjs",
34
+ "calls-sfu:deploy": "node scripts/calls-sfu-deploy.mjs"
35
+ },
30
36
  "peerDependencies": {
31
37
  "drizzle-orm": ">=0.45.2"
32
38
  },
33
39
  "dependencies": {
34
- "@wtfalch/providers": "0.1.0"
40
+ "@wtfalch/auth": "0.16.0",
41
+ "@wtfalch/email": "0.15.0",
42
+ "@wtfalch/providers": "0.5.0",
43
+ "ssh2": "1.17.0"
35
44
  },
36
45
  "devDependencies": {
37
46
  "@electric-sql/pglite": "^0.5.8",
@@ -40,10 +49,5 @@
40
49
  "postgres": "3.4.9",
41
50
  "typescript": "^5.9.0",
42
51
  "vitest": "^4.1.6"
43
- },
44
- "scripts": {
45
- "build": "rm -rf dist && tsc -p tsconfig.build.json && mkdir -p dist/migrations && find src/migrations -maxdepth 1 -name '*.sql' -exec cp {} dist/migrations/ \\;",
46
- "typecheck": "tsc --noEmit",
47
- "test": "vitest run"
48
52
  }
49
- }
53
+ }