@beignet/cli 0.0.30 → 0.0.32

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 (72) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +49 -6
  3. package/dist/check.d.ts +2 -0
  4. package/dist/check.d.ts.map +1 -1
  5. package/dist/check.js +16 -0
  6. package/dist/check.js.map +1 -1
  7. package/dist/choices.d.ts +22 -2
  8. package/dist/choices.d.ts.map +1 -1
  9. package/dist/choices.js +60 -0
  10. package/dist/choices.js.map +1 -1
  11. package/dist/config.d.ts +1 -0
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +1 -0
  14. package/dist/config.js.map +1 -1
  15. package/dist/create-prompts.d.ts +6 -2
  16. package/dist/create-prompts.d.ts.map +1 -1
  17. package/dist/create-prompts.js +1 -1
  18. package/dist/create-prompts.js.map +1 -1
  19. package/dist/db.d.ts +5 -5
  20. package/dist/db.d.ts.map +1 -1
  21. package/dist/db.js +4 -4
  22. package/dist/db.js.map +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +107 -26
  25. package/dist/index.js.map +1 -1
  26. package/dist/inspect.d.ts +5 -0
  27. package/dist/inspect.d.ts.map +1 -1
  28. package/dist/inspect.js +8 -4
  29. package/dist/inspect.js.map +1 -1
  30. package/dist/make/shared.d.ts +1 -1
  31. package/dist/make/shared.d.ts.map +1 -1
  32. package/dist/make/shared.js +8 -1
  33. package/dist/make/shared.js.map +1 -1
  34. package/dist/make.d.ts.map +1 -1
  35. package/dist/make.js +7 -10
  36. package/dist/make.js.map +1 -1
  37. package/dist/preflight.d.ts +90 -0
  38. package/dist/preflight.d.ts.map +1 -0
  39. package/dist/preflight.js +423 -0
  40. package/dist/preflight.js.map +1 -0
  41. package/dist/provider-add.d.ts +10 -1
  42. package/dist/provider-add.d.ts.map +1 -1
  43. package/dist/provider-add.js +209 -16
  44. package/dist/provider-add.js.map +1 -1
  45. package/dist/templates/agents.d.ts.map +1 -1
  46. package/dist/templates/agents.js +2 -1
  47. package/dist/templates/agents.js.map +1 -1
  48. package/dist/templates/base.d.ts.map +1 -1
  49. package/dist/templates/base.js +2 -8
  50. package/dist/templates/base.js.map +1 -1
  51. package/dist/templates/server.js +4 -4
  52. package/dist/templates/shared.d.ts +2 -0
  53. package/dist/templates/shared.d.ts.map +1 -1
  54. package/dist/templates/shared.js +2 -0
  55. package/dist/templates/shared.js.map +1 -1
  56. package/package.json +2 -2
  57. package/skills/app-structure/SKILL.md +1 -1
  58. package/src/check.ts +23 -0
  59. package/src/choices.ts +81 -0
  60. package/src/config.ts +2 -0
  61. package/src/create-prompts.ts +8 -2
  62. package/src/db.ts +11 -11
  63. package/src/index.ts +155 -36
  64. package/src/inspect.ts +8 -4
  65. package/src/make/shared.ts +9 -2
  66. package/src/make.ts +7 -11
  67. package/src/preflight.ts +596 -0
  68. package/src/provider-add.ts +223 -16
  69. package/src/templates/agents.ts +2 -1
  70. package/src/templates/base.ts +2 -10
  71. package/src/templates/server.ts +4 -4
  72. package/src/templates/shared.ts +2 -0
@@ -1,6 +1,10 @@
1
1
  import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { type ProviderPresetName, providerPresetChoices } from "./choices.js";
3
+ import {
4
+ type IntegrationName,
5
+ type ProviderPresetName,
6
+ providerPresetChoices,
7
+ } from "./choices.js";
4
8
  import {
5
9
  directoryPath,
6
10
  loadBeignetConfig,
@@ -104,12 +108,105 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
104
108
  "Run beignet providers audit and beignet doctor --strict.",
105
109
  ],
106
110
  },
