bunderstack 0.23.4 → 0.24.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 (137) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +6 -4
  3. package/dist/api/builder.d.ts +13 -11
  4. package/dist/api/builder.d.ts.map +1 -1
  5. package/dist/api/builder.js.map +1 -1
  6. package/dist/api/context.d.ts +6 -6
  7. package/dist/api/context.d.ts.map +1 -1
  8. package/dist/api/context.js +1 -1
  9. package/dist/api/context.js.map +1 -1
  10. package/dist/api/crud-router.d.ts +6 -6
  11. package/dist/api/realtime-router.d.ts +1 -1
  12. package/dist/api/storage-router.d.ts +5 -5
  13. package/dist/backend-internals.d.ts +5 -13
  14. package/dist/backend-internals.d.ts.map +1 -1
  15. package/dist/backend-internals.js.map +1 -1
  16. package/dist/backend.d.ts +39 -5
  17. package/dist/backend.d.ts.map +1 -1
  18. package/dist/backend.js +37 -46
  19. package/dist/backend.js.map +1 -1
  20. package/dist/blueprint-generator.d.ts +1 -0
  21. package/dist/blueprint-generator.d.ts.map +1 -1
  22. package/dist/blueprint-generator.js +29 -1
  23. package/dist/blueprint-generator.js.map +1 -1
  24. package/dist/blueprint.d.ts +2 -1
  25. package/dist/blueprint.d.ts.map +1 -1
  26. package/dist/blueprint.js +9 -2
  27. package/dist/blueprint.js.map +1 -1
  28. package/dist/cli.d.ts.map +1 -1
  29. package/dist/cli.js +14 -2
  30. package/dist/cli.js.map +1 -1
  31. package/dist/config.d.ts +13 -19
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +1 -1
  34. package/dist/config.js.map +1 -1
  35. package/dist/email/smtp.d.ts +7 -1
  36. package/dist/email/smtp.d.ts.map +1 -1
  37. package/dist/email/smtp.js +5 -1
  38. package/dist/email/smtp.js.map +1 -1
  39. package/dist/email.d.ts +3 -29
  40. package/dist/email.d.ts.map +1 -1
  41. package/dist/email.js +1 -194
  42. package/dist/email.js.map +1 -1
  43. package/dist/env-probe.d.ts +9 -0
  44. package/dist/env-probe.d.ts.map +1 -0
  45. package/dist/env-probe.js +73 -0
  46. package/dist/env-probe.js.map +1 -0
  47. package/dist/env.d.ts +2 -5
  48. package/dist/env.d.ts.map +1 -1
  49. package/dist/env.js +2 -9
  50. package/dist/env.js.map +1 -1
  51. package/dist/hosted-contract.d.ts +11 -0
  52. package/dist/hosted-contract.d.ts.map +1 -0
  53. package/dist/hosted-contract.js +46 -0
  54. package/dist/hosted-contract.js.map +1 -0
  55. package/dist/index.d.ts +3 -2
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/inspect.d.ts +15 -0
  60. package/dist/inspect.d.ts.map +1 -0
  61. package/dist/inspect.js +43 -0
  62. package/dist/inspect.js.map +1 -0
  63. package/dist/internal-tables-pg.d.ts +43 -94
  64. package/dist/internal-tables-pg.d.ts.map +1 -1
  65. package/dist/internal-tables-pg.js +14 -17
  66. package/dist/internal-tables-pg.js.map +1 -1
  67. package/dist/internal-tables.d.ts +213 -488
  68. package/dist/internal-tables.d.ts.map +1 -1
  69. package/dist/internal-tables.js +33 -33
  70. package/dist/internal-tables.js.map +1 -1
  71. package/dist/jobs/define.d.ts +20 -20
  72. package/dist/jobs/define.d.ts.map +1 -1
  73. package/dist/jobs/define.js.map +1 -1
  74. package/dist/manifest-diff.d.ts +6 -0
  75. package/dist/manifest-diff.d.ts.map +1 -0
  76. package/dist/manifest-diff.js +42 -0
  77. package/dist/manifest-diff.js.map +1 -0
  78. package/dist/manifest.d.ts +10 -2
  79. package/dist/manifest.d.ts.map +1 -1
  80. package/dist/manifest.js +27 -29
  81. package/dist/manifest.js.map +1 -1
  82. package/dist/messaging/email.d.ts +16 -0
  83. package/dist/messaging/email.d.ts.map +1 -0
  84. package/dist/messaging/email.js +8 -0
  85. package/dist/messaging/email.js.map +1 -0
  86. package/dist/messaging/index.d.ts +8 -0
  87. package/dist/messaging/index.d.ts.map +1 -0
  88. package/dist/messaging/index.js +4 -0
  89. package/dist/messaging/index.js.map +1 -0
  90. package/dist/messaging/journal.d.ts +4 -0
  91. package/dist/messaging/journal.d.ts.map +1 -0
  92. package/dist/messaging/journal.js +19 -0
  93. package/dist/messaging/journal.js.map +1 -0
  94. package/dist/messaging/runtime.d.ts +16 -0
  95. package/dist/messaging/runtime.d.ts.map +1 -0
  96. package/dist/messaging/runtime.js +213 -0
  97. package/dist/messaging/runtime.js.map +1 -0
  98. package/dist/messaging/standalone.d.ts +27 -0
  99. package/dist/messaging/standalone.d.ts.map +1 -0
  100. package/dist/messaging/standalone.js +18 -0
  101. package/dist/messaging/standalone.js.map +1 -0
  102. package/dist/messaging/telegram.d.ts +16 -0
  103. package/dist/messaging/telegram.d.ts.map +1 -0
  104. package/dist/messaging/telegram.js +5 -0
  105. package/dist/messaging/telegram.js.map +1 -0
  106. package/dist/messaging/types.d.ts +22 -0
  107. package/dist/messaging/types.d.ts.map +1 -0
  108. package/dist/messaging/types.js +17 -0
  109. package/dist/messaging/types.js.map +1 -0
  110. package/dist/runtime.d.ts +11 -10
  111. package/dist/runtime.d.ts.map +1 -1
  112. package/dist/runtime.js +19 -31
  113. package/dist/runtime.js.map +1 -1
  114. package/dist/schema-export-pg.d.ts +1 -1
  115. package/dist/schema-export-pg.d.ts.map +1 -1
  116. package/dist/schema-export-pg.js +1 -1
  117. package/dist/schema-export-pg.js.map +1 -1
  118. package/dist/schema-export.d.ts +1 -1
  119. package/dist/schema-export.d.ts.map +1 -1
  120. package/dist/schema-export.js +1 -1
  121. package/dist/schema-export.js.map +1 -1
  122. package/dist/testing/fixture.d.ts +2 -2
  123. package/dist/testing/fixture.d.ts.map +1 -1
  124. package/dist/testing/fixture.js +11 -9
  125. package/dist/testing/fixture.js.map +1 -1
  126. package/dist/testing/messaging.d.ts +21 -0
  127. package/dist/testing/messaging.d.ts.map +1 -0
  128. package/dist/testing/messaging.js +34 -0
  129. package/dist/testing/messaging.js.map +1 -0
  130. package/dist/testing.d.ts +1 -0
  131. package/dist/testing.d.ts.map +1 -1
  132. package/dist/testing.js.map +1 -1
  133. package/package.json +6 -2
  134. package/skills/creating-bunderstack-apps/references/application-structure.md +16 -7
  135. package/skills/migrating-to-bunderstack/SKILL.md +72 -50
  136. package/skills/migrating-to-bunderstack/references/audit-checklist.md +2 -2
  137. package/skills/migrating-to-bunderstack/references/runtime-replacements.md +16 -12
