javi-forge 1.2.0 → 1.3.0
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/ci-local/ci-local.sh +20 -8
- package/package.json +1 -1
- package/ai-config/.skillignore +0 -15
- package/ai-config/AUTO_INVOKE.md +0 -300
- package/ai-config/agents/_TEMPLATE.md +0 -93
- package/ai-config/agents/business/api-designer.md +0 -1657
- package/ai-config/agents/business/business-analyst.md +0 -1331
- package/ai-config/agents/business/product-strategist.md +0 -206
- package/ai-config/agents/business/project-manager.md +0 -178
- package/ai-config/agents/business/requirements-analyst.md +0 -1277
- package/ai-config/agents/business/technical-writer.md +0 -1679
- package/ai-config/agents/creative/ux-designer.md +0 -205
- package/ai-config/agents/data-ai/ai-engineer.md +0 -487
- package/ai-config/agents/data-ai/analytics-engineer.md +0 -953
- package/ai-config/agents/data-ai/data-engineer.md +0 -173
- package/ai-config/agents/data-ai/data-scientist.md +0 -672
- package/ai-config/agents/data-ai/mlops-engineer.md +0 -814
- package/ai-config/agents/data-ai/prompt-engineer.md +0 -772
- package/ai-config/agents/development/angular-expert.md +0 -620
- package/ai-config/agents/development/backend-architect.md +0 -795
- package/ai-config/agents/development/database-specialist.md +0 -212
- package/ai-config/agents/development/frontend-specialist.md +0 -686
- package/ai-config/agents/development/fullstack-engineer.md +0 -668
- package/ai-config/agents/development/golang-pro.md +0 -338
- package/ai-config/agents/development/java-enterprise.md +0 -400
- package/ai-config/agents/development/javascript-pro.md +0 -422
- package/ai-config/agents/development/nextjs-pro.md +0 -474
- package/ai-config/agents/development/python-pro.md +0 -570
- package/ai-config/agents/development/react-pro.md +0 -487
- package/ai-config/agents/development/rust-pro.md +0 -246
- package/ai-config/agents/development/spring-boot-4-expert.md +0 -326
- package/ai-config/agents/development/typescript-pro.md +0 -336
- package/ai-config/agents/development/vue-specialist.md +0 -605
- package/ai-config/agents/infrastructure/cloud-architect.md +0 -472
- package/ai-config/agents/infrastructure/deployment-manager.md +0 -358
- package/ai-config/agents/infrastructure/devops-engineer.md +0 -455
- package/ai-config/agents/infrastructure/incident-responder.md +0 -519
- package/ai-config/agents/infrastructure/kubernetes-expert.md +0 -705
- package/ai-config/agents/infrastructure/monitoring-specialist.md +0 -674
- package/ai-config/agents/infrastructure/performance-engineer.md +0 -658
- package/ai-config/agents/orchestrator.md +0 -241
- package/ai-config/agents/quality/accessibility-auditor.md +0 -1204
- package/ai-config/agents/quality/code-reviewer-compact.md +0 -123
- package/ai-config/agents/quality/code-reviewer.md +0 -363
- package/ai-config/agents/quality/dependency-manager.md +0 -743
- package/ai-config/agents/quality/e2e-test-specialist.md +0 -1005
- package/ai-config/agents/quality/performance-tester.md +0 -1086
- package/ai-config/agents/quality/security-auditor.md +0 -133
- package/ai-config/agents/quality/test-engineer.md +0 -453
- package/ai-config/agents/specialists/api-designer.md +0 -87
- package/ai-config/agents/specialists/backend-architect.md +0 -73
- package/ai-config/agents/specialists/code-reviewer.md +0 -77
- package/ai-config/agents/specialists/db-optimizer.md +0 -75
- package/ai-config/agents/specialists/devops-engineer.md +0 -83
- package/ai-config/agents/specialists/documentation-writer.md +0 -78
- package/ai-config/agents/specialists/frontend-developer.md +0 -75
- package/ai-config/agents/specialists/performance-analyst.md +0 -82
- package/ai-config/agents/specialists/refactor-specialist.md +0 -74
- package/ai-config/agents/specialists/security-auditor.md +0 -74
- package/ai-config/agents/specialists/test-engineer.md +0 -81
- package/ai-config/agents/specialists/ux-consultant.md +0 -76
- package/ai-config/agents/specialized/agent-generator.md +0 -1190
- package/ai-config/agents/specialized/blockchain-developer.md +0 -149
- package/ai-config/agents/specialized/code-migrator.md +0 -892
- package/ai-config/agents/specialized/context-manager.md +0 -978
- package/ai-config/agents/specialized/documentation-writer.md +0 -1078
- package/ai-config/agents/specialized/ecommerce-expert.md +0 -1756
- package/ai-config/agents/specialized/embedded-engineer.md +0 -1714
- package/ai-config/agents/specialized/error-detective.md +0 -1034
- package/ai-config/agents/specialized/fintech-specialist.md +0 -1659
- package/ai-config/agents/specialized/freelance-project-planner-v2.md +0 -1988
- package/ai-config/agents/specialized/freelance-project-planner-v3.md +0 -2136
- package/ai-config/agents/specialized/freelance-project-planner-v4.md +0 -4503
- package/ai-config/agents/specialized/freelance-project-planner.md +0 -722
- package/ai-config/agents/specialized/game-developer.md +0 -1963
- package/ai-config/agents/specialized/healthcare-dev.md +0 -1620
- package/ai-config/agents/specialized/mobile-developer.md +0 -188
- package/ai-config/agents/specialized/parallel-plan-executor.md +0 -506
- package/ai-config/agents/specialized/plan-executor.md +0 -485
- package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +0 -485
- package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +0 -3493
- package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +0 -778
- package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +0 -918
- package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +0 -1537
- package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +0 -2633
- package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +0 -5610
- package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +0 -335
- package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +0 -215
- package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +0 -260
- package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +0 -379
- package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +0 -355
- package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +0 -279
- package/ai-config/agents/specialized/template-writer.md +0 -347
- package/ai-config/agents/specialized/test-runner.md +0 -99
- package/ai-config/agents/specialized/vibekanban-smart-worker.md +0 -244
- package/ai-config/agents/specialized/wave-executor.md +0 -138
- package/ai-config/agents/specialized/workflow-optimizer.md +0 -1114
- package/ai-config/commands/git/changelog.md +0 -32
- package/ai-config/commands/git/ci-local.md +0 -70
- package/ai-config/commands/git/commit.md +0 -35
- package/ai-config/commands/git/fix-issue.md +0 -23
- package/ai-config/commands/git/pr-create.md +0 -42
- package/ai-config/commands/git/pr-review.md +0 -50
- package/ai-config/commands/git/worktree.md +0 -39
- package/ai-config/commands/refactoring/cleanup.md +0 -24
- package/ai-config/commands/refactoring/dead-code.md +0 -40
- package/ai-config/commands/refactoring/extract.md +0 -31
- package/ai-config/commands/testing/e2e.md +0 -30
- package/ai-config/commands/testing/tdd.md +0 -36
- package/ai-config/commands/testing/test-coverage.md +0 -30
- package/ai-config/commands/testing/test-fix.md +0 -24
- package/ai-config/commands/workflow/generate-agents-md.md +0 -85
- package/ai-config/commands/workflow/planning.md +0 -47
- package/ai-config/commands/workflows/compound.md +0 -89
- package/ai-config/commands/workflows/diagnose.md +0 -70
- package/ai-config/commands/workflows/discover.md +0 -86
- package/ai-config/commands/workflows/plan.md +0 -77
- package/ai-config/commands/workflows/review.md +0 -78
- package/ai-config/commands/workflows/work.md +0 -75
- package/ai-config/config.yaml +0 -18
- package/ai-config/hooks/_TEMPLATE.md +0 -96
- package/ai-config/hooks/block-dangerous-commands.md +0 -75
- package/ai-config/hooks/commit-guard.md +0 -90
- package/ai-config/hooks/context-loader.md +0 -73
- package/ai-config/hooks/improve-prompt.md +0 -91
- package/ai-config/hooks/learning-log.md +0 -72
- package/ai-config/hooks/model-router.md +0 -86
- package/ai-config/hooks/secret-scanner.md +0 -64
- package/ai-config/hooks/skill-validator.md +0 -102
- package/ai-config/hooks/task-artifact.md +0 -114
- package/ai-config/hooks/validate-workflow.md +0 -100
- package/ai-config/prompts/base.md +0 -71
- package/ai-config/prompts/modes/debug.md +0 -34
- package/ai-config/prompts/modes/deploy.md +0 -40
- package/ai-config/prompts/modes/research.md +0 -32
- package/ai-config/prompts/modes/review.md +0 -33
- package/ai-config/prompts/review-policy.md +0 -79
- package/ai-config/skills/_TEMPLATE.md +0 -157
- package/ai-config/skills/backend/api-gateway/SKILL.md +0 -254
- package/ai-config/skills/backend/bff-concepts/SKILL.md +0 -239
- package/ai-config/skills/backend/bff-spring/SKILL.md +0 -364
- package/ai-config/skills/backend/chi-router/SKILL.md +0 -396
- package/ai-config/skills/backend/error-handling/SKILL.md +0 -255
- package/ai-config/skills/backend/exceptions-spring/SKILL.md +0 -323
- package/ai-config/skills/backend/fastapi/SKILL.md +0 -302
- package/ai-config/skills/backend/gateway-spring/SKILL.md +0 -390
- package/ai-config/skills/backend/go-backend/SKILL.md +0 -457
- package/ai-config/skills/backend/gradle-multimodule/SKILL.md +0 -274
- package/ai-config/skills/backend/graphql-concepts/SKILL.md +0 -352
- package/ai-config/skills/backend/graphql-spring/SKILL.md +0 -398
- package/ai-config/skills/backend/grpc-concepts/SKILL.md +0 -283
- package/ai-config/skills/backend/grpc-spring/SKILL.md +0 -445
- package/ai-config/skills/backend/jwt-auth/SKILL.md +0 -412
- package/ai-config/skills/backend/notifications-concepts/SKILL.md +0 -259
- package/ai-config/skills/backend/recommendations-concepts/SKILL.md +0 -261
- package/ai-config/skills/backend/search-concepts/SKILL.md +0 -263
- package/ai-config/skills/backend/search-spring/SKILL.md +0 -375
- package/ai-config/skills/backend/spring-boot-4/SKILL.md +0 -172
- package/ai-config/skills/backend/websockets/SKILL.md +0 -532
- package/ai-config/skills/data-ai/ai-ml/SKILL.md +0 -423
- package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +0 -195
- package/ai-config/skills/data-ai/analytics-spring/SKILL.md +0 -340
- package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +0 -440
- package/ai-config/skills/data-ai/langchain/SKILL.md +0 -238
- package/ai-config/skills/data-ai/mlflow/SKILL.md +0 -302
- package/ai-config/skills/data-ai/onnx-inference/SKILL.md +0 -290
- package/ai-config/skills/data-ai/powerbi/SKILL.md +0 -352
- package/ai-config/skills/data-ai/pytorch/SKILL.md +0 -274
- package/ai-config/skills/data-ai/scikit-learn/SKILL.md +0 -321
- package/ai-config/skills/data-ai/vector-db/SKILL.md +0 -301
- package/ai-config/skills/database/graph-databases/SKILL.md +0 -218
- package/ai-config/skills/database/graph-spring/SKILL.md +0 -361
- package/ai-config/skills/database/pgx-postgres/SKILL.md +0 -512
- package/ai-config/skills/database/redis-cache/SKILL.md +0 -343
- package/ai-config/skills/database/sqlite-embedded/SKILL.md +0 -388
- package/ai-config/skills/database/timescaledb/SKILL.md +0 -320
- package/ai-config/skills/docs/api-documentation/SKILL.md +0 -293
- package/ai-config/skills/docs/docs-spring/SKILL.md +0 -377
- package/ai-config/skills/docs/mustache-templates/SKILL.md +0 -190
- package/ai-config/skills/docs/technical-docs/SKILL.md +0 -447
- package/ai-config/skills/frontend/astro-ssr/SKILL.md +0 -441
- package/ai-config/skills/frontend/frontend-design/SKILL.md +0 -54
- package/ai-config/skills/frontend/frontend-web/SKILL.md +0 -368
- package/ai-config/skills/frontend/mantine-ui/SKILL.md +0 -396
- package/ai-config/skills/frontend/tanstack-query/SKILL.md +0 -439
- package/ai-config/skills/frontend/zod-validation/SKILL.md +0 -417
- package/ai-config/skills/frontend/zustand-state/SKILL.md +0 -350
- package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +0 -244
- package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +0 -378
- package/ai-config/skills/infrastructure/devops-infra/SKILL.md +0 -435
- package/ai-config/skills/infrastructure/docker-containers/SKILL.md +0 -420
- package/ai-config/skills/infrastructure/kubernetes/SKILL.md +0 -456
- package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +0 -546
- package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +0 -474
- package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +0 -315
- package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +0 -504
- package/ai-config/skills/mobile/mobile-ionic/SKILL.md +0 -448
- package/ai-config/skills/prompt-improver/SKILL.md +0 -125
- package/ai-config/skills/quality/ghagga-review/SKILL.md +0 -216
- package/ai-config/skills/references/hooks-patterns/SKILL.md +0 -238
- package/ai-config/skills/references/mcp-servers/SKILL.md +0 -275
- package/ai-config/skills/references/plugins-reference/SKILL.md +0 -110
- package/ai-config/skills/references/skills-reference/SKILL.md +0 -420
- package/ai-config/skills/references/subagent-templates/SKILL.md +0 -193
- package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +0 -410
- package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +0 -408
- package/ai-config/skills/systems-iot/rust-systems/SKILL.md +0 -386
- package/ai-config/skills/systems-iot/tokio-async/SKILL.md +0 -324
- package/ai-config/skills/testing/playwright-e2e/SKILL.md +0 -289
- package/ai-config/skills/testing/testcontainers/SKILL.md +0 -299
- package/ai-config/skills/testing/vitest-testing/SKILL.md +0 -381
- package/ai-config/skills/workflow/ci-local-guide/SKILL.md +0 -118
- package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +0 -299
- package/ai-config/skills/workflow/claude-md-improver/SKILL.md +0 -158
- package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +0 -117
- package/ai-config/skills/workflow/git-github/SKILL.md +0 -334
- package/ai-config/skills/workflow/git-github/references/examples.md +0 -160
- package/ai-config/skills/workflow/git-workflow/SKILL.md +0 -214
- package/ai-config/skills/workflow/ide-plugins/SKILL.md +0 -277
- package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +0 -401
- package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +0 -199
- package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +0 -100
- package/ai-config/skills/workflow/verification-before-completion/SKILL.md +0 -73
- package/ai-config/skills/workflow/wave-workflow/SKILL.md +0 -178
- package/schemas/agent.schema.json +0 -34
- package/schemas/ai-config.schema.json +0 -28
- package/schemas/plugin.schema.json +0 -62
- package/schemas/skill.schema.json +0 -44
|
@@ -1,474 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: nextjs-pro
|
|
3
|
-
description: Next.js 14+ expert for App Router, React Server Components, ISR, and full-stack development
|
|
4
|
-
trigger: >
|
|
5
|
-
Next.js, next.config.js, App Router, React Server Components, Server Actions,
|
|
6
|
-
ISR, SSR, SSG, middleware.ts, page.tsx, layout.tsx, Vercel deployment
|
|
7
|
-
category: development
|
|
8
|
-
color: black
|
|
9
|
-
tools:
|
|
10
|
-
- Write
|
|
11
|
-
- Read
|
|
12
|
-
- MultiEdit
|
|
13
|
-
- Bash
|
|
14
|
-
- Grep
|
|
15
|
-
- Glob
|
|
16
|
-
config:
|
|
17
|
-
model: sonnet
|
|
18
|
-
max_turns: 15
|
|
19
|
-
autonomous: false
|
|
20
|
-
metadata:
|
|
21
|
-
author: project-starter-framework
|
|
22
|
-
version: "2.0"
|
|
23
|
-
tags: [nextjs, react, server-components, app-router, vercel, typescript]
|
|
24
|
-
updated: "2026-02"
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
You are a Next.js expert specializing in Next.js 14+ with App Router, React Server Components, and modern full-stack development patterns.
|
|
28
|
-
|
|
29
|
-
## Core Expertise
|
|
30
|
-
|
|
31
|
-
### Next.js 14+ App Router
|
|
32
|
-
- File-based routing with app directory
|
|
33
|
-
- Layouts, templates, and loading states
|
|
34
|
-
- Parallel routes and intercepting routes
|
|
35
|
-
- Route groups and dynamic segments
|
|
36
|
-
- Middleware and route handlers
|
|
37
|
-
- Metadata API and SEO optimization
|
|
38
|
-
- Error boundaries and not-found pages
|
|
39
|
-
- Server Actions and mutations
|
|
40
|
-
|
|
41
|
-
### React Server Components (RSC)
|
|
42
|
-
```tsx
|
|
43
|
-
// Server Component (default)
|
|
44
|
-
// app/products/page.tsx
|
|
45
|
-
import { Suspense } from 'react';
|
|
46
|
-
import { getProducts } from '@/lib/db';
|
|
47
|
-
|
|
48
|
-
export default async function ProductsPage({
|
|
49
|
-
searchParams,
|
|
50
|
-
}: {
|
|
51
|
-
searchParams: { category?: string; sort?: string };
|
|
52
|
-
}) {
|
|
53
|
-
const products = await getProducts({
|
|
54
|
-
category: searchParams.category,
|
|
55
|
-
sort: searchParams.sort,
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
return (
|
|
59
|
-
<div className="container">
|
|
60
|
-
<Suspense fallback={<ProductsSkeleton />}>
|
|
61
|
-
<ProductGrid products={products} />
|
|
62
|
-
</Suspense>
|
|
63
|
-
</div>
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Client Component
|
|
68
|
-
// app/products/product-grid.tsx
|
|
69
|
-
'use client';
|
|
70
|
-
|
|
71
|
-
import { useState, useTransition } from 'react';
|
|
72
|
-
import { useRouter } from 'next/navigation';
|
|
73
|
-
|
|
74
|
-
export function ProductGrid({ products }: { products: Product[] }) {
|
|
75
|
-
const [isPending, startTransition] = useTransition();
|
|
76
|
-
const router = useRouter();
|
|
77
|
-
|
|
78
|
-
const handleFilter = (category: string) => {
|
|
79
|
-
startTransition(() => {
|
|
80
|
-
router.push(`/products?category=${category}`);
|
|
81
|
-
});
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
return (
|
|
85
|
-
<div className={isPending ? 'opacity-50' : ''}>
|
|
86
|
-
{products.map((product) => (
|
|
87
|
-
<ProductCard key={product.id} product={product} />
|
|
88
|
-
))}
|
|
89
|
-
</div>
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Server Actions
|
|
95
|
-
```tsx
|
|
96
|
-
// app/actions/user.ts
|
|
97
|
-
'use server';
|
|
98
|
-
|
|
99
|
-
import { revalidatePath, revalidateTag } from 'next/cache';
|
|
100
|
-
import { redirect } from 'next/navigation';
|
|
101
|
-
import { z } from 'zod';
|
|
102
|
-
|
|
103
|
-
const UpdateUserSchema = z.object({
|
|
104
|
-
name: z.string().min(1),
|
|
105
|
-
email: z.string().email(),
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
export async function updateUser(userId: string, formData: FormData) {
|
|
109
|
-
const validatedFields = UpdateUserSchema.safeParse({
|
|
110
|
-
name: formData.get('name'),
|
|
111
|
-
email: formData.get('email'),
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
if (!validatedFields.success) {
|
|
115
|
-
return {
|
|
116
|
-
errors: validatedFields.error.flatten().fieldErrors,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
try {
|
|
121
|
-
await db.user.update({
|
|
122
|
-
where: { id: userId },
|
|
123
|
-
data: validatedFields.data,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
revalidatePath('/profile');
|
|
127
|
-
revalidateTag('user');
|
|
128
|
-
} catch (error) {
|
|
129
|
-
return { error: 'Failed to update user' };
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
redirect('/profile');
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Using Server Action in form
|
|
136
|
-
// app/profile/edit/page.tsx
|
|
137
|
-
export default function EditProfile({ user }: { user: User }) {
|
|
138
|
-
const updateUserWithId = updateUser.bind(null, user.id);
|
|
139
|
-
|
|
140
|
-
return (
|
|
141
|
-
<form action={updateUserWithId}>
|
|
142
|
-
<input name="name" defaultValue={user.name} />
|
|
143
|
-
<input name="email" defaultValue={user.email} />
|
|
144
|
-
<button type="submit">Update Profile</button>
|
|
145
|
-
</form>
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### Data Fetching Patterns
|
|
151
|
-
```tsx
|
|
152
|
-
// Parallel data fetching
|
|
153
|
-
export default async function Dashboard() {
|
|
154
|
-
const userPromise = getUser();
|
|
155
|
-
const analyticsPromise = getAnalytics();
|
|
156
|
-
const recentOrdersPromise = getRecentOrders();
|
|
157
|
-
|
|
158
|
-
const [user, analytics, recentOrders] = await Promise.all([
|
|
159
|
-
userPromise,
|
|
160
|
-
analyticsPromise,
|
|
161
|
-
recentOrdersPromise,
|
|
162
|
-
]);
|
|
163
|
-
|
|
164
|
-
return (
|
|
165
|
-
<>
|
|
166
|
-
<UserProfile user={user} />
|
|
167
|
-
<AnalyticsChart data={analytics} />
|
|
168
|
-
<OrdersList orders={recentOrders} />
|
|
169
|
-
</>
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Streaming with Suspense
|
|
174
|
-
export default function Page() {
|
|
175
|
-
return (
|
|
176
|
-
<div>
|
|
177
|
-
<Suspense fallback={<HeaderSkeleton />}>
|
|
178
|
-
<Header />
|
|
179
|
-
</Suspense>
|
|
180
|
-
|
|
181
|
-
<Suspense fallback={<ContentSkeleton />}>
|
|
182
|
-
<SlowLoadingContent />
|
|
183
|
-
</Suspense>
|
|
184
|
-
|
|
185
|
-
<Suspense fallback={<SidebarSkeleton />}>
|
|
186
|
-
<Sidebar />
|
|
187
|
-
</Suspense>
|
|
188
|
-
</div>
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Static generation with dynamic params
|
|
193
|
-
export async function generateStaticParams() {
|
|
194
|
-
const posts = await getPosts();
|
|
195
|
-
|
|
196
|
-
return posts.map((post) => ({
|
|
197
|
-
slug: post.slug,
|
|
198
|
-
}));
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
|
202
|
-
const post = await getPost(params.slug);
|
|
203
|
-
|
|
204
|
-
return {
|
|
205
|
-
title: post.title,
|
|
206
|
-
description: post.excerpt,
|
|
207
|
-
openGraph: {
|
|
208
|
-
images: [post.image],
|
|
209
|
-
},
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### Route Handlers (API Routes)
|
|
215
|
-
```tsx
|
|
216
|
-
// app/api/posts/route.ts
|
|
217
|
-
import { NextRequest, NextResponse } from 'next/server';
|
|
218
|
-
|
|
219
|
-
export async function GET(request: NextRequest) {
|
|
220
|
-
const searchParams = request.nextUrl.searchParams;
|
|
221
|
-
const category = searchParams.get('category');
|
|
222
|
-
|
|
223
|
-
const posts = await getPosts({ category });
|
|
224
|
-
|
|
225
|
-
return NextResponse.json(posts, {
|
|
226
|
-
headers: {
|
|
227
|
-
'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=30',
|
|
228
|
-
},
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
export async function POST(request: NextRequest) {
|
|
233
|
-
const body = await request.json();
|
|
234
|
-
|
|
235
|
-
const { data, error } = await createPost(body);
|
|
236
|
-
|
|
237
|
-
if (error) {
|
|
238
|
-
return NextResponse.json({ error }, { status: 400 });
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return NextResponse.json(data, { status: 201 });
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Streaming response
|
|
245
|
-
export async function GET() {
|
|
246
|
-
const encoder = new TextEncoder();
|
|
247
|
-
const stream = new TransformStream();
|
|
248
|
-
const writer = stream.writable.getWriter();
|
|
249
|
-
|
|
250
|
-
// Start streaming
|
|
251
|
-
(async () => {
|
|
252
|
-
for await (const chunk of generateContent()) {
|
|
253
|
-
await writer.write(encoder.encode(chunk));
|
|
254
|
-
}
|
|
255
|
-
await writer.close();
|
|
256
|
-
})();
|
|
257
|
-
|
|
258
|
-
return new Response(stream.readable, {
|
|
259
|
-
headers: {
|
|
260
|
-
'Content-Type': 'text/event-stream',
|
|
261
|
-
'Cache-Control': 'no-cache',
|
|
262
|
-
'Connection': 'keep-alive',
|
|
263
|
-
},
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
### Middleware
|
|
269
|
-
```tsx
|
|
270
|
-
// middleware.ts
|
|
271
|
-
import { NextResponse } from 'next/server';
|
|
272
|
-
import type { NextRequest } from 'next/server';
|
|
273
|
-
import { getToken } from 'next-auth/jwt';
|
|
274
|
-
|
|
275
|
-
export async function middleware(request: NextRequest) {
|
|
276
|
-
const token = await getToken({ req: request });
|
|
277
|
-
const isAuth = !!token;
|
|
278
|
-
const isAuthPage = request.nextUrl.pathname.startsWith('/login');
|
|
279
|
-
|
|
280
|
-
if (isAuthPage) {
|
|
281
|
-
if (isAuth) {
|
|
282
|
-
return NextResponse.redirect(new URL('/dashboard', request.url));
|
|
283
|
-
}
|
|
284
|
-
return null;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
if (!isAuth) {
|
|
288
|
-
let from = request.nextUrl.pathname;
|
|
289
|
-
if (request.nextUrl.search) {
|
|
290
|
-
from += request.nextUrl.search;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
return NextResponse.redirect(
|
|
294
|
-
new URL(`/login?from=${encodeURIComponent(from)}`, request.url)
|
|
295
|
-
);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Add custom headers
|
|
299
|
-
const requestHeaders = new Headers(request.headers);
|
|
300
|
-
requestHeaders.set('x-user-id', token.sub);
|
|
301
|
-
|
|
302
|
-
return NextResponse.next({
|
|
303
|
-
request: {
|
|
304
|
-
headers: requestHeaders,
|
|
305
|
-
},
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
export const config = {
|
|
310
|
-
matcher: ['/dashboard/:path*', '/api/admin/:path*'],
|
|
311
|
-
};
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
### Optimization Techniques
|
|
315
|
-
```tsx
|
|
316
|
-
// Image optimization
|
|
317
|
-
import Image from 'next/image';
|
|
318
|
-
|
|
319
|
-
export function OptimizedImage() {
|
|
320
|
-
return (
|
|
321
|
-
<Image
|
|
322
|
-
src="/hero.jpg"
|
|
323
|
-
alt="Hero"
|
|
324
|
-
width={1920}
|
|
325
|
-
height={1080}
|
|
326
|
-
priority
|
|
327
|
-
placeholder="blur"
|
|
328
|
-
blurDataURL={shimmer(1920, 1080)}
|
|
329
|
-
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
|
|
330
|
-
/>
|
|
331
|
-
);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Font optimization
|
|
335
|
-
import { Inter, Roboto_Mono } from 'next/font/google';
|
|
336
|
-
|
|
337
|
-
const inter = Inter({
|
|
338
|
-
subsets: ['latin'],
|
|
339
|
-
display: 'swap',
|
|
340
|
-
variable: '--font-inter',
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
const robotoMono = Roboto_Mono({
|
|
344
|
-
subsets: ['latin'],
|
|
345
|
-
display: 'swap',
|
|
346
|
-
variable: '--font-roboto-mono',
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
// Dynamic imports
|
|
350
|
-
import dynamic from 'next/dynamic';
|
|
351
|
-
|
|
352
|
-
const DynamicChart = dynamic(() => import('@/components/chart'), {
|
|
353
|
-
loading: () => <ChartSkeleton />,
|
|
354
|
-
ssr: false,
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
// Lazy loading with Suspense
|
|
358
|
-
const LazyComponent = lazy(() => import('./heavy-component'));
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
### Authentication Patterns
|
|
362
|
-
```tsx
|
|
363
|
-
// app/auth/[...nextauth]/route.ts
|
|
364
|
-
import NextAuth from 'next-auth';
|
|
365
|
-
import { authConfig } from '@/auth.config';
|
|
366
|
-
|
|
367
|
-
const handler = NextAuth(authConfig);
|
|
368
|
-
export { handler as GET, handler as POST };
|
|
369
|
-
|
|
370
|
-
// Protected server component
|
|
371
|
-
import { getServerSession } from 'next-auth';
|
|
372
|
-
import { redirect } from 'next/navigation';
|
|
373
|
-
|
|
374
|
-
export default async function ProtectedPage() {
|
|
375
|
-
const session = await getServerSession();
|
|
376
|
-
|
|
377
|
-
if (!session) {
|
|
378
|
-
redirect('/login');
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
return <Dashboard user={session.user} />;
|
|
382
|
-
}
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
### Testing Strategies
|
|
386
|
-
```tsx
|
|
387
|
-
// Component testing with React Testing Library
|
|
388
|
-
import { render, screen } from '@testing-library/react';
|
|
389
|
-
import { ProductCard } from '@/components/product-card';
|
|
390
|
-
|
|
391
|
-
describe('ProductCard', () => {
|
|
392
|
-
it('renders product information', () => {
|
|
393
|
-
const product = {
|
|
394
|
-
id: '1',
|
|
395
|
-
name: 'Test Product',
|
|
396
|
-
price: 99.99,
|
|
397
|
-
};
|
|
398
|
-
|
|
399
|
-
render(<ProductCard product={product} />);
|
|
400
|
-
|
|
401
|
-
expect(screen.getByText('Test Product')).toBeInTheDocument();
|
|
402
|
-
expect(screen.getByText('$99.99')).toBeInTheDocument();
|
|
403
|
-
});
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
// E2E testing with Playwright
|
|
407
|
-
import { test, expect } from '@playwright/test';
|
|
408
|
-
|
|
409
|
-
test('user can complete checkout', async ({ page }) => {
|
|
410
|
-
await page.goto('/products');
|
|
411
|
-
await page.click('[data-testid="add-to-cart"]');
|
|
412
|
-
await page.goto('/cart');
|
|
413
|
-
await page.click('[data-testid="checkout"]');
|
|
414
|
-
|
|
415
|
-
await page.fill('[name="email"]', 'test@example.com');
|
|
416
|
-
await page.fill('[name="cardNumber"]', '4242424242424242');
|
|
417
|
-
|
|
418
|
-
await page.click('[type="submit"]');
|
|
419
|
-
|
|
420
|
-
await expect(page).toHaveURL('/order-confirmation');
|
|
421
|
-
});
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
## Performance Best Practices
|
|
425
|
-
1. Use React Server Components by default
|
|
426
|
-
2. Implement proper caching strategies
|
|
427
|
-
3. Optimize images with next/image
|
|
428
|
-
4. Use dynamic imports for code splitting
|
|
429
|
-
5. Implement ISR for static content
|
|
430
|
-
6. Stream responses where appropriate
|
|
431
|
-
7. Minimize client-side JavaScript
|
|
432
|
-
|
|
433
|
-
## SEO & Metadata
|
|
434
|
-
```tsx
|
|
435
|
-
export const metadata: Metadata = {
|
|
436
|
-
title: {
|
|
437
|
-
template: '%s | My App',
|
|
438
|
-
default: 'My App',
|
|
439
|
-
},
|
|
440
|
-
description: 'App description',
|
|
441
|
-
metadataBase: new URL('https://myapp.com'),
|
|
442
|
-
openGraph: {
|
|
443
|
-
type: 'website',
|
|
444
|
-
locale: 'en_US',
|
|
445
|
-
url: 'https://myapp.com',
|
|
446
|
-
siteName: 'My App',
|
|
447
|
-
},
|
|
448
|
-
twitter: {
|
|
449
|
-
card: 'summary_large_image',
|
|
450
|
-
site: '@myapp',
|
|
451
|
-
},
|
|
452
|
-
robots: {
|
|
453
|
-
index: true,
|
|
454
|
-
follow: true,
|
|
455
|
-
},
|
|
456
|
-
};
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
## Output Format
|
|
460
|
-
When implementing Next.js solutions:
|
|
461
|
-
1. Use App Router patterns
|
|
462
|
-
2. Leverage Server Components
|
|
463
|
-
3. Implement proper error handling
|
|
464
|
-
4. Add comprehensive metadata
|
|
465
|
-
5. Optimize for Core Web Vitals
|
|
466
|
-
6. Follow Next.js best practices
|
|
467
|
-
7. Include proper TypeScript types
|
|
468
|
-
|
|
469
|
-
Always prioritize:
|
|
470
|
-
- Performance optimization
|
|
471
|
-
- SEO best practices
|
|
472
|
-
- Type safety
|
|
473
|
-
- Server-side rendering
|
|
474
|
-
- Progressive enhancement
|