111
+ "jobs-bullmq": {
112
+ name: "jobs-bullmq",
113
+ displayName: "BullMQ jobs",
114
+ importName: "bullMQJobsProvider",
115
+ importFrom: "@beignet/provider-jobs-bullmq",
116
+ providerEntry: "bullMQJobsProvider",
117
+ dependencies: (packageJson) => ({
118
+ "@beignet/provider-jobs-bullmq": beignetDependencyVersion(packageJson),
119
+ bullmq: externalVersions.bullmq,
120
+ }),
121
+ appPort: {
122
+ key: "jobs",
123
+ typeName: "JobDispatcherPort",
124
+ importName: "JobDispatcherPort",
125
+ importFrom: "@beignet/core/ports",
126
+ },
127
+ envVars: ["BULLMQ_REDIS_URL"],
128
+ envExample: [
129
+ "# BullMQ jobs provider",
130
+ "BULLMQ_REDIS_URL=redis://localhost:6379",
131
+ "# BULLMQ_QUEUE_NAME=beignet-jobs",
132
+ "# BULLMQ_PREFIX=beignet",
133
+ "# BULLMQ_CONCURRENCY=5",
134
+ "",
135
+ ].join("\n"),
136
+ docs: [
137
+ "## BullMQ jobs",
138
+ "",
139
+ "- Package: `@beignet/provider-jobs-bullmq`",
140
+ "- Peer dependency: `bullmq`",
141
+ "- The preset wires `bullMQJobsProvider` in `server/providers.ts` and defers `jobs` in `infra/app-ports.ts`.",
142
+ "- Set `BULLMQ_REDIS_URL` before booting the app; the default points at local Redis.",
143
+ "- Dispatching enqueues jobs, but nothing executes them until a worker entrypoint runs `createBullMQJobWorker(...)` in a worker process. See the jobs docs page.",
144
+ "- Use `ctx.ports.jobs.dispatch(...)` in app code; `ctx.ports.bullMQJobs` is available as an escape hatch.",
145
+ "",
146
+ ].join("\n"),
147
+ nextSteps: [
148
+ "Run your package manager install command.",
149
+ "Set BULLMQ_REDIS_URL in .env.local or your deployment environment.",
150
+ "Add a worker entrypoint that runs createBullMQJobWorker(...) in a worker process; dispatched jobs do not execute without one. See the jobs docs page.",
151
+ "Run beignet providers audit and beignet doctor --strict.",
152
+ ],
153
+ conflictingProviderEntries: [
154
+ "inngestJobsProvider",
155
+ "createInngestJobsProvider",
156
+ "createBullMQJobsProvider",
157
+ ],
158
+ },
159
+ "jobs-inngest": {
160
+ name: "jobs-inngest",
161
+ displayName: "Inngest jobs",
162
+ importName: "inngestJobsProvider",
163
+ importFrom: "@beignet/provider-jobs-inngest",
164
+ providerEntry: "inngestJobsProvider",
165
+ dependencies: (packageJson) => ({
166
+ "@beignet/provider-jobs-inngest": beignetDependencyVersion(packageJson),
167
+ inngest: externalVersions.inngest,
168
+ }),
169
+ appPort: {
170
+ key: "jobs",
171
+ typeName: "JobDispatcherPort",
172
+ importName: "JobDispatcherPort",
173
+ importFrom: "@beignet/core/ports",
174
+ },
175
+ envVars: ["INNGEST_APP_NAME", "INNGEST_EVENT_KEY"],
176
+ envExample: [
177
+ "# Inngest jobs provider",
178
+ "INNGEST_APP_NAME=beignet-app",
179
+ "# INNGEST_EVENT_KEY=",
180
+ "",
181
+ ].join("\n"),
182
+ docs: [
183
+ "## Inngest jobs",
184
+ "",
185
+ "- Package: `@beignet/provider-jobs-inngest`",
186
+ "- Peer dependency: `inngest`",
187
+ "- The preset wires `inngestJobsProvider` in `server/providers.ts` and defers `jobs` in `infra/app-ports.ts`.",
188
+ "- Define jobs with `defineJob(...)` and dispatch them through `ctx.ports.jobs.dispatch(...)`.",
189
+ "- Execution needs an Inngest serve route built from `createInngestJobFunction(...)` and `serve(...)`. See the jobs docs page.",
190
+ "- Use `ctx.ports.inngest` only as an escape hatch for Inngest-specific workflow APIs; prefer `ctx.ports.jobs.dispatch(...)` for Beignet jobs.",
191
+ "",
192
+ ].join("\n"),
193
+ nextSteps: [
194
+ "Run your package manager install command.",
195
+ "Set INNGEST_APP_NAME and, for Inngest cloud, INNGEST_EVENT_KEY in .env.local or your deployment environment.",
196
+ "Expose an Inngest serve route with createInngestJobFunction(...) so dispatched jobs execute. See the jobs docs page.",
197
+ "Run beignet providers audit and beignet doctor --strict.",
198
+ ],
199
+ conflictingProviderEntries: [
200
+ "bullMQJobsProvider",
201
+ "createBullMQJobsProvider",
202
+ ],
203
+ },
107
204
  "mail-resend": {
108
205
  name: "mail-resend",
109
206
  displayName: "Resend mail",
110
- importName: "mailResendProvider",
207
+ importName: "resendMailProvider",
111
208
  importFrom: "@beignet/provider-mail-resend",
112
- providerEntry: "mailResendProvider",
209
+ providerEntry: "resendMailProvider",
113
210
  dependencies: (packageJson) => ({
114
211
  "@beignet/provider-mail-resend": beignetDependencyVersion(packageJson),
115
212
  resend: externalVersions.resend,
@@ -132,7 +229,7 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
132
229
  "",
133
230
  "- Package: `@beignet/provider-mail-resend`",
134
231
  "- Peer dependency: `resend`",
135
- "- The preset wires `mailResendProvider` in `server/providers.ts` and defers `mailer` in `infra/app-ports.ts`.",
232
+ "- The preset wires `resendMailProvider` in `server/providers.ts` and defers `mailer` in `infra/app-ports.ts`.",
136
233
  "- `.env.example` ships dev placeholders so the app boots; set real `RESEND_API_KEY` and `RESEND_FROM` values before sending mail.",
137
234
  "- Use `ctx.ports.mailer` in app code; `ctx.ports.resend` is available as an escape hatch.",
138
235
  "",
@@ -143,16 +240,16 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
143
240
  "Run beignet providers audit and beignet doctor --strict.",
144
241
  ],
145
242
  conflictingProviderEntries: [
146
- "mailSmtpProvider",
243
+ "smtpMailProvider",
147
244
  "createMemoryMailerProvider",
148
245
  ],
149
246
  },
150
247
  "mail-smtp": {
151
248
  name: "mail-smtp",
152
249
  displayName: "SMTP mail",
153
- importName: "mailSmtpProvider",
250
+ importName: "smtpMailProvider",
154
251
  importFrom: "@beignet/provider-mail-smtp",
155
- providerEntry: "mailSmtpProvider",
252
+ providerEntry: "smtpMailProvider",
156
253
  dependencies: (packageJson) => ({
157
254
  "@beignet/provider-mail-smtp": beignetDependencyVersion(packageJson),
158
255
  nodemailer: externalVersions.nodemailer,
@@ -178,7 +275,7 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
178
275
  "",
179
276
  "- Package: `@beignet/provider-mail-smtp`",
180
277
  "- Peer dependency: `nodemailer`",
181
- "- The preset wires `mailSmtpProvider` in `server/providers.ts` and defers `mailer` in `infra/app-ports.ts`.",
278
+ "- The preset wires `smtpMailProvider` in `server/providers.ts` and defers `mailer` in `infra/app-ports.ts`.",
182
279
  "- `.env.example` ships dev placeholders so the app boots; set real `MAIL_*` values before sending mail.",
183
280
  "- Use `ctx.ports.mailer` in app code; `ctx.ports.smtp` is available as an escape hatch.",
184
281
  "",
@@ -189,10 +286,61 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
189
286
  "Run beignet providers audit and beignet doctor --strict.",
190
287
  ],
191
288
  conflictingProviderEntries: [
192
- "mailResendProvider",
289
+ "resendMailProvider",
193
290
  "createMemoryMailerProvider",
194
291
  ],
195
292
  },
293
+ "payments-stripe": {
294
+ name: "payments-stripe",
295
+ displayName: "Stripe payments",
296
+ importName: "stripePaymentsProvider",
297
+ importFrom: "@beignet/provider-payments-stripe",
298
+ providerEntry: "stripePaymentsProvider",
299
+ dependencies: (packageJson) => ({
300
+ "@beignet/provider-payments-stripe":
301
+ beignetDependencyVersion(packageJson),
302
+ stripe: externalVersions.stripe,
303
+ }),
304
+ appPort: {
305
+ key: "payments",
306
+ typeName: "PaymentsPort",
307
+ importName: "PaymentsPort",
308
+ importFrom: "@beignet/core/payments",
309
+ },
310
+ envVars: [
311
+ "STRIPE_SECRET_KEY",
312
+ "STRIPE_WEBHOOK_SECRET",
313
+ "STRIPE_PUBLISHABLE_KEY",
314
+ ],
315
+ envExample: [
316
+ "# Stripe payments provider",
317
+ "STRIPE_SECRET_KEY=sk_test_dev-placeholder-change-me",
318
+ "STRIPE_WEBHOOK_SECRET=whsec_dev-placeholder-change-me",
319
+ "# STRIPE_PUBLISHABLE_KEY=",
320
+ "",
321
+ ].join("\n"),
322
+ docs: [
323
+ "## Stripe payments",
324
+ "",
325
+ "- Package: `@beignet/provider-payments-stripe`",
326
+ "- Peer dependency: `stripe`",
327
+ "- The preset wires `stripePaymentsProvider` in `server/providers.ts` and defers `payments` in `infra/app-ports.ts`.",
328
+ "- `.env.example` ships dev placeholders so the app boots; set real `STRIPE_SECRET_KEY` and `STRIPE_WEBHOOK_SECRET` values before taking payments.",
329
+ "- Stripe requires a webhook route: run `beignet make payments` for the full billing slice, including a `createPaymentWebhookRoute(...)` route.",
330
+ "- Use `ctx.ports.payments` in app code; `ctx.ports.stripe` is available as an escape hatch.",
331
+ "",
332
+ ].join("\n"),
333
+ nextSteps: [
334
+ "Run your package manager install command.",
335
+ "Set STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET in .env.local or your deployment environment.",
336
+ "Run beignet make payments for the full billing slice; Stripe needs its webhook route before subscription state can sync.",
337
+ "Run beignet providers audit and beignet doctor --strict.",
338
+ ],
339
+ conflictingProviderEntries: [
340
+ "createMemoryPaymentsProvider",
341
+ "createStripePaymentsProvider",
342
+ ],
343
+ },
196
344
  "search-meilisearch": {
197
345
  name: "search-meilisearch",
198
346
  displayName: "Meilisearch search",
@@ -271,11 +419,11 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
271
419
  "redis-cache": {
272
420
  name: "redis-cache",
273
421
  displayName: "Redis cache",
274
- importName: "redisProvider",
275
- importFrom: "@beignet/provider-redis",
276
- providerEntry: "redisProvider",
422
+ importName: "redisCacheProvider",
423
+ importFrom: "@beignet/provider-cache-redis",
424
+ providerEntry: "redisCacheProvider",
277
425
  dependencies: (packageJson) => ({
278
- "@beignet/provider-redis": beignetDependencyVersion(packageJson),
426
+ "@beignet/provider-cache-redis": beignetDependencyVersion(packageJson),
279
427
  ioredis: externalVersions.ioredis,
280
428
  }),
281
429
  appPort: {
@@ -294,9 +442,9 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
294
442
  docs: [
295
443
  "## Redis cache",
296
444
  "",
297
- "- Package: `@beignet/provider-redis`",
445
+ "- Package: `@beignet/provider-cache-redis`",
298
446
  "- Peer dependency: `ioredis`",
299
- "- The preset wires `redisProvider` in `server/providers.ts` and defers `cache` in `infra/app-ports.ts`.",
447
+ "- The preset wires `redisCacheProvider` in `server/providers.ts` and defers `cache` in `infra/app-ports.ts`.",
300
448
  "- Set `REDIS_URL` before booting the app.",
301
449
  "- Use `ctx.ports.cache` in app code; `ctx.ports.redis` is available as an escape hatch.",
302
450
  "",
@@ -364,7 +512,19 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
364
512
  importName: "StoragePort",
365
513
  importFrom: "@beignet/core/storage",
366
514
  },
367
- envVars: ["STORAGE_S3_BUCKET"],
515
+ envVars: [
516
+ "STORAGE_S3_BUCKET",
517
+ "STORAGE_S3_REGION",
518
+ "STORAGE_S3_ENDPOINT",
519
+ "STORAGE_S3_PUBLIC_BASE_URL",
520
+ "STORAGE_S3_FORCE_PATH_STYLE",
521
+ "STORAGE_S3_KEY_PREFIX",
522
+ "STORAGE_S3_MAX_ATTEMPTS",
523
+ "STORAGE_S3_RETRY_MODE",
524
+ "STORAGE_S3_ACCESS_KEY_ID",
525
+ "STORAGE_S3_SECRET_ACCESS_KEY",
526
+ "STORAGE_S3_SESSION_TOKEN",
527
+ ],
368
528
  envExample: [
369
529
  "# S3-compatible storage provider",
370
530
  "STORAGE_S3_BUCKET=beignet-assets",
@@ -373,6 +533,8 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
373
533
  "# STORAGE_S3_PUBLIC_BASE_URL=",
374
534
  "# STORAGE_S3_FORCE_PATH_STYLE=false",
375
535
  "# STORAGE_S3_KEY_PREFIX=",
536
+ "# STORAGE_S3_MAX_ATTEMPTS=3",
537
+ "# STORAGE_S3_RETRY_MODE=standard",
376
538
  "# STORAGE_S3_ACCESS_KEY_ID=",
377
539
  "# STORAGE_S3_SECRET_ACCESS_KEY=",
378
540
  "# STORAGE_S3_SESSION_TOKEN=",
@@ -496,6 +658,51 @@ const presets: Record<ProviderPresetName, ProviderPreset> = {
496
658
 
497
659
  const providerPresetSet = new Set<string>(providerPresetChoices);
498
660
 
661
+ /**
662
+ * Provider entries the starter template wires for each create-time
663
+ * integration, used to pre-validate preset selections at create time.
664
+ */
665
+ const integrationProviderEntries: Record<IntegrationName, string> = {
666
+ inngest: "inngestJobsProvider",
667
+ resend: "resendMailProvider",
668
+ "upstash-rate-limit": "upstashRateLimitProvider",
669
+ };
670
+
671
+ /**
672
+ * Whether a preset ships `.env.example` entries the user must fill in.
673
+ */
674
+ export function providerPresetNeedsEnv(name: ProviderPresetName): boolean {
675
+ return presets[name].envVars.length > 0;
676
+ }
677
+
678
+ /**
679
+ * Fail fast when a create-time selection combines presets or template
680
+ * integrations that fill the same app port, before any files are written.
681
+ */
682
+ export function assertCompatibleCreatePresets(
683
+ presetNames: readonly ProviderPresetName[],
684
+ integrations: readonly IntegrationName[],
685
+ ): void {
686
+ const selectedEntries = new Map<string, string>();
687
+ for (const integration of integrations) {
688
+ selectedEntries.set(integrationProviderEntries[integration], integration);
689
+ }
690
+ for (const name of presetNames) {
691
+ selectedEntries.set(presets[name].providerEntry, name);
692
+ }
693
+
694
+ for (const name of presetNames) {
695
+ for (const conflict of presets[name].conflictingProviderEntries ?? []) {
696
+ const other = selectedEntries.get(conflict);
697
+ if (other !== undefined && other !== name) {
698
+ throw new Error(
699
+ `--integrations selections "${name}" and "${other}" fill the same app port. Pick one of them.`,
700
+ );
701
+ }
702
+ }
703
+ }
704
+ }
705
+
499
706
  export async function addProviderPreset(
500
707
  options: AddProviderPresetOptions,
501
708
  ): Promise<AddProviderPresetResult> {
@@ -83,7 +83,8 @@ apps have reimplemented by accident:
83
83
  | Rate limiting or idempotency on a route | Declare \`metadata.rateLimit\` / \`metadata.idempotency\` on the contract (or the \`pipeline\` option on raw routes); hooks enforce it. |
84
84
  | Route-level tests that exercise real hooks | \`createTestApp\` / \`createTestRequester\` from \`@beignet/web/testing\`. Bind the rate-limit and idempotency ports in the test app when asserting 429s or replay. |
85
85
  | Environment configuration | \`lib/env.ts\` (\`createEnv\`), never ad-hoc \`process.env\` reads in app code. |
86
- | Request feels slow | Open devtools; every request span breaks down into per-stage bars (context creation is the usual serverless culprit). |
86
+ | The same lookup runs several times in one request context, policy, use case | Wrap the repository read in \`createMemo(...)\` from \`@beignet/core/memo\` where the adapter is wired in infra. The cache lives for exactly one request; pair mutations with \`.invalidate(...)\`. Never hand-roll per-request caches. |
87
+ | Request feels slow | Open devtools; every request span breaks down into per-stage bars (context creation is the usual serverless culprit), and \`memo.hit\`/\`memo.miss\` events expose duplicate lookups. |
87
88
 
88
89
  ## Validation loop
89
90
 
@@ -159,18 +159,10 @@ export function readme(ctx: TemplateContext): string {
159
159
  ctx.packageManager === "npm"
160
160
  ? "npm run test"
161
161
  : `${ctx.packageManager} run test`;
162
- const lint =
163
- ctx.packageManager === "npm"
164
- ? "npm run lint"
165
- : `${ctx.packageManager} run lint`;
166
162
  const format =
167
163
  ctx.packageManager === "npm"
168
164
  ? "npm run format"
169
165
  : `${ctx.packageManager} run format`;
170
- const typecheck =
171
- ctx.packageManager === "npm"
172
- ? "npm run typecheck"
173
- : `${ctx.packageManager} run typecheck`;
174
166
  const cli = packageRunner(ctx);
175
167
 
176
168
  const firstOpen = ctx.api
@@ -393,7 +385,7 @@ export function integrationsDoc(ctx: TemplateContext): string {
393
385
  for (const integration of ctx.integrations) {
394
386
  if (integration === "inngest") {
395
387
  lines.push(
396
- "## Inngest",
388
+ "## Inngest jobs",
397
389
  "",
398
390
  "- Package: `@beignet/core` (`@beignet/core/events`, `@beignet/core/jobs`)",
399
391
  "- Package: `@beignet/provider-jobs-inngest`",
@@ -411,7 +403,7 @@ export function integrationsDoc(ctx: TemplateContext): string {
411
403
  "",
412
404
  "- Package: `@beignet/provider-mail-resend`",
413
405
  "- Peer dependency: `resend`",
414
- "- The starter wires `mailResendProvider` in `server/providers.ts`.",
406
+ "- The starter wires `resendMailProvider` in `server/providers.ts`.",
415
407
  "- `.env.example` ships dev placeholders so the app boots; set real `RESEND_API_KEY` and `RESEND_FROM` values before sending mail.",
416
408
  "",
417
409
  );
@@ -15,9 +15,9 @@ export function serverProviders(ctx: TemplateContext): string {
15
15
  hasIntegration(ctx, "inngest")
16
16
  ? 'import { inngestJobsProvider } from "@beignet/provider-jobs-inngest";'
17
17
  : undefined,
18
- 'import { loggerPinoProvider } from "@beignet/provider-logger-pino";',
18
+ 'import { pinoLoggerProvider } from "@beignet/provider-logger-pino";',
19
19
  hasIntegration(ctx, "resend")
20
- ? 'import { mailResendProvider } from "@beignet/provider-mail-resend";'
20
+ ? 'import { resendMailProvider } from "@beignet/provider-mail-resend";'
21
21
  : undefined,
22
22
  hasIntegration(ctx, "upstash-rate-limit")
23
23
  ? 'import { upstashRateLimitProvider } from "@beignet/provider-rate-limit-upstash";'
@@ -31,11 +31,11 @@ export function serverProviders(ctx: TemplateContext): string {
31
31
  const entries = [
32
32
  "\tcreateDevtoolsProvider(),",
33
33
  "\tcreateAuthBetterAuthProvider<AuthUser, AuthSessionMetadata>(auth),",
34
- "\tloggerPinoProvider,",
34
+ "\tpinoLoggerProvider,",
35
35
  `\t${db.providerInstance},`,
36
36
  "\tstarterDatabaseProvider,",
37
37
  hasIntegration(ctx, "inngest") ? "\tinngestJobsProvider," : undefined,
38
- hasIntegration(ctx, "resend") ? "\tmailResendProvider," : undefined,
38
+ hasIntegration(ctx, "resend") ? "\tresendMailProvider," : undefined,
39
39
  hasIntegration(ctx, "upstash-rate-limit")
40
40
  ? "\tupstashRateLimitProvider,"
41
41
  : undefined,
@@ -45,6 +45,7 @@ export const externalVersions = {
45
45
  hookformResolvers: "^5.0.0",
46
46
  reactHookForm: "^7.74.0",
47
47
  betterAuth: "1.6.20",
48
+ bullmq: "^5.0.0",
48
49
  drizzleKit: "^0.31.10",
49
50
  drizzleOrm: "^0.45.2",
50
51
  inngest: "^3.0.0",
@@ -56,6 +57,7 @@ export const externalVersions = {
56
57
  pino: "^9.7.0",
57
58
  resend: "^6.14.0",
58
59
  sentryNode: "^10.58.0",
60
+ stripe: "^22.2.1",
59
61
  nodemailer: "^8.0.5",
60
62
  openFeatureServerSdk: "^1.22.0",
61
63
  typesPg: "^8.11.0",