@@ -0,0 +1,18 @@
1
+ import { createMessaging as materialize } from './runtime.js';
2
+ /**
3
+ * Builds channel facades outside a started app, for code that runs before or
4
+ * beside it — a Better Auth builder sending an invitation, a script, a
5
+ * one-off worker. Channels behave exactly as they do on `app.messaging`,
6
+ * capture included.
7
+ *
8
+ * ```ts
9
+ * export const auth = defineAuth(schema, ({ db, env }) => {
10
+ * const messaging = createMessaging({ email: resend({ from: env.EMAIL_FROM }) }, { env, db })
11
+ * return { …, sendInvitation: (to) => messaging.email.send({ to, … }) }
12
+ * })
13
+ * ```
14
+ */
15
+ export function createMessaging(channels, context) {
16
+ return materialize(channels, { env: context.env, db: context.db });
17
+ }
18
+ //# sourceMappingURL=standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../src/messaging/standalone.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,IAAI,WAAW,EAAE,MAAM,WAAW,CAAA;AAY1D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAiB,EACjB,OAAyB;IAEzB,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;AACpE,CAAC","sourcesContent":["import type { AnyDb } from '../dialect'\nimport type { BaseEnv } from '../env'\nimport type { MessagingConfig, MessagingFacades } from './types'\n\nimport { createMessaging as materialize } from './runtime'\n\n/**\n * What a standalone messaging facade needs. `db` is the application's own\n * connection: pass it so captured and sent messages reach the same journal the\n * app writes, and omit it only when there is no database to write to.\n */\nexport type MessagingContext = {\n env: BaseEnv\n db?: AnyDb\n}\n\n/**\n * Builds channel facades outside a started app, for code that runs before or\n * beside it — a Better Auth builder sending an invitation, a script, a\n * one-off worker. Channels behave exactly as they do on `app.messaging`,\n * capture included.\n *\n * ```ts\n * export const auth = defineAuth(schema, ({ db, env }) => {\n * const messaging = createMessaging({ email: resend({ from: env.EMAIL_FROM }) }, { env, db })\n * return { …, sendInvitation: (to) => messaging.email.send({ to, … }) }\n * })\n * ```\n */\nexport function createMessaging<const TConfig extends MessagingConfig>(\n channels: TConfig,\n context: MessagingContext,\n): MessagingFacades<TConfig> {\n return materialize(channels, { env: context.env, db: context.db })\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { type MessagingDescriptor } from './types.js';
2
+ export type TelegramMessage = {
3
+ to: string | number;
4
+ text: string;
5
+ parseMode?: 'HTML' | 'MarkdownV2';
6
+ };
7
+ export type SentTelegramMessage = {
8
+ id?: string;
9
+ providerId?: string;
10
+ };
11
+ export type TelegramConfig = {
12
+ botToken?: string;
13
+ };
14
+ export type TelegramDescriptor = MessagingDescriptor<'telegram', 'telegram', TelegramMessage, SentTelegramMessage, TelegramConfig>;
15
+ export declare function telegram(config?: TelegramConfig): TelegramDescriptor;
16
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/messaging/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAE9D,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAElD,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,CAClD,UAAU,EACV,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,cAAc,CACf,CAAA;AAED,wBAAgB,QAAQ,CAAC,MAAM,GAAE,cAAmB,GAAG,kBAAkB,CAExE"}
@@ -0,0 +1,5 @@
1
+ import { descriptor } from './types.js';
2
+ export function telegram(config = {}) {
3
+ return descriptor('telegram', 'telegram', config);
4
+ }
5
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/messaging/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,MAAM,SAAS,CAAA;AAuB9D,MAAM,UAAU,QAAQ,CAAC,SAAyB,EAAE;IAClD,OAAO,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;AACnD,CAAC","sourcesContent":["import { descriptor, type MessagingDescriptor } from './types'\n\nexport type TelegramMessage = {\n to: string | number\n text: string\n parseMode?: 'HTML' | 'MarkdownV2'\n}\n\nexport type SentTelegramMessage = {\n id?: string\n providerId?: string\n}\n\nexport type TelegramConfig = { botToken?: string }\n\nexport type TelegramDescriptor = MessagingDescriptor<\n 'telegram',\n 'telegram',\n TelegramMessage,\n SentTelegramMessage,\n TelegramConfig\n>\n\nexport function telegram(config: TelegramConfig = {}): TelegramDescriptor {\n return descriptor('telegram', 'telegram', config)\n}\n"]}
@@ -0,0 +1,22 @@
1
+ export declare const MESSAGING_DESCRIPTOR: unique symbol;
2
+ export type MessagingDescriptor<TKind extends string, TProvider extends string, TInput, TResult, TConfig = unknown> = {
3
+ readonly kind: TKind;
4
+ readonly provider: TProvider;
5
+ readonly config: Readonly<TConfig>;
6
+ readonly [MESSAGING_DESCRIPTOR]: {
7
+ readonly input: TInput;
8
+ readonly result: TResult;
9
+ };
10
+ };
11
+ export type AnyMessagingDescriptor = MessagingDescriptor<string, string, any, any, any>;
12
+ export type MessagingConfig = Record<string, AnyMessagingDescriptor>;
13
+ export type MessagingFacade<TDescriptor extends AnyMessagingDescriptor> = {
14
+ send(input: TDescriptor[typeof MESSAGING_DESCRIPTOR]['input']): Promise<TDescriptor[typeof MESSAGING_DESCRIPTOR]['result']>;
15
+ };
16
+ export type MessagingFacades<TConfig extends MessagingConfig> = {
17
+ readonly [K in keyof TConfig]: MessagingFacade<TConfig[K]>;
18
+ };
19
+ export type MessagingFacadesFor<TConfig extends MessagingConfig | undefined> = TConfig extends MessagingConfig ? MessagingFacades<TConfig> : Record<never, never>;
20
+ export declare function descriptor<TKind extends string, TProvider extends string, TInput, TResult, TConfig>(kind: TKind, provider: TProvider, config: TConfig): MessagingDescriptor<TKind, TProvider, TInput, TResult, TConfig>;
21
+ export declare function isMessagingDescriptor(value: unknown): value is AnyMessagingDescriptor;
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/messaging/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,EAAE,OAAO,MAEzC,CAAA;AAED,MAAM,MAAM,mBAAmB,CAC7B,KAAK,SAAS,MAAM,EACpB,SAAS,SAAS,MAAM,EACxB,MAAM,EACN,OAAO,EACP,OAAO,GAAG,OAAO,IACf;IACF,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAClC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE;QAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;KACzB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,mBAAmB,CACtD,MAAM,EACN,MAAM,EACN,GAAG,EACH,GAAG,EACH,GAAG,CACJ,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;AAEpE,MAAM,MAAM,eAAe,CAAC,WAAW,SAAS,sBAAsB,IAAI;IACxE,IAAI,CACF,KAAK,EAAE,WAAW,CAAC,OAAO,oBAAoB,CAAC,CAAC,OAAO,CAAC,GACvD,OAAO,CAAC,WAAW,CAAC,OAAO,oBAAoB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;CAC/D,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,OAAO,SAAS,eAAe,IAAI;IAC9D,QAAQ,EAAE,CAAC,IAAI,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAC3D,CAAA;AAED,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,eAAe,GAAG,SAAS,IACzE,OAAO,SAAS,eAAe,GAC3B,gBAAgB,CAAC,OAAO,CAAC,GACzB,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAE1B,wBAAgB,UAAU,CACxB,KAAK,SAAS,MAAM,EACpB,SAAS,SAAS,MAAM,EACxB,MAAM,EACN,OAAO,EACP,OAAO,EAEP,IAAI,EAAE,KAAK,EACX,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAE,OAAO,GACd,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAOjE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,sBAAsB,CAQjC"}
@@ -0,0 +1,17 @@
1
+ export const MESSAGING_DESCRIPTOR = Symbol.for('bunderstack.messaging-descriptor');
2
+ export function descriptor(kind, provider, config) {
3
+ return Object.freeze({
4
+ kind,
5
+ provider,
6
+ config: Object.freeze({ ...config }),
7
+ [MESSAGING_DESCRIPTOR]: undefined,
8
+ });
9
+ }
10
+ export function isMessagingDescriptor(value) {
11
+ return (typeof value === 'object' &&
12
+ value !== null &&
13
+ MESSAGING_DESCRIPTOR in value &&
14
+ typeof value.kind === 'string' &&
15
+ typeof value.provider === 'string');
16
+ }
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/messaging/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAkB,MAAM,CAAC,GAAG,CAC3D,kCAAkC,CACnC,CAAA;AA2CD,MAAM,UAAU,UAAU,CAOxB,IAAW,EACX,QAAmB,EACnB,MAAe;IAEf,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI;QACJ,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;QACpC,CAAC,oBAAoB,CAAC,EAAE,SAAkB;KAC3C,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,oBAAoB,IAAI,KAAK;QAC7B,OAAQ,KAAgC,CAAC,IAAI,KAAK,QAAQ;QAC1D,OAAQ,KAAgC,CAAC,QAAQ,KAAK,QAAQ,CAC/D,CAAA;AACH,CAAC","sourcesContent":["export const MESSAGING_DESCRIPTOR: unique symbol = Symbol.for(\n 'bunderstack.messaging-descriptor',\n)\n\nexport type MessagingDescriptor<\n TKind extends string,\n TProvider extends string,\n TInput,\n TResult,\n TConfig = unknown,\n> = {\n readonly kind: TKind\n readonly provider: TProvider\n readonly config: Readonly<TConfig>\n readonly [MESSAGING_DESCRIPTOR]: {\n readonly input: TInput\n readonly result: TResult\n }\n}\n\nexport type AnyMessagingDescriptor = MessagingDescriptor<\n string,\n string,\n any,\n any,\n any\n>\n\nexport type MessagingConfig = Record<string, AnyMessagingDescriptor>\n\nexport type MessagingFacade<TDescriptor extends AnyMessagingDescriptor> = {\n send(\n input: TDescriptor[typeof MESSAGING_DESCRIPTOR]['input'],\n ): Promise<TDescriptor[typeof MESSAGING_DESCRIPTOR]['result']>\n}\n\nexport type MessagingFacades<TConfig extends MessagingConfig> = {\n readonly [K in keyof TConfig]: MessagingFacade<TConfig[K]>\n}\n\nexport type MessagingFacadesFor<TConfig extends MessagingConfig | undefined> =\n TConfig extends MessagingConfig\n ? MessagingFacades<TConfig>\n : Record<never, never>\n\nexport function descriptor<\n TKind extends string,\n TProvider extends string,\n TInput,\n TResult,\n TConfig,\n>(\n kind: TKind,\n provider: TProvider,\n config: TConfig,\n): MessagingDescriptor<TKind, TProvider, TInput, TResult, TConfig> {\n return Object.freeze({\n kind,\n provider,\n config: Object.freeze({ ...config }),\n [MESSAGING_DESCRIPTOR]: undefined as never,\n })\n}\n\nexport function isMessagingDescriptor(\n value: unknown,\n): value is AnyMessagingDescriptor {\n return (\n typeof value === 'object' &&\n value !== null &&\n MESSAGING_DESCRIPTOR in value &&\n typeof (value as AnyMessagingDescriptor).kind === 'string' &&\n typeof (value as AnyMessagingDescriptor).provider === 'string'\n )\n}\n"]}
package/dist/runtime.d.ts CHANGED
@@ -7,11 +7,12 @@ import type { RuntimeTestingHandle } from './backend-internals.js';
7
7
  import type { DatabaseConnection } from './database/adapter.js';
