@beignet/cli 0.0.31 → 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.
- package/CHANGELOG.md +58 -0
- package/README.md +49 -6
- package/dist/check.d.ts +2 -0
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +16 -0
- package/dist/check.js.map +1 -1
- package/dist/choices.d.ts +22 -2
- package/dist/choices.d.ts.map +1 -1
- package/dist/choices.js +60 -0
- package/dist/choices.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/create-prompts.d.ts +6 -2
- package/dist/create-prompts.d.ts.map +1 -1
- package/dist/create-prompts.js +1 -1
- package/dist/create-prompts.js.map +1 -1
- package/dist/db.d.ts +5 -5
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +4 -4
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +107 -26
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts +5 -0
- package/dist/inspect.d.ts.map +1 -1
- package/dist/inspect.js +8 -4
- package/dist/inspect.js.map +1 -1
- package/dist/make/shared.d.ts +1 -1
- package/dist/make/shared.d.ts.map +1 -1
- package/dist/make/shared.js +8 -1
- package/dist/make/shared.js.map +1 -1
- package/dist/make.d.ts.map +1 -1
- package/dist/make.js +7 -10
- package/dist/make.js.map +1 -1
- package/dist/preflight.d.ts +90 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +423 -0
- package/dist/preflight.js.map +1 -0
- package/dist/provider-add.d.ts +10 -1
- package/dist/provider-add.d.ts.map +1 -1
- package/dist/provider-add.js +209 -16
- package/dist/provider-add.js.map +1 -1
- package/dist/templates/base.d.ts.map +1 -1
- package/dist/templates/base.js +2 -8
- package/dist/templates/base.js.map +1 -1
- package/dist/templates/server.js +4 -4
- package/dist/templates/shared.d.ts +2 -0
- package/dist/templates/shared.d.ts.map +1 -1
- package/dist/templates/shared.js +2 -0
- package/dist/templates/shared.js.map +1 -1
- package/package.json +2 -2
- package/skills/app-structure/SKILL.md +1 -1
- package/src/check.ts +23 -0
- package/src/choices.ts +81 -0
- package/src/config.ts +2 -0
- package/src/create-prompts.ts +8 -2
- package/src/db.ts +11 -11
- package/src/index.ts +155 -36
- package/src/inspect.ts +8 -4
- package/src/make/shared.ts +9 -2
- package/src/make.ts +7 -11
- package/src/preflight.ts +596 -0
- package/src/provider-add.ts +223 -16
- package/src/templates/base.ts +2 -10
- package/src/templates/server.ts +4 -4
- package/src/templates/shared.ts +2 -0
package/src/provider-add.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import {
|
|
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: "
|
|
207
|
+
importName: "resendMailProvider",
|
|
111
208
|
importFrom: "@beignet/provider-mail-resend",
|
|
112
|
-
providerEntry: "
|
|
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 `
|
|
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
|
-
"
|
|
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: "
|
|
250
|
+
importName: "smtpMailProvider",
|
|
154
251
|
importFrom: "@beignet/provider-mail-smtp",
|
|
155
|
-
providerEntry: "
|
|
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 `
|
|
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
|
-
"
|
|
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: "
|
|
275
|
-
importFrom: "@beignet/provider-redis",
|
|
276
|
-
providerEntry: "
|
|
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 `
|
|
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: [
|
|
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> {
|
package/src/templates/base.ts
CHANGED
|
@@ -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 `
|
|
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
|
);
|
package/src/templates/server.ts
CHANGED
|
@@ -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 {
|
|
18
|
+
'import { pinoLoggerProvider } from "@beignet/provider-logger-pino";',
|
|
19
19
|
hasIntegration(ctx, "resend")
|
|
20
|
-
? 'import {
|
|
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
|
-
"\
|
|
34
|
+
"\tpinoLoggerProvider,",
|
|
35
35
|
`\t${db.providerInstance},`,
|
|
36
36
|
"\tstarterDatabaseProvider,",
|
|
37
37
|
hasIntegration(ctx, "inngest") ? "\tinngestJobsProvider," : undefined,
|
|
38
|
-
hasIntegration(ctx, "resend") ? "\
|
|
38
|
+
hasIntegration(ctx, "resend") ? "\tresendMailProvider," : undefined,
|
|
39
39
|
hasIntegration(ctx, "upstash-rate-limit")
|
|
40
40
|
? "\tupstashRateLimitProvider,"
|
|
41
41
|
: undefined,
|
package/src/templates/shared.ts
CHANGED
|
@@ -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",
|