better-ts-stack 2.0.2 → 2.1.1
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 +114 -113
- package/dist/args.js +27 -20
- package/dist/builder/buildPlanner.js +1 -1
- package/dist/builder/configGenerator.js +4 -6
- package/dist/builder/index.js +15 -3
- package/dist/builder/moduleSelector.js +6 -2
- package/dist/builder/readmeGenerator.js +107 -0
- package/dist/builder/templateContext.js +53 -0
- package/dist/index.js +7 -1
- package/dist/output/nextSteps.js +23 -22
- package/dist/prompts/index.js +5 -2
- package/dist/prompts/stack.js +23 -2
- package/dist/types/index.js +2 -0
- package/dist/ui/messages.js +3 -1
- package/dist/validators/index.js +5 -2
- package/package.json +3 -3
- package/templates/backend/express/config.json +42 -40
- package/templates/backend/express/gitignore +3 -0
- package/templates/backend/express/src/env.ts.hbs +39 -0
- package/templates/backend/express/src/index.ts.hbs +111 -75
- package/templates/backend/nestjs/config.json +43 -41
- package/templates/backend/nestjs/gitignore +3 -0
- package/templates/backend/nestjs/src/app.module.ts.hbs +13 -0
- package/templates/backend/nestjs/src/env.ts.hbs +39 -0
- package/templates/backend/nestjs/src/health/{health.controller.ts → health.controller.ts.hbs} +8 -0
- package/templates/backend/nestjs/src/main.ts +3 -2
- package/templates/frontend/nextjs/app/page.tsx.hbs +98 -97
- package/templates/frontend/nextjs/config.json +12 -14
- package/templates/frontend/nextjs/gitignore +3 -0
- package/templates/frontend/tanstack/config.json +16 -16
- package/templates/frontend/tanstack/gitignore +3 -0
- package/templates/frontend/tanstack/src/routes/index.tsx.hbs +102 -101
- package/templates/frontend/tanstack/vite.config.ts +23 -14
- package/templates/modules/auth/express/config.json +20 -20
- package/templates/modules/auth/express/src/middleware/requireAuth.ts.hbs +1 -2
- package/templates/modules/auth/express/src/routes/auth.ts.hbs +27 -19
- package/templates/modules/auth/nestjs/config.json +20 -20
- package/templates/modules/auth/nestjs/src/auth/{auth.controller.ts → auth.controller.ts.hbs} +15 -0
- package/templates/modules/auth/nextjs/config.json +4 -4
- package/templates/{frontend/nextjs/proxy.ts.hbs → modules/auth/nextjs/proxy.ts} +1 -8
- package/templates/modules/auth/tanstack/config.json +4 -4
- package/templates/modules/auth/tanstack/src/components/auth/sign-in-form.tsx +132 -134
- package/templates/modules/auth/tanstack/src/components/auth/sign-out-button.tsx +46 -48
- package/templates/modules/auth/tanstack/src/components/auth/sign-up-form.tsx +150 -152
- package/templates/modules/ci/.github/workflows/ci.yml.hbs +43 -0
- package/templates/modules/ci/config.json +10 -0
- package/templates/modules/docker/.dockerignore +2 -0
- package/templates/modules/docker/Dockerfile.hbs +147 -136
- package/templates/modules/docker/docker-compose.yml.hbs +97 -2
- package/templates/modules/drizzle/express/config.json +3 -3
- package/templates/modules/drizzle/nestjs/config.json +3 -3
- package/templates/modules/drizzle/nextjs/config.json +3 -3
- package/templates/modules/drizzle/tanstack/config.json +3 -3
- package/templates/modules/mongoose/express/config.json +2 -2
- package/templates/modules/mongoose/nestjs/config.json +1 -1
- package/templates/modules/mongoose/nextjs/config.json +2 -2
- package/templates/modules/mongoose/tanstack/config.json +2 -2
- package/templates/modules/prisma/express/config.json +4 -4
- package/templates/modules/prisma/express/prisma.config.ts +4 -2
- package/templates/modules/prisma/nestjs/config.json +4 -4
- package/templates/modules/prisma/nestjs/prisma.config.ts +4 -2
- package/templates/modules/prisma/nextjs/config.json +4 -4
- package/templates/modules/prisma/nextjs/prisma.config.ts +4 -2
- package/templates/modules/prisma/tanstack/config.json +4 -4
- package/templates/modules/prisma/tanstack/prisma.config.ts +4 -2
- package/templates/modules/rate-limit/express/config.json +12 -0
- package/templates/modules/rate-limit/express/src/middleware/rateLimit.ts +23 -0
- package/templates/modules/rate-limit/nestjs/config.json +12 -0
|
@@ -1,41 +1,43 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "nestjs",
|
|
3
|
-
"name": "NestJS Base",
|
|
4
|
-
"description": "Base NestJS server with TypeScript, security headers, and a health check",
|
|
5
|
-
"type": "base",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"dev": "cross-env NODE_ENV=development nest start --watch",
|
|
8
|
-
"build": "nest build",
|
|
9
|
-
"start": "cross-env NODE_ENV=production {{runner}} dist/main.js",
|
|
10
|
-
"lint": "eslint src",
|
|
11
|
-
"lint:fix": "eslint src --fix",
|
|
12
|
-
"format": "prettier --write \"src/**/*.ts\"",
|
|
13
|
-
"type:check": "tsc --noEmit"
|
|
14
|
-
},
|
|
15
|
-
"dependencies": {
|
|
16
|
-
"@nestjs/common": "^12.
|
|
17
|
-
"@nestjs/core": "^12.
|
|
18
|
-
"@nestjs/platform-express": "^12.
|
|
19
|
-
"cross-env": "^10.1.0",
|
|
20
|
-
"dotenv": "^17.4.2",
|
|
21
|
-
"helmet": "^8.3.0",
|
|
22
|
-
"reflect-metadata": "^0.2.2",
|
|
23
|
-
"rxjs": "^7.8.2"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"@
|
|
28
|
-
"@nestjs/
|
|
29
|
-
"@
|
|
30
|
-
"@
|
|
31
|
-
"@types/
|
|
32
|
-
"
|
|
33
|
-
"eslint
|
|
34
|
-
"prettier": "^
|
|
35
|
-
"
|
|
36
|
-
"typescript
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
1
|
+
{
|
|
2
|
+
"id": "nestjs",
|
|
3
|
+
"name": "NestJS Base",
|
|
4
|
+
"description": "Base NestJS server with TypeScript, security headers, and a health check",
|
|
5
|
+
"type": "base",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "cross-env NODE_ENV=development nest start --watch",
|
|
8
|
+
"build": "nest build",
|
|
9
|
+
"start": "cross-env NODE_ENV=production {{runner}} dist/main.js",
|
|
10
|
+
"lint": "eslint src",
|
|
11
|
+
"lint:fix": "eslint src --fix",
|
|
12
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
13
|
+
"type:check": "tsc --noEmit"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@nestjs/common": "^12.3.2",
|
|
17
|
+
"@nestjs/core": "^12.3.2",
|
|
18
|
+
"@nestjs/platform-express": "^12.3.2",
|
|
19
|
+
"cross-env": "^10.1.0",
|
|
20
|
+
"dotenv": "^17.4.2",
|
|
21
|
+
"helmet": "^8.3.0",
|
|
22
|
+
"reflect-metadata": "^0.2.2",
|
|
23
|
+
"rxjs": "^7.8.2",
|
|
24
|
+
"zod": "^4.6.7"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@eslint/js": "^10.0.1",
|
|
28
|
+
"@nestjs/cli": "^12.0.11",
|
|
29
|
+
"@nestjs/schematics": "^12.0.12",
|
|
30
|
+
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
|
31
|
+
"@types/express": "^5.0.6",
|
|
32
|
+
"@types/node": "^24.19.2",
|
|
33
|
+
"eslint": "^10.14.0",
|
|
34
|
+
"eslint-config-prettier": "^10.1.8",
|
|
35
|
+
"prettier": "^3.9.10",
|
|
36
|
+
"typescript": "^6.0.3",
|
|
37
|
+
"typescript-eslint": "^8.72.1"
|
|
38
|
+
},
|
|
39
|
+
"envVars": {
|
|
40
|
+
"PORT": "3000",
|
|
41
|
+
"CORS_ORIGIN": "*"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { Module } from "@nestjs/common";
|
|
2
|
+
{{#if useRateLimit}}
|
|
3
|
+
import { APP_GUARD } from "@nestjs/core";
|
|
4
|
+
{{/if}}
|
|
2
5
|
{{#if (eq database 'mongoose')}}
|
|
3
6
|
import { MongooseModule } from "@nestjs/mongoose";
|
|
4
7
|
{{/if}}
|
|
8
|
+
{{#if useRateLimit}}
|
|
9
|
+
import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler";
|
|
10
|
+
{{/if}}
|
|
5
11
|
|
|
6
12
|
{{#if useAuth}}
|
|
7
13
|
import { AuthModule } from "./auth/auth.module.js";
|
|
@@ -28,7 +34,14 @@ import { PrismaModule } from "./prisma/prisma.module.js";
|
|
|
28
34
|
{{#if useAuth}}
|
|
29
35
|
AuthModule,
|
|
30
36
|
{{/if}}
|
|
37
|
+
{{#if useRateLimit}}
|
|
38
|
+
// Every route except /health: 100 requests per client IP in 15 minutes
|
|
39
|
+
ThrottlerModule.forRoot([{ ttl: 15 * 60 * 1000, limit: 100 }]),
|
|
40
|
+
{{/if}}
|
|
31
41
|
],
|
|
32
42
|
controllers: [HealthController],
|
|
43
|
+
{{#if useRateLimit}}
|
|
44
|
+
providers: [{ provide: APP_GUARD, useClass: ThrottlerGuard }],
|
|
45
|
+
{{/if}}
|
|
33
46
|
})
|
|
34
47
|
export class AppModule {}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
// Checked once at startup, so a missing or malformed variable stops the server
|
|
5
|
+
// with a clear message instead of failing on the first request that needs it
|
|
6
|
+
const envSchema = z.object({
|
|
7
|
+
PORT: z.coerce.number().int().positive().default(3000),
|
|
8
|
+
// "*" allows every origin; otherwise a comma-separated list of origins
|
|
9
|
+
CORS_ORIGIN: z
|
|
10
|
+
.string()
|
|
11
|
+
.default("*")
|
|
12
|
+
.transform((value) =>
|
|
13
|
+
value === "*" ? value : value.split(",").map((origin) => origin.trim())
|
|
14
|
+
),
|
|
15
|
+
{{#if (eq database 'prisma')}}
|
|
16
|
+
DATABASE_URL: z.url(),
|
|
17
|
+
{{/if}}
|
|
18
|
+
{{#if (eq database 'drizzle')}}
|
|
19
|
+
DATABASE_URL: z.url(),
|
|
20
|
+
{{/if}}
|
|
21
|
+
{{#if (eq database 'mongoose')}}
|
|
22
|
+
MONGODB_URI: z.url(),
|
|
23
|
+
{{/if}}
|
|
24
|
+
{{#if useAuth}}
|
|
25
|
+
JWT_SECRET: z.string().min(32, "JWT_SECRET must be at least 32 characters"),
|
|
26
|
+
JWT_EXPIRES_IN: z.string().default("1h"),
|
|
27
|
+
{{/if}}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const result = envSchema.safeParse(process.env);
|
|
31
|
+
|
|
32
|
+
if (!result.success) {
|
|
33
|
+
console.error(
|
|
34
|
+
`Invalid environment variables:\n${z.prettifyError(result.error)}`
|
|
35
|
+
);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const env = result.data;
|
package/templates/backend/nestjs/src/health/{health.controller.ts → health.controller.ts.hbs}
RENAMED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { Controller, Get } from "@nestjs/common";
|
|
2
|
+
{{#if useRateLimit}}
|
|
3
|
+
import { SkipThrottle } from "@nestjs/throttler";
|
|
4
|
+
{{/if}}
|
|
2
5
|
|
|
6
|
+
{{#if useRateLimit}}
|
|
7
|
+
// Docker and load balancers call the health check on a schedule, so it is not
|
|
8
|
+
// counted
|
|
9
|
+
@SkipThrottle()
|
|
10
|
+
{{/if}}
|
|
3
11
|
@Controller("health")
|
|
4
12
|
export class HealthController {
|
|
5
13
|
@Get()
|
|
@@ -4,13 +4,14 @@ import "dotenv/config";
|
|
|
4
4
|
import helmet from "helmet";
|
|
5
5
|
|
|
6
6
|
import { AppModule } from "./app.module.js";
|
|
7
|
+
import { env } from "./env.js";
|
|
7
8
|
|
|
8
9
|
async function bootstrap(): Promise<void> {
|
|
9
10
|
const app = await NestFactory.create(AppModule);
|
|
10
|
-
const port =
|
|
11
|
+
const port = env.PORT;
|
|
11
12
|
|
|
12
13
|
app.use(helmet());
|
|
13
|
-
app.enableCors();
|
|
14
|
+
app.enableCors({ origin: env.CORS_ORIGIN });
|
|
14
15
|
// Lets modules close database connections when the process is stopped
|
|
15
16
|
app.enableShutdownHooks();
|
|
16
17
|
|
|
@@ -1,97 +1,98 @@
|
|
|
1
|
-
import Link from "next/link";
|
|
2
|
-
|
|
3
|
-
import { ArrowRight } from "lucide-react";
|
|
4
|
-
|
|
5
|
-
import { buttonVariants } from "@/components/ui/button";
|
|
6
|
-
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
7
|
-
import { cn } from "@/lib/utils";
|
|
8
|
-
|
|
9
|
-
const featureList = [
|
|
10
|
-
"Next.js 16 App Router",
|
|
11
|
-
"React 19 and TypeScript",
|
|
12
|
-
"Tailwind CSS v4",
|
|
13
|
-
{{#if useAuth}}"Better Auth-ready session flow",{{/if}}
|
|
14
|
-
{{#if (eq database "prisma")}}"Prisma database tooling",{{/if}}
|
|
15
|
-
{{#if (eq database "drizzle")}}"Drizzle database tooling",{{/if}}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
<span
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
1
|
+
import Link from "next/link";
|
|
2
|
+
|
|
3
|
+
import { ArrowRight } from "lucide-react";
|
|
4
|
+
|
|
5
|
+
import { buttonVariants } from "@/components/ui/button";
|
|
6
|
+
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
7
|
+
import { cn } from "@/lib/utils";
|
|
8
|
+
|
|
9
|
+
const featureList = [
|
|
10
|
+
"Next.js 16 App Router",
|
|
11
|
+
"React 19 and TypeScript",
|
|
12
|
+
"Tailwind CSS v4",
|
|
13
|
+
{{#if useAuth}}"Better Auth-ready session flow",{{/if}}
|
|
14
|
+
{{#if (eq database "prisma")}}"Prisma database tooling",{{/if}}
|
|
15
|
+
{{#if (eq database "drizzle")}}"Drizzle database tooling",{{/if}}
|
|
16
|
+
{{#if (eq database "mongoose")}}"Mongoose database tooling",{{/if}}
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
export default function Home() {
|
|
20
|
+
return (
|
|
21
|
+
<main className="min-h-screen bg-background text-foreground">
|
|
22
|
+
<div className="mx-auto flex min-h-screen max-w-6xl flex-col justify-center gap-12 px-6 py-16 sm:px-10 lg:px-12">
|
|
23
|
+
<section className="grid gap-10 lg:grid-cols-[1.2fr_0.8fr] lg:items-center">
|
|
24
|
+
<div className="space-y-6">
|
|
25
|
+
<span className="inline-flex w-fit items-center rounded-full border border-border bg-card px-3 py-1 text-xs font-medium uppercase tracking-[0.24em] text-muted-foreground shadow-sm">
|
|
26
|
+
Created with better-ts-stack
|
|
27
|
+
</span>
|
|
28
|
+
<div className="space-y-4">
|
|
29
|
+
<h1 className="max-w-3xl text-4xl font-semibold tracking-tight sm:text-5xl">
|
|
30
|
+
Ship your stack faster with a polished TypeScript foundation.
|
|
31
|
+
</h1>
|
|
32
|
+
<p className="max-w-2xl text-base leading-7 text-muted-foreground sm:text-lg">
|
|
33
|
+
Your project already includes the core app shell, database wiring,
|
|
34
|
+
and a shadcn-compatible UI foundation so you can keep building
|
|
35
|
+
instead of setting up boilerplate.
|
|
36
|
+
</p>
|
|
37
|
+
</div>
|
|
38
|
+
<div className="flex flex-col gap-3 sm:flex-row">
|
|
39
|
+
{{#if useAuth}}
|
|
40
|
+
<Link
|
|
41
|
+
href="/sign-up"
|
|
42
|
+
className={cn(buttonVariants({ size: "lg" }), "gap-2")}
|
|
43
|
+
>
|
|
44
|
+
Create an account
|
|
45
|
+
<ArrowRight className="size-4" />
|
|
46
|
+
</Link>
|
|
47
|
+
<Link
|
|
48
|
+
href="/sign-in"
|
|
49
|
+
className={buttonVariants({ variant: "outline", size: "lg" })}
|
|
50
|
+
>
|
|
51
|
+
Login
|
|
52
|
+
</Link>
|
|
53
|
+
{{else}}
|
|
54
|
+
<Link
|
|
55
|
+
href="https://better-ts-stack.abdullahtech.me/docs"
|
|
56
|
+
target="_blank"
|
|
57
|
+
rel="noreferrer"
|
|
58
|
+
className={cn(buttonVariants({ size: "lg" }), "gap-2")}
|
|
59
|
+
>
|
|
60
|
+
Explore the docs
|
|
61
|
+
<ArrowRight className="size-4" />
|
|
62
|
+
</Link>
|
|
63
|
+
<Link
|
|
64
|
+
href="https://nextjs.org/docs"
|
|
65
|
+
target="_blank"
|
|
66
|
+
rel="noreferrer"
|
|
67
|
+
className={buttonVariants({ variant: "outline", size: "lg" })}
|
|
68
|
+
>
|
|
69
|
+
Next.js guide
|
|
70
|
+
</Link>
|
|
71
|
+
{{/if}}
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<Card className="border-border bg-card shadow-sm">
|
|
76
|
+
<CardHeader>
|
|
77
|
+
<CardTitle>Included in this starter</CardTitle>
|
|
78
|
+
</CardHeader>
|
|
79
|
+
<CardContent className="space-y-4">
|
|
80
|
+
<ul className="space-y-3 text-sm text-muted-foreground">
|
|
81
|
+
{featureList.map((feature) => (
|
|
82
|
+
<li key={feature} className="flex items-center gap-3">
|
|
83
|
+
<span className="size-2 rounded-full bg-primary" />
|
|
84
|
+
<span>{feature}</span>
|
|
85
|
+
</li>
|
|
86
|
+
))}
|
|
87
|
+
</ul>
|
|
88
|
+
<div className="rounded-2xl border border-border bg-muted px-4 py-3 text-sm text-muted-foreground">
|
|
89
|
+
Start editing <code className="font-mono">app/page.tsx</code> and
|
|
90
|
+
shape the project around your product instead of setup chores.
|
|
91
|
+
</div>
|
|
92
|
+
</CardContent>
|
|
93
|
+
</Card>
|
|
94
|
+
</section>
|
|
95
|
+
</div>
|
|
96
|
+
</main>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
@@ -13,25 +13,23 @@
|
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"class-variance-authority": "^0.7.1",
|
|
15
15
|
"clsx": "^2.1.1",
|
|
16
|
-
"lucide-react": "^1.
|
|
17
|
-
"next": "^16.3
|
|
18
|
-
"react": "^19.
|
|
19
|
-
"react-dom": "^19.
|
|
20
|
-
"tailwind-merge": "^3.
|
|
21
|
-
"@radix-ui/react-slot": "^1.
|
|
16
|
+
"lucide-react": "^1.66.0",
|
|
17
|
+
"next": "^16.4.3",
|
|
18
|
+
"react": "^19.3.1",
|
|
19
|
+
"react-dom": "^19.3.1",
|
|
20
|
+
"tailwind-merge": "^3.7.0",
|
|
21
|
+
"@radix-ui/react-slot": "^1.5.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@tailwindcss/postcss": "^4.3.3",
|
|
25
|
-
"@types/node": "^24.
|
|
26
|
-
"@types/react": "^19.
|
|
27
|
-
"@types/react-dom": "^19.
|
|
28
|
-
"eslint": "^10.
|
|
29
|
-
"eslint-config-next": "^16.3
|
|
25
|
+
"@types/node": "^24.19.2",
|
|
26
|
+
"@types/react": "^19.3.0",
|
|
27
|
+
"@types/react-dom": "^19.3.0",
|
|
28
|
+
"eslint": "^10.14.0",
|
|
29
|
+
"eslint-config-next": "^16.4.3",
|
|
30
30
|
"tailwindcss": "^4.3.3",
|
|
31
31
|
"typescript": "^6.0.3",
|
|
32
32
|
"@eslint/compat": "^2.1.1"
|
|
33
33
|
},
|
|
34
|
-
"envVars": {
|
|
35
|
-
"PORT": "3000"
|
|
36
|
-
}
|
|
34
|
+
"envVars": {}
|
|
37
35
|
}
|
|
@@ -6,38 +6,38 @@
|
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "vite dev",
|
|
8
8
|
"build": "vite build",
|
|
9
|
-
"start": "
|
|
9
|
+
"start": "node --env-file-if-exists=.env .output/server/index.mjs",
|
|
10
10
|
"preview": "vite preview",
|
|
11
11
|
"type:check": "tsc --noEmit",
|
|
12
12
|
"lint": "eslint src"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@tanstack/react-query": "^5.
|
|
16
|
-
"@tanstack/react-query-devtools": "^5.
|
|
17
|
-
"@tanstack/react-router": "^1.170.
|
|
15
|
+
"@tanstack/react-query": "^5.105.0",
|
|
16
|
+
"@tanstack/react-query-devtools": "^5.105.0",
|
|
17
|
+
"@tanstack/react-router": "^1.170.46",
|
|
18
18
|
"@tanstack/react-router-devtools": "^1.167.2",
|
|
19
19
|
"@tanstack/react-router-ssr-query": "^1.167.3",
|
|
20
|
-
"@tanstack/react-start": "^1.169.
|
|
20
|
+
"@tanstack/react-start": "^1.169.4",
|
|
21
21
|
"class-variance-authority": "^0.7.1",
|
|
22
22
|
"clsx": "^2.1.1",
|
|
23
|
-
"lucide-react": "^1.
|
|
24
|
-
"react": "^19.
|
|
25
|
-
"react-dom": "^19.
|
|
26
|
-
"
|
|
27
|
-
"tailwind-merge": "^3.6.0"
|
|
23
|
+
"lucide-react": "^1.66.0",
|
|
24
|
+
"react": "^19.3.1",
|
|
25
|
+
"react-dom": "^19.3.1",
|
|
26
|
+
"tailwind-merge": "^3.7.0"
|
|
28
27
|
},
|
|
29
28
|
"devDependencies": {
|
|
30
29
|
"@eslint/js": "^10.0.1",
|
|
31
30
|
"@tailwindcss/vite": "^4.3.3",
|
|
32
|
-
"@types/node": "^24.
|
|
33
|
-
"@types/react": "^19.
|
|
34
|
-
"@types/react-dom": "^19.
|
|
31
|
+
"@types/node": "^24.19.2",
|
|
32
|
+
"@types/react": "^19.3.0",
|
|
33
|
+
"@types/react-dom": "^19.3.0",
|
|
35
34
|
"@vitejs/plugin-react": "^6.1.2",
|
|
36
|
-
"eslint": "^10.
|
|
35
|
+
"eslint": "^10.14.0",
|
|
36
|
+
"nitro": "^3.0.261029-rc",
|
|
37
37
|
"tailwindcss": "^4.3.3",
|
|
38
38
|
"typescript": "^6.0.3",
|
|
39
|
-
"typescript-eslint": "^8.
|
|
40
|
-
"vite": "^8.3.
|
|
39
|
+
"typescript-eslint": "^8.72.1",
|
|
40
|
+
"vite": "^8.3.5"
|
|
41
41
|
},
|
|
42
42
|
"envVars": {
|
|
43
43
|
"PORT": "3000"
|