Skip to content

Commit 2b32016

Browse files
authored
Merge pull request #45 from CarboxyDev/development
Add modularity to CLI template generator + Update marketing page sections
2 parents b735c55 + a163fcc commit 2b32016

File tree

22 files changed

+3732
-3313
lines changed

22 files changed

+3732
-3313
lines changed

apps/api/package.json

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,58 +26,58 @@
2626
"db:reset:seed": "prisma migrate reset --force"
2727
},
2828
"dependencies": {
29-
"@aws-sdk/client-s3": "^3.943.0",
30-
"@fastify/cookie": "^11.0.1",
31-
"@fastify/cors": "^10.0.1",
32-
"@fastify/formbody": "^8.0.1",
29+
"@aws-sdk/client-s3": "^3.962.0",
30+
"@fastify/cookie": "^11.0.2",
31+
"@fastify/cors": "^10.1.0",
32+
"@fastify/formbody": "^8.0.2",
3333
"@fastify/helmet": "^12.0.1",
3434
"@fastify/multipart": "^9.3.0",
35-
"@fastify/rate-limit": "^10.1.1",
35+
"@fastify/rate-limit": "^10.3.0",
3636
"@fastify/schedule": "^5.0.2",
3737
"@fastify/static": "^8.3.0",
38-
"@fastify/swagger": "^9.3.0",
39-
"@fastify/swagger-ui": "^5.0.1",
40-
"@prisma/adapter-pg": "^7.0.1",
41-
"@react-email/components": "^1.0.1",
42-
"@react-email/preview-server": "^5.0.4",
38+
"@fastify/swagger": "^9.6.1",
39+
"@fastify/swagger-ui": "^5.2.4",
40+
"@prisma/adapter-pg": "^7.2.0",
41+
"@react-email/components": "^1.0.3",
42+
"@react-email/preview-server": "^5.1.1",
4343
"@repo/packages-types": "workspace:*",
44-
"@scalar/fastify-api-reference": "^1.39.3",
45-
"bcryptjs": "^3.0.2",
46-
"better-auth": "^1.3.27",
47-
"close-with-grace": "^2.1.0",
44+
"@scalar/fastify-api-reference": "^1.40.9",
45+
"bcryptjs": "^3.0.3",
46+
"better-auth": "^1.4.10",
47+
"close-with-grace": "^2.4.0",
4848
"dotenv-flow": "^4.1.0",
49-
"fastify": "^5.2.0",
50-
"fastify-plugin": "^5.0.1",
51-
"fastify-type-provider-zod": "^5.0.1",
49+
"fastify": "^5.6.2",
50+
"fastify-plugin": "^5.1.0",
51+
"fastify-type-provider-zod": "^5.1.0",
5252
"pg": "^8.16.3",
53-
"pino": "^10.0.0",
54-
"pino-pretty": "^13.1.2",
53+
"pino": "^10.1.0",
54+
"pino-pretty": "^13.1.3",
5555
"react": "19.2.1",
5656
"react-dom": "19.2.1",
57-
"react-email": "^5.0.4",
58-
"resend": "^6.5.0",
57+
"react-email": "^5.1.1",
58+
"resend": "^6.6.0",
5959
"sharp": "^0.34.5",
6060
"toad-scheduler": "^3.1.0",
61-
"zod": "^4.1.12"
61+
"zod": "^4.3.5"
6262
},
6363
"devDependencies": {
6464
"@prisma/client": "7.1.0",
6565
"@repo/packages-utils": "workspace:*",
6666
"@types/bcryptjs": "^3.0.0",
67-
"@types/node": "^22.10.5",
68-
"@types/pg": "^8.15.6",
67+
"@types/node": "^22.19.3",
68+
"@types/pg": "^8.16.0",
6969
"@types/react": "19.2.6",
7070
"@types/react-dom": "19.2.3",
71-
"@typescript-eslint/eslint-plugin": "^8.20.0",
72-
"@typescript-eslint/parser": "^8.20.0",
71+
"@typescript-eslint/eslint-plugin": "^8.52.0",
72+
"@typescript-eslint/parser": "^8.52.0",
7373
"dotenv": "^17.2.3",
7474
"dotenv-cli": "^10.0.0",
75-
"eslint": "^9.18.0",
75+
"eslint": "^9.39.2",
7676
"eslint-config-prettier": "^10.1.8",
7777
"prisma": "7.1.0",
7878
"tsc-alias": "^1.8.16",
79-
"tsx": "^4.20.6",
80-
"typescript": "^5.7.2",
79+
"tsx": "^4.21.0",
80+
"typescript": "^5.9.3",
8181
"vite-tsconfig-paths": "^5.1.4",
8282
"vitest": "^3.2.4"
8383
}

