alepha 0.20.2 → 0.20.3
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/README.md +0 -1
- package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui.css +1 -1
- package/dist/api/audits/index.browser.js +49 -0
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +49 -0
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +16 -75
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.d.ts +1 -10
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/organizations/index.d.ts.map +1 -1
- package/dist/api/parameters/index.browser.js +37 -0
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +4 -65
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +37 -0
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.d.ts.map +1 -1
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/users/index.d.ts +207 -5184
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +2 -4
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +2 -1
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/bucket/index.js +5 -1
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +5 -1
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +217 -11647
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +706 -42
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.js +7 -1
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +41 -64
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +47 -0
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.js +15 -0
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.js +1 -1
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +2 -8
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/smtp/index.js +2 -10522
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +4 -8085
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +3 -33554
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.js +32 -1
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.js +5 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +1 -361
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +14 -406
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +96 -5117
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +23 -419
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +17 -20
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +2 -613
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +17 -20
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.js +22 -17
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +78 -2
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +22 -1
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +102 -4
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +1 -411
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +13 -12293
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/ui/index.js +3 -0
- package/dist/react/ui/index.js.map +1 -1
- package/dist/react/websocket/index.js.map +1 -1
- package/dist/redis/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -83
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -391
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +2 -391
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +2 -325
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +3 -1362
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +1 -1054
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +16 -1224
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +1 -4
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +19 -4
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +1 -514
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +4 -4356
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.js +1 -1
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.js.map +1 -1
- package/dist/websocket/index.browser.js +21 -0
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.js +21 -0
- package/dist/websocket/index.js.map +1 -1
- package/package.json +18 -15
- package/src/api/files/__tests__/FileController.spec.ts +1 -1
- package/src/api/jobs/__tests__/$job.spec.ts +5 -1
- package/src/api/users/schemas/userQuerySchema.ts +0 -1
- package/src/api/users/services/UserService.ts +1 -5
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +14 -0
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +14 -0
- package/src/api/verifications/services/VerificationService.ts +1 -0
- package/src/cli/core/__tests__/init.spec.ts +208 -0
- package/src/cli/core/commands/init.ts +12 -0
- package/src/cli/core/services/PackageManagerUtils.ts +23 -6
- package/src/cli/core/services/ProjectScaffolder.ts +298 -20
- package/src/cli/core/tasks/BuildDockerTask.ts +9 -10
- package/src/cli/core/tasks/BuildServerTask.ts +8 -0
- package/src/cli/core/templates/apiIndexTs.ts +23 -1
- package/src/cli/core/templates/componentsJsonTs.ts +39 -0
- package/src/cli/core/templates/mainCss.ts +1 -0
- package/src/cli/core/templates/saasAdminLayoutTsx.ts +77 -0
- package/src/cli/core/templates/saasAdminPagesTsx.ts +26 -0
- package/src/cli/core/templates/saasAuthLayoutTsx.ts +20 -0
- package/src/cli/core/templates/saasAuthPagesTsx.ts +62 -0
- package/src/cli/core/templates/saasRealmProviderTs.ts +46 -0
- package/src/cli/core/templates/webAppRouterTs.ts +104 -1
- package/src/cli/core/templates/webIndexTs.ts +23 -1
- package/src/cli/platform/__tests__/SecretsCommand.spec.ts +2 -0
- package/src/command/providers/CliProvider.ts +1 -1
- package/src/core/interfaces/Service.ts +3 -1
- package/src/core/providers/TypeProvider.ts +1 -1
- package/src/logger/services/Logger.ts +1 -1
- package/src/mcp/__tests__/$resource.spec.ts +1 -1
- package/src/mcp/__tests__/$tool.spec.ts +1 -1
- package/src/mcp/__tests__/McpServerProvider.spec.ts +1 -1
- package/src/orm/__tests__/$repository-tests.ts +1 -0
- package/src/orm/__tests__/orm-next-tests.ts +2 -67
- package/src/orm/__tests__/orm-next.spec.ts +0 -21
- package/src/orm/core/index.shared.ts +0 -2
- package/src/orm/core/index.ts +1 -2
- package/src/orm/core/primitives/$repository.ts +3 -6
- package/src/orm/core/providers/drivers/DatabaseProvider.ts +0 -5
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +11 -13
- package/src/orm/core/services/ModelBuilder.ts +1 -13
- package/src/orm/core/services/Repository.ts +1 -42
- package/src/orm/core/services/SqliteModelBuilder.ts +2 -33
- package/src/orm/postgres/services/PostgresModelBuilder.ts +10 -45
- package/src/react/intro/components/GettingStartedAuthSlide.tsx +11 -4
- package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +213 -2
- package/src/react/router/providers/ReactBrowserProvider.ts +73 -0
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +1 -1
- package/src/react/router/providers/ReactPreloadProvider.ts +1 -1
- package/src/react/router/providers/ReactServerProvider.ts +1 -0
- package/src/scheduler/providers/CronProvider.ts +1 -1
- package/src/security/primitives/$basicAuth.ts +1 -1
- package/src/server/auth/providers/ServerAuthProvider.ts +5 -1
- package/src/server/core/interfaces/ServerRequest.ts +1 -0
- package/src/server/core/providers/ServerProvider.ts +1 -1
- package/src/server/core/providers/ServerRouterProvider.ts +2 -2
- package/src/server/core/services/HttpClient.ts +1 -1
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +1 -1
- package/dist/react/testing/chunk-DBEY4PJZ.js +0 -16
- package/src/orm/core/__tests__/parseQueryString.spec.ts +0 -196
- package/src/orm/core/helpers/parseQueryString.ts +0 -502
- package/src/orm/core/primitives/$view.ts +0 -88
|
@@ -493,6 +493,214 @@ describe("alepha init", () => {
|
|
|
493
493
|
});
|
|
494
494
|
});
|
|
495
495
|
|
|
496
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
497
|
+
// SaaS preset (--saas flag)
|
|
498
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
499
|
+
|
|
500
|
+
describe("--saas flag", () => {
|
|
501
|
+
it("should imply --shadcn / --tailwind / --react / --api", async () => {
|
|
502
|
+
const { fs, cli, cmd, json } = createTestEnv();
|
|
503
|
+
await setupProject(fs, json);
|
|
504
|
+
|
|
505
|
+
await cli.run(cmd.init, { argv: "--saas", root: "/project" });
|
|
506
|
+
|
|
507
|
+
// shadcn → components.json + main.css uses tailwind
|
|
508
|
+
expect(fs.wasWritten("/project/components.json")).toBe(true);
|
|
509
|
+
expect(
|
|
510
|
+
fs.wasWrittenMatching("/project/src/main.css", /@import "tailwindcss"/),
|
|
511
|
+
).toBe(true);
|
|
512
|
+
// tailwind → vite.config.ts
|
|
513
|
+
expect(fs.wasWritten("/project/vite.config.ts")).toBe(true);
|
|
514
|
+
// react → web/ tree
|
|
515
|
+
expect(fs.wasWritten("/project/src/web/AppRouter.ts")).toBe(true);
|
|
516
|
+
expect(fs.wasWritten("/project/src/main.browser.ts")).toBe(true);
|
|
517
|
+
// api → api/ tree
|
|
518
|
+
expect(fs.wasWritten("/project/src/api/index.ts")).toBe(true);
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
it("should wire AlephaApiUsers into api/index.ts", async () => {
|
|
522
|
+
const { fs, cli, cmd, json } = createTestEnv();
|
|
523
|
+
await setupProject(fs, json);
|
|
524
|
+
|
|
525
|
+
await cli.run(cmd.init, { argv: "--saas", root: "/project" });
|
|
526
|
+
|
|
527
|
+
expect(
|
|
528
|
+
fs.wasWrittenMatching("/project/src/api/index.ts", /AlephaApiUsers/),
|
|
529
|
+
).toBe(true);
|
|
530
|
+
expect(
|
|
531
|
+
fs.wasWrittenMatching(
|
|
532
|
+
"/project/src/api/index.ts",
|
|
533
|
+
/imports:\s*\[AlephaApiUsers\]/,
|
|
534
|
+
),
|
|
535
|
+
).toBe(true);
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
it("should scaffold src/api/providers/RealmProvider.ts with $realm", async () => {
|
|
539
|
+
const { fs, cli, cmd, json } = createTestEnv();
|
|
540
|
+
await setupProject(fs, json);
|
|
541
|
+
|
|
542
|
+
await cli.run(cmd.init, { argv: "--saas", root: "/project" });
|
|
543
|
+
|
|
544
|
+
expect(fs.wasWritten("/project/src/api/providers/RealmProvider.ts")).toBe(
|
|
545
|
+
true,
|
|
546
|
+
);
|
|
547
|
+
expect(
|
|
548
|
+
fs.wasWrittenMatching(
|
|
549
|
+
"/project/src/api/providers/RealmProvider.ts",
|
|
550
|
+
/\$realm\(/,
|
|
551
|
+
),
|
|
552
|
+
).toBe(true);
|
|
553
|
+
expect(
|
|
554
|
+
fs.wasWrittenMatching(
|
|
555
|
+
"/project/src/api/providers/RealmProvider.ts",
|
|
556
|
+
/adminEmails:/,
|
|
557
|
+
),
|
|
558
|
+
).toBe(true);
|
|
559
|
+
expect(
|
|
560
|
+
fs.wasWrittenMatching(
|
|
561
|
+
"/project/src/api/providers/RealmProvider.ts",
|
|
562
|
+
/\$permission\(\s*\{[\s\S]*group:\s*"admin"[\s\S]*name:\s*"ui"/,
|
|
563
|
+
),
|
|
564
|
+
).toBe(true);
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
it("should register RealmProvider in the API module", async () => {
|
|
568
|
+
const { fs, cli, cmd, json } = createTestEnv();
|
|
569
|
+
await setupProject(fs, json);
|
|
570
|
+
|
|
571
|
+
await cli.run(cmd.init, { argv: "--saas", root: "/project" });
|
|
572
|
+
|
|
573
|
+
expect(
|
|
574
|
+
fs.wasWrittenMatching(
|
|
575
|
+
"/project/src/api/index.ts",
|
|
576
|
+
/services:\s*\[HelloController,\s*RealmProvider\]/,
|
|
577
|
+
),
|
|
578
|
+
).toBe(true);
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
it("should scaffold auth pages + AuthLayout", async () => {
|
|
582
|
+
const { fs, cli, cmd, json } = createTestEnv();
|
|
583
|
+
await setupProject(fs, json);
|
|
584
|
+
|
|
585
|
+
await cli.run(cmd.init, { argv: "--saas", root: "/project" });
|
|
586
|
+
|
|
587
|
+
expect(
|
|
588
|
+
fs.wasWritten("/project/src/web/components/auth/AuthLayout.tsx"),
|
|
589
|
+
).toBe(true);
|
|
590
|
+
expect(fs.wasWritten("/project/src/web/components/auth/Login.tsx")).toBe(
|
|
591
|
+
true,
|
|
592
|
+
);
|
|
593
|
+
expect(
|
|
594
|
+
fs.wasWritten("/project/src/web/components/auth/Register.tsx"),
|
|
595
|
+
).toBe(true);
|
|
596
|
+
expect(
|
|
597
|
+
fs.wasWritten("/project/src/web/components/auth/ResetPassword.tsx"),
|
|
598
|
+
).toBe(true);
|
|
599
|
+
expect(
|
|
600
|
+
fs.wasWritten("/project/src/web/components/auth/VerifyEmail.tsx"),
|
|
601
|
+
).toBe(true);
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
it("should scaffold admin AppShell + admin pages", async () => {
|
|
605
|
+
const { fs, cli, cmd, json } = createTestEnv();
|
|
606
|
+
await setupProject(fs, json);
|
|
607
|
+
|
|
608
|
+
await cli.run(cmd.init, { argv: "--saas", root: "/project" });
|
|
609
|
+
|
|
610
|
+
expect(
|
|
611
|
+
fs.wasWritten("/project/src/web/components/admin/AdminLayout.tsx"),
|
|
612
|
+
).toBe(true);
|
|
613
|
+
expect(
|
|
614
|
+
fs.wasWrittenMatching(
|
|
615
|
+
"/project/src/web/components/admin/AdminLayout.tsx",
|
|
616
|
+
/AppShell/,
|
|
617
|
+
),
|
|
618
|
+
).toBe(true);
|
|
619
|
+
expect(fs.wasWritten("/project/src/web/components/admin/Users.tsx")).toBe(
|
|
620
|
+
true,
|
|
621
|
+
);
|
|
622
|
+
expect(
|
|
623
|
+
fs.wasWritten("/project/src/web/components/admin/Sessions.tsx"),
|
|
624
|
+
).toBe(true);
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
it("should wire /auth and /admin routes into AppRouter", async () => {
|
|
628
|
+
const { fs, cli, cmd, json } = createTestEnv();
|
|
629
|
+
await setupProject(fs, json);
|
|
630
|
+
|
|
631
|
+
await cli.run(cmd.init, { argv: "--saas", root: "/project" });
|
|
632
|
+
|
|
633
|
+
expect(
|
|
634
|
+
fs.wasWrittenMatching(
|
|
635
|
+
"/project/src/web/AppRouter.ts",
|
|
636
|
+
/authLayout\s*=\s*\$page/,
|
|
637
|
+
),
|
|
638
|
+
).toBe(true);
|
|
639
|
+
expect(
|
|
640
|
+
fs.wasWrittenMatching(
|
|
641
|
+
"/project/src/web/AppRouter.ts",
|
|
642
|
+
/adminLayout\s*=\s*\$page/,
|
|
643
|
+
),
|
|
644
|
+
).toBe(true);
|
|
645
|
+
expect(
|
|
646
|
+
fs.wasWrittenMatching(
|
|
647
|
+
"/project/src/web/AppRouter.ts",
|
|
648
|
+
/adminUsers\s*=\s*\$page/,
|
|
649
|
+
),
|
|
650
|
+
).toBe(true);
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
it("should default the shadcn preset to b0", async () => {
|
|
654
|
+
const { fs, shell, cli, cmd, json } = createTestEnv();
|
|
655
|
+
await setupProject(fs, json);
|
|
656
|
+
|
|
657
|
+
await cli.run(cmd.init, { argv: "--shadcn", root: "/project" });
|
|
658
|
+
|
|
659
|
+
expect(shell.wasCalledMatching(/shadcn\s+init.*--preset\s+b0\b/)).toBe(
|
|
660
|
+
true,
|
|
661
|
+
);
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
it("should let --shadcn <id> override the preset", async () => {
|
|
665
|
+
const { fs, shell, cli, cmd, json } = createTestEnv();
|
|
666
|
+
await setupProject(fs, json);
|
|
667
|
+
|
|
668
|
+
await cli.run(cmd.init, {
|
|
669
|
+
argv: "--shadcn bOgTgBE1b",
|
|
670
|
+
root: "/project",
|
|
671
|
+
});
|
|
672
|
+
|
|
673
|
+
expect(
|
|
674
|
+
shell.wasCalledMatching(/shadcn\s+init.*--preset\s+bOgTgBE1b\b/),
|
|
675
|
+
).toBe(true);
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
it("should let --saas <id> override the preset", async () => {
|
|
679
|
+
const { fs, shell, cli, cmd, json } = createTestEnv();
|
|
680
|
+
await setupProject(fs, json);
|
|
681
|
+
|
|
682
|
+
await cli.run(cmd.init, {
|
|
683
|
+
argv: "--saas bOgTgBE1b",
|
|
684
|
+
root: "/project",
|
|
685
|
+
});
|
|
686
|
+
|
|
687
|
+
expect(
|
|
688
|
+
shell.wasCalledMatching(/shadcn\s+init.*--preset\s+bOgTgBE1b\b/),
|
|
689
|
+
).toBe(true);
|
|
690
|
+
});
|
|
691
|
+
|
|
692
|
+
it("should add the @alepha/saas registry bundle in one shot", async () => {
|
|
693
|
+
const { fs, cli, cmd, shell, json } = createTestEnv();
|
|
694
|
+
await setupProject(fs, json);
|
|
695
|
+
|
|
696
|
+
await cli.run(cmd.init, { argv: "--saas", root: "/project" });
|
|
697
|
+
|
|
698
|
+
expect(shell.wasCalledMatching(/shadcn\s+add\s+@alepha\/saas/)).toBe(
|
|
699
|
+
true,
|
|
700
|
+
);
|
|
701
|
+
});
|
|
702
|
+
});
|
|
703
|
+
|
|
496
704
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
497
705
|
// Non-empty directory guard (codegen flags)
|
|
498
706
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -42,6 +42,18 @@ export class InitCommand {
|
|
|
42
42
|
description: "Include Tailwind CSS with Vite plugin. Implies --react",
|
|
43
43
|
}),
|
|
44
44
|
),
|
|
45
|
+
shadcn: t.optional(
|
|
46
|
+
t.union([t.boolean(), t.text()], {
|
|
47
|
+
description:
|
|
48
|
+
"Set up shadcn/ui (components.json, cn helper, theme tokens, alepha registry). Pass an optional preset id (default: b0). Implies --react and --tailwind",
|
|
49
|
+
}),
|
|
50
|
+
),
|
|
51
|
+
saas: t.optional(
|
|
52
|
+
t.union([t.boolean(), t.text()], {
|
|
53
|
+
description:
|
|
54
|
+
"Scaffold a SaaS starter: auth (login/register/reset/verify) + admin panel (/admin AppShell with users/sessions/api-keys/parameters/audits). Pass an optional preset id (default: b0). Implies --shadcn and --api",
|
|
55
|
+
}),
|
|
56
|
+
),
|
|
45
57
|
test: t.optional(
|
|
46
58
|
t.boolean({ description: "Include Vitest and create test directory" }),
|
|
47
59
|
),
|
|
@@ -297,7 +297,7 @@ export class PackageManagerUtils {
|
|
|
297
297
|
public async removeYarn(root: string): Promise<void> {
|
|
298
298
|
await this.removeFiles(root, [".yarn", ".yarnrc.yml", "yarn.lock"]);
|
|
299
299
|
await this.editPackageJson(root, (pkg) => {
|
|
300
|
-
|
|
300
|
+
pkg.packageManager = undefined;
|
|
301
301
|
return pkg;
|
|
302
302
|
});
|
|
303
303
|
}
|
|
@@ -305,7 +305,7 @@ export class PackageManagerUtils {
|
|
|
305
305
|
public async removePnpm(root: string): Promise<void> {
|
|
306
306
|
await this.removeFiles(root, ["pnpm-lock.yaml", "pnpm-workspace.yaml"]);
|
|
307
307
|
await this.editPackageJson(root, (pkg) => {
|
|
308
|
-
|
|
308
|
+
pkg.packageManager = undefined;
|
|
309
309
|
return pkg;
|
|
310
310
|
});
|
|
311
311
|
}
|
|
@@ -402,8 +402,9 @@ export class PackageManagerUtils {
|
|
|
402
402
|
};
|
|
403
403
|
|
|
404
404
|
// Only include drizzle-kit when the project uses a database.
|
|
405
|
-
// React-only projects
|
|
406
|
-
|
|
405
|
+
// - React-only projects skip it (no ORM in scope).
|
|
406
|
+
// - SaaS pulls AlephaApiUsers which DOES need a DB → keep drizzle-kit.
|
|
407
|
+
if (!modes.react || modes.saas) {
|
|
407
408
|
devDependencies["drizzle-kit"] = alephaDeps["drizzle-kit"];
|
|
408
409
|
}
|
|
409
410
|
|
|
@@ -428,8 +429,18 @@ export class PackageManagerUtils {
|
|
|
428
429
|
}
|
|
429
430
|
|
|
430
431
|
if (modes.tailwind) {
|
|
431
|
-
devDependencies.tailwindcss =
|
|
432
|
-
devDependencies["@tailwindcss/vite"] = "
|
|
432
|
+
devDependencies.tailwindcss = alephaDeps.tailwindcss;
|
|
433
|
+
devDependencies["@tailwindcss/vite"] = alephaDeps["@tailwindcss/vite"];
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
if (modes.shadcn) {
|
|
437
|
+
// Add `shadcn` CLI as a project devDep — `alepha init --shadcn` runs
|
|
438
|
+
// `yarn shadcn init` after install to scaffold components.json,
|
|
439
|
+
// theme tokens, cn() helper, and runtime deps (clsx, tailwind-merge,
|
|
440
|
+
// class-variance-authority, lucide-react, tw-animate-css). Keeping
|
|
441
|
+
// the CLI in the project lets users re-run `yarn shadcn add ...`
|
|
442
|
+
// without `npx`.
|
|
443
|
+
devDependencies.shadcn = alephaDeps.shadcn;
|
|
433
444
|
}
|
|
434
445
|
|
|
435
446
|
if (modes.react) {
|
|
@@ -463,6 +474,12 @@ export interface DependencyModes {
|
|
|
463
474
|
react?: boolean;
|
|
464
475
|
expo?: boolean;
|
|
465
476
|
tailwind?: boolean;
|
|
477
|
+
shadcn?: boolean;
|
|
478
|
+
/**
|
|
479
|
+
* SaaS starter: implies `shadcn` + adds the alepha auth + admin registry
|
|
480
|
+
* components on top via `shadcn add @alepha/...`.
|
|
481
|
+
*/
|
|
482
|
+
saas?: boolean;
|
|
466
483
|
test?: boolean;
|
|
467
484
|
/**
|
|
468
485
|
* Skip biome/vitest when inside a workspace package (they're at root).
|