8
8
  import type { DbFor } from './db.js';
9
9
  import type { BunderstackJobsBuilder, JobsDefs, JobsFacade, StartWorkerOptions, WorkerHandle } from './jobs/index.js';
10
+ import type { MessagingConfig, MessagingFacadesFor } from './messaging/index.js';
11
+ import type { MessagingAdapter } from './messaging/runtime.js';
10
12
  import type { ResolvedStorageBuckets, StorageConfigInput } from './storage/buckets.js';
11
13
  import type { StorageAdapter } from './storage/index.js';
12
14
  import { createAuth } from './auth.js';
13
15
  import { type BunderstackConfig } from './config.js';
14
- import { type EmailAdapter, type EmailFacade } from './email.js';
15
16
  import { type EnvConfigInput, type ValidatedEnv } from './env.js';
16
17
  import { type LifecycleStatus } from './lifecycle.js';
17
18
  import { type BunderstackLogger } from './logging.js';
@@ -20,7 +21,7 @@ export type AuthInstance = ReturnType<typeof createAuth>;
20
21
  export type RuntimeOverrides = {
21
22
  database?: DatabaseConnection;
22
23
  resolvedStorage?: ResolvedStorageBuckets;
23
- emailAdapter?: EmailAdapter;
24
+ messagingAdapters?: Record<string, MessagingAdapter>;
24
25
  forceMemoryRealtime?: boolean;
25
26
  backgroundAutoStart?: false;
26
27
  authResolver?: AuthSessionResolver;
@@ -76,15 +77,15 @@ export type AppRunWorkerOptions = AppStartWorkerOptions & {
76
77
  export type BucketNamesOf<TStorage> = TStorage extends {
77
78
  buckets: infer B extends Record<string, unknown>;
78
79
  } ? keyof B & string : string;
79
- export type BunderstackApp<TSchema extends Record<string, unknown>, TAccess extends Record<string, TableAccessInput> | undefined = undefined, TBuckets extends string = string, TEnv extends EnvConfigInput | undefined = undefined, TJobsDefs extends JobsDefs | undefined = undefined, TCustomApiRouter extends AnyORPCRouter | undefined = undefined, TRealtime = undefined> = {
80
+ export type BunderstackApp<TSchema extends Record<string, unknown>, TAccess extends Record<string, TableAccessInput> | undefined = undefined, TBuckets extends string = string, TEnv extends EnvConfigInput | undefined = undefined, TJobsDefs extends JobsDefs | undefined = undefined, TCustomApiRouter extends AnyORPCRouter | undefined = undefined, TRealtime = undefined, TMessaging extends MessagingConfig | undefined = undefined> = {
80
81
  handler: (req: Request) => Promise<Response>;
81
82
  db: DbFor<TSchema>;
82
83
  auth: AuthInstance;
83
84
  storage: StorageFacade;
84
85
  /** Validated env: bunderstack's base vars plus the config's `env` extension. */
85
86
  env: ValidatedEnv<TEnv>;
86
- /** Email facade; always present — send() throws when email isn't configured. */
87
- email: EmailFacade;
87
+ /** Named, provider-specific outbound messaging channels. */
88
+ messaging: MessagingFacadesFor<TMessaging>;
88
89
  /** Job queue facade; always present — enqueue throws when jobs aren't configured. */
89
90
  jobs: JobsFacade<TJobsDefs extends JobsDefs ? TJobsDefs : Record<never, never>>;
90
91
  /** Typed custom row publication; enabled=false/no-op when realtime is off. */
@@ -112,10 +113,11 @@ export type BunderstackApp<TSchema extends Record<string, unknown>, TAccess exte
112
113
  ] extends [false | undefined] ? {} : RealtimeApiRouter>;
113
114
  };
114
115
  };
115
- export declare function materializeBunderstack<TSchema extends Record<string, unknown>, const TAccess extends Record<string, TableAccessInput> | undefined = undefined, const TStorage extends StorageConfigInput | undefined = undefined, const TEnv extends EnvConfigInput | undefined = undefined, const TJobsDefs extends JobsDefs | undefined = undefined, TCustomApiRouter extends AnyORPCRouter | undefined = undefined, const TRealtime extends BunderstackConfig<TSchema, TAccess, TStorage, TEnv, TCustomApiRouter>['realtime'] = undefined>(options: BunderstackConfig<TSchema, TAccess, TStorage, TEnv, TCustomApiRouter> & {
116
+ export declare function materializeBunderstack<TSchema extends Record<string, unknown>, const TAccess extends Record<string, TableAccessInput> | undefined = undefined, const TStorage extends StorageConfigInput | undefined = undefined, const TEnv extends EnvConfigInput | undefined = undefined, const TJobsDefs extends JobsDefs | undefined = undefined, TCustomApiRouter extends AnyORPCRouter | undefined = undefined, const TRealtime extends BunderstackConfig<TSchema, TAccess, TStorage, TEnv, TCustomApiRouter>['realtime'] = undefined, const TMessaging extends MessagingConfig | undefined = undefined>(options: BunderstackConfig<TSchema, TAccess, TStorage, TEnv, TCustomApiRouter> & {
116
117
  realtime?: TRealtime;
117
- jobs?: TJobsDefs | ((j: BunderstackJobsBuilder<TSchema, ValidatedEnv<TEnv>>) => TJobsDefs);
118
- }, source: Record<string, string | undefined>, overrides?: RuntimeOverrides): Promise<BunderstackApp<TSchema, TAccess, BucketNamesOf<TStorage>, TEnv, TJobsDefs, TCustomApiRouter, TRealtime>>;
118
+ messaging?: TMessaging;
119
+ jobs?: TJobsDefs | ((j: BunderstackJobsBuilder<TSchema, ValidatedEnv<TEnv>, TMessaging>) => TJobsDefs);
120
+ }, source: Record<string, string | undefined>, overrides?: RuntimeOverrides, env?: ValidatedEnv<TEnv>): Promise<BunderstackApp<TSchema, TAccess, BucketNamesOf<TStorage>, TEnv, TJobsDefs, TCustomApiRouter, TRealtime, TMessaging>>;
119
121
  export { listSpec } from './api/list-spec.js';
120
122
  export type { ListSpecOptions } from './api/list-spec.js';
121
123
  export type { BunderstackDb, BunderstackTx } from './db.js';
@@ -128,8 +130,7 @@ export { validateEnv, createClientEnv, BunderstackEnvError } from './env.js';
128
130
  export type { EnvConfigInput, BaseEnv, ValidatedEnv } from './env.js';
129
131
  export { buildManifest, parseManifest } from './manifest.js';
130
132
  export type { BunderstackManifest, ManifestEnvVar } from './manifest.js';
131
- export { createEmail } from './email.js';
132
- export type { EmailMessage, EmailAdapter, EmailConfigInput, EmailFacade, } from './email.js';
133
+ export type { EmailMessage, EmailAdapter } from './email.js';
133
134
  export { createJobsBuilder } from './jobs/index.js';
134
135
  export type { BunderstackJobContext, BunderstackJobsBuilder, BackgroundDefinition, BackgroundDefs, CronDefinition, CronInvocation, EnqueueOptions, JobContext, JobDefinition, JobsDefs, JobsFacade, JobsRuntimeFacade, QueueJobDefinition, QueueJobKeys, RunWorkerOptions, StartWorkerOptions, WorkerHandle, } from './jobs/index.js';
135
136
  export { defineAccess, validateAndResolveAccess, checkAccess, AUTH_TABLE_NAMES, } from './access.js';
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
package/dist/runtime.js CHANGED
@@ -5,7 +5,6 @@ import { OpenAPIHandler } from '@orpc/openapi/fetch';
5
5
  import { RPCHandler } from '@orpc/server/fetch';
6
6
  import { ValibotToJsonSchemaConverter } from '@orpc/valibot';
7
7
  import { validateAndResolveAccess } from './access.js';
8
- import { createApiBuilder } from './api/builder.js';
9
8
  import { createApiContext } from './api/context.js';
10
9
  import { buildCrudApiRouter } from './api/crud-router.js';
11
10
  import { mergeOpenAPISpecs } from './api/openapi.js';
@@ -18,13 +17,13 @@ import { resolveConfig } from './config.js';
18
17
  import { resolveAuthConfig, resolveRealtimeRedisUrl } from './config.js';
19
18
  import { createDb } from './db.js';
20
19
  import { detectDialect } from './dialect.js';
21
- import { createEmail, emailProviderTag, } from './email.js';
22
- import { validateEnv } from './env.js';
20
+ import {} from './env.js';
23
21
  import { buildHandler } from './handler.js';
24
22
  import { withInternalTables } from './internal-tables.js';
25
- import { createJobsBuilder, createJobRunner, enqueueJob, startJobWorker, validateJobsDefs, } from './jobs/index.js';
23
+ import { createJobRunner, enqueueJob, startJobWorker } from './jobs/index.js';
26
24
  import { Lifecycle } from './lifecycle.js';
27
25
  import { consoleLogger } from './logging.js';
26
+ import { createMessaging } from './messaging/runtime.js';
28
27
  import { PROVISION_INTERNALS, } from './provision-internals.js';
29
28
  import { buildReadinessReport } from './readiness.js';
30
29
  import { createReadinessProbes } from './readiness-probes.js';
@@ -57,25 +56,14 @@ function waitForWorkerShutdown(signal, installProcessListeners) {
57
56
  }
58
57
  /** Default age before an unconfirmed `pending` file is treated as an orphan. */
59
58
  const DEFAULT_PENDING_TTL_MS = 30 * 60_000;
60
- export async function materializeBunderstack(options, source, overrides = {}) {
59
+ export async function materializeBunderstack(options, source, overrides = {}, inspectedEnv) {
61
60
  const logger = overrides.logger ?? consoleLogger;
62
61
  const dialect = detectDialect(options.schema);
63
- const jobsDefs = options.jobs
64
- ? typeof options.jobs === 'function'
65
- ? options.jobs(createJobsBuilder())
66
- : options.jobs
67
- : undefined;
68
- if (jobsDefs)
69
- validateJobsDefs(jobsDefs);
70
- // Env is validated FIRST: the app refuses to boot on missing/invalid vars,
71
- // and everything downstream consumes the result.
72
- const env = validateEnv(options.env, {
73
- emailProvider: overrides.emailAdapter === undefined
74
- ? (source.BUNDERSTACK_EMAIL_PROVIDER ?? emailProviderTag(options.email))
75
- : undefined,
76
- defaultDatabaseUrl: dialect === 'pg' ? 'file:./data.pglite' : 'file:./data.db',
77
- source,
78
- });
62
+ const jobsDefs = options.jobs;
63
+ if (!inspectedEnv) {
64
+ throw new Error('[bunderstack] runtime requires an inspected environment');
65
+ }
66
+ const env = inspectedEnv;
79
67
  const resolvedConfig = resolveConfig(options, env, source);
80
68
  const config = {
81
69
  ...resolvedConfig,
@@ -93,10 +81,10 @@ export async function materializeBunderstack(options, source, overrides = {}) {
93
81
  ...config.database,
94
82
  dialect,
95
83
  });
96
- const email = createEmail(options.email, {
84
+ const messaging = createMessaging((options.messaging ?? {}), {
97
85
  env,
98
86
  db,
99
- adapterOverride: overrides.emailAdapter,
87
+ adapterOverrides: overrides.messagingAdapters,
100
88
  });
101
89
  if (closeDatabase)
102
90
  lifecycle.add(closeDatabase);
@@ -111,7 +99,10 @@ export async function materializeBunderstack(options, source, overrides = {}) {
111
99
  // An `auth` builder gets the user-facing db, so better-auth hooks in another
112
100
  // file can write through the app's own connection without importing the app.
113
101
  const authConfig = resolveAuthConfig(config.auth, { db: userDb, env });
114
- const auth = createAuth(db, withEmailAuthDefaults(authConfig, email, Boolean(options.email)), dialect, options.schema);
102
+ const authEmail = options.messaging?.email?.kind === 'email'
103
+ ? messaging.email
104
+ : undefined;
105
+ const auth = createAuth(db, withEmailAuthDefaults(authConfig, authEmail ?? { send: async () => ({}) }, Boolean(authEmail)), dialect, options.schema);
115
106
  // Internal routers consume the narrow AuthSessionResolver contract, not the
116
107
  // raw better-auth instance. app.auth still exposes `auth` unchanged. An app
117
108
  // whose schema declares no better-auth models gets no resolver at all, so
@@ -249,7 +240,7 @@ export async function materializeBunderstack(options, source, overrides = {}) {
249
240
  ? createJobRunner({
250
241
  db,
251
242
  defs: resolvedDefs,
252
- ctx: { db: userDb, env, email, storage, realtime },
243
+ ctx: { db: userDb, env, messaging, storage, realtime },
253
244
  logger,
254
245
  })
255
246
  : undefined;
@@ -329,9 +320,7 @@ export async function materializeBunderstack(options, source, overrides = {}) {
329
320
  realtime,
330
321
  livePublisher: publisher,
331
322
  });
332
- const customApiRouter = typeof options.api === 'function'
333
- ? options.api(createApiBuilder())
334
- : options.api;
323
+ const customApiRouter = options.api;
335
324
  const readinessProbes = createReadinessProbes(userDb);
336
325
  const queueJobsDeclared = Object.values(options.jobs ?? {}).some((def) => def.kind === 'job');
337
326
  const readiness = () => buildReadinessReport({
@@ -450,7 +439,7 @@ export async function materializeBunderstack(options, source, overrides = {}) {
450
439
  db: userDb,
451
440
  env,
452
441
  storage,
453
- email,
442
+ messaging,
454
443
  jobs,
455
444
  realtime,
456
445
  auth,
@@ -494,7 +483,7 @@ export async function materializeBunderstack(options, source, overrides = {}) {
494
483
  auth,
495
484
  storage,
496
485
  env,
497
- email,
486
+ messaging,
498
487
  realtime,
499
488
  // Runtime facade is untyped (JobsRuntimeFacade); the generic-typed field
500
489
  // narrows `enqueue` per-app from the declared job defs — same relationship
@@ -536,7 +525,6 @@ export { BunderstackError } from './errors.js';
536
525
  export { resolveConfig, resolveAuthConfig, defineAuth } from './config.js';
537
526
  export { validateEnv, createClientEnv, BunderstackEnvError } from './env.js';
538
527
  export { buildManifest, parseManifest } from './manifest.js';
539
- export { createEmail } from './email.js';
540
528
  export { createJobsBuilder } from './jobs/index.js';
541
529
  export { defineAccess, validateAndResolveAccess, checkAccess, AUTH_TABLE_NAMES, } from './access.js';
542
530
  export { typeid, generate as generateTypeId, parse as parseTypeId, asTypeId, } from './typeid.js';