apps/api/prisma/schema.prisma

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ model User {
3333
3434
sessions Session[]
3535
accounts Account[]
36+
// @feature uploads
3637
uploads Upload[]
38+
// @endfeature
3739
3840
@@map("users")
3941
}
@@ -95,7 +97,7 @@ model Verification {
9597
@@map("verifications")
9698
}
9799

98-
100+
// @feature uploads
99101
model Upload {
100102
id String @id @default(cuid())
101103
filename String @unique
@@ -113,4 +115,5 @@ model Upload {
113115
@@index([createdAt])
114116
@@map("uploads")
115117
}
118+
// @endfeature
116119

apps/api/src/app.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import {
1515
import { loadEnv } from '@/config/env';
1616
import type { RateLimitRole } from '@/config/rate-limit';
1717
import { RATE_LIMIT_CONFIG } from '@/config/rate-limit';
18+
// @feature admin
1819
import { metricsService } from '@/services/metrics.service';
20+
// @endfeature
1921

2022
const env = loadEnv();
2123

@@ -216,7 +218,9 @@ app.addHook('onRequest', async (request) => {
216218
app.addHook('onResponse', async (request, reply) => {
217219
try {
218220
const responseTime = reply.elapsedTime;
221+
// @feature admin
219222
metricsService.recordRequest(responseTime, reply.statusCode);
223+
// @endfeature
220224

221225
const statusCode = reply.statusCode;
222226
const isError = statusCode >= 400;
@@ -343,35 +347,42 @@ app.get('/health', async (request, reply) => {
343347
const { default: usersRoutes } = await import('@/routes/users.js');
344348
const { default: sessionsRoutes } = await import('@/routes/sessions.js');
345349
const { default: passwordRoutes } = await import('@/routes/password.js');
346-
const { default: verificationRoutes } = await import(
347-
'@/routes/verification.js'
348-
);
350+
const { default: verificationRoutes } =
351+
await import('@/routes/verification.js');
352+
// @feature uploads
349353
const { default: uploadsRoutes } = await import('@/routes/uploads.js');
350-
const { default: uploadsServeRoutes } = await import(
351-
'@/routes/uploads-serve.js'
352-
);
354+
const { default: uploadsServeRoutes } =
355+
await import('@/routes/uploads-serve.js');
356+
// @endfeature
353357
const { default: accountsRoutes } = await import('@/routes/accounts.js');
358+
// @feature admin
354359
const { default: statsRoutes } = await import('@/routes/stats.js');
355360
const { default: metricsRoutes } = await import('@/routes/metrics.js');
356-
const { default: adminSessionsRoutes } = await import(
357-
'@/routes/admin-sessions.js'
358-
);
361+
const { default: adminSessionsRoutes } =
362+
await import('@/routes/admin-sessions.js');
359363

360364
metricsService.start();
365+
// @endfeature
361366

367+
// @feature uploads
362368
await app.register(uploadsServeRoutes);
369+
// @endfeature
363370

364371
await app.register(
365372
async (app) => {
366373
await app.register(usersRoutes);
367374
await app.register(sessionsRoutes);
368375
await app.register(passwordRoutes);
369376
await app.register(verificationRoutes);
377+
// @feature uploads
370378
await app.register(uploadsRoutes);
379+
// @endfeature
371380
await app.register(accountsRoutes);
381+
// @feature admin
372382
await app.register(statsRoutes);
373383
await app.register(metricsRoutes);
374384
await app.register(adminSessionsRoutes);
385+
// @endfeature
375386
},
376387
{ prefix: '/api' }
377388
);

apps/api/src/plugins/services.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,17 @@ import { loadEnv } from '@/config/env';
66
import { AccountsService } from '@/services/accounts.service';
77
import { AuthorizationService } from '@/services/authorization.service';
88
import { EmailService } from '@/services/email.service';
9+
// @feature uploads
910
import { FileStorageService } from '@/services/file-storage.service';
11+
// @endfeature
1012
import { PasswordService } from '@/services/password.service';
1113
import { SessionsService } from '@/services/sessions.service';
14+
// @feature admin
1215
import { StatsService } from '@/services/stats.service';
16+
// @endfeature
17+
// @feature uploads
1318
import { UploadsService } from '@/services/uploads.service';
19+
// @endfeature
1420
import { UsersService } from '@/services/users.service';
1521

1622
declare module 'fastify' {
@@ -21,10 +27,14 @@ declare module 'fastify' {
2127
sessionsService: SessionsService;
2228
passwordService: PasswordService;
2329
emailService: EmailService;
30+
// @feature uploads
2431
fileStorageService: FileStorageService;
2532
uploadsService: UploadsService;
33+
// @endfeature
2634
accountsService: AccountsService;
35+
// @feature admin
2736
statsService: StatsService;
37+
// @endfeature
2838
}
2939
}
3040

@@ -33,32 +43,44 @@ const servicesPlugin: FastifyPluginAsync = async (app) => {
3343

3444
const authorizationService = new AuthorizationService(app.logger);
3545
const emailService = new EmailService(env, app.logger, app.prisma);
46+
// @feature uploads
3647
const fileStorageService = new FileStorageService(env, app.logger);
48+
// @endfeature
3749
const usersService = new UsersService(
3850
app.prisma,
3951
app.logger,
4052
authorizationService
4153
);
4254
const sessionsService = new SessionsService(app.prisma, authorizationService);
4355
const passwordService = new PasswordService(app.prisma, sessionsService);
56+
// @feature uploads
4457
const uploadsService = new UploadsService(
4558
app.prisma,
4659
fileStorageService,
4760
app.logger
4861
);
62+
// @endfeature
4963
const accountsService = new AccountsService(app.prisma, app.logger);
64+
// @feature admin
5065
const statsService = new StatsService(app.prisma, app.logger);
66+
// @endfeature
5167

5268
app.decorate('env', env);
5369
app.decorate('authorizationService', authorizationService);
5470
app.decorate('emailService', emailService);
71+
// @feature uploads
5572
app.decorate('fileStorageService', fileStorageService);
73+
// @endfeature
5674
app.decorate('usersService', usersService);
5775
app.decorate('sessionsService', sessionsService);
5876
app.decorate('passwordService', passwordService);
77+
// @feature uploads
5978
app.decorate('uploadsService', uploadsService);
79+
// @endfeature
6080
app.decorate('accountsService', accountsService);
81+
// @feature admin
6182
app.decorate('statsService', statsService);
83+
// @endfeature
6284

6385
app.log.info('[+] Services configured');
6486
};

apps/marketing/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
},
1515
"dependencies": {
1616
"@repo/packages-ui": "workspace:*",
17-
"framer-motion": "^12.23.24",
17+
"framer-motion": "^12.24.7",
1818
"lucide-react": "^0.545.0",
1919
"next": "16.0.7",
2020
"next-themes": "^0.4.6",
@@ -24,14 +24,14 @@
2424
},
2525
"devDependencies": {
2626
"@repo/tailwind-config": "workspace:*",
27-
"@tailwindcss/postcss": "^4.1.14",
28-
"@types/node": "^22.10.5",
27+
"@tailwindcss/postcss": "^4.1.18",
28+
"@types/node": "^22.19.3",
2929
"@types/react": "19.2.6",
3030
"@types/react-dom": "19.2.3",
31-
"eslint": "^9.18.0",
31+
"eslint": "^9.39.2",
3232
"eslint-config-next": "16.0.7",
33-
"tailwindcss": "^4.1.14",
33+
"tailwindcss": "^4.1.18",
3434
"tw-animate-css": "^1.4.0",
35-
"typescript": "^5.7.2"
35+
"typescript": "^5.9.3"
3636
}
3737
}

apps/marketing/src/app/page.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ThemeToggle } from '@repo/packages-ui/theme-toggle';
22
import React from 'react';
33

44
import { GitHubStarButton } from '@/components/github-star-button';
5+
import { ExploreStructureSection } from '@/components/landing/explore-structure-section';
56
import { FAQSection } from '@/components/landing/faq-section';
67
import { FeaturesSection } from '@/components/landing/features-section';
78
import { Footer } from '@/components/landing/footer';
@@ -40,6 +41,10 @@ export default function Home() {
4041
<IncludedSection />
4142
</SectionContainer>
4243

44+
<SectionContainer>
45+
<ExploreStructureSection />
46+
</SectionContainer>
47+
4348
<SectionContainer id="quick-start">
4449
<QuickStartSection />
4550
</SectionContainer>

0 commit comments

Comments
 (0)