Claude-skill-registry fastify-plugin
Guide for creating Fastify plugins with TypeScript, ESM, and fastify-plugin wrapper. Use when adding new plugins to app/src/plugins/.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/fastify-plugin" ~/.claude/skills/majiayu000-claude-skill-registry-fastify-plugin && rm -rf "$T"
manifest:
skills/data/fastify-plugin/SKILL.mdsource content
Fastify Plugin Development
This skill provides patterns and conventions for creating Fastify plugins in this repository.
Directory Structure
Plugins are located in
app/src/plugins/. Each plugin is a single TypeScript file that exports a default async function wrapped with fastify-plugin.
Plugin Template
import type { FastifyInstance } from "fastify"; import fp from "fastify-plugin"; async function pluginName(fastify: FastifyInstance): Promise<void> { // Plugin implementation } export default fp(pluginName, { name: "plugin-name", dependencies: [], // List plugin dependencies if any });
Best Practices
- Always use fastify-plugin wrapper: Wrap plugins with
to expose decorators to parent scopefp() - Declare dependencies: List other plugins this plugin depends on in the options
- Type augmentation: Extend Fastify types when adding decorators:
declare module "fastify" { interface FastifyInstance { myDecorator: string; } interface FastifyRequest { customProperty: CustomType; } }
- ESM imports: Use
extensions for relative imports (TypeScript compiles to ESM).js - Node.js builtins: Use
protocol prefix (e.g.,node:
)import * as path from "node:path" - Type imports: Use
for type-only importsimport type { ... } from "pkg"
Existing Plugins Reference (16 plugins)
- CBOR response serialization with @fastify/accepts-serializeraccepts-serializer.ts
- Firebase authentication with request.user decoratorauth.ts
- CBOR request body parsingcbor-parser.ts
- CORS configuration with @fastify/corscors.ts
- Global error handling with RFC 9457 Problem Details responseserror-handler.ts
- Firebase Admin SDK initializationfirebase.ts
- Security headers with @fastify/helmethelmet.ts
- Server lifecycle hooks and graceful shutdownlifecycle.ts
- Request/response logging with timinglogging.ts
- Request ID generation and header propagationrequestid.ts
- Schema link header injection for responsesschema-discovery.ts
- Shared TypeBox schema registrationschema-registry.ts
- HTTP error utilities with @fastify/sensiblesensible.ts
- OpenAPI documentation with @fastify/swaggerswagger.ts
- Health checks and system pressure monitoringunder-pressure.ts
- Vary: Accept header for proper cachingvary-header.ts
Testing Requirements
Each plugin must have a corresponding test file in
app/tests/unit/plugins/. See the vitest-testing skill for testing patterns.
Commands
cd app npm run build # Build and verify TypeScript compilation npm run check # Run Biome linter and formatter npm run check:fix # Auto-fix linting issues npm run test # Run all tests including plugin tests
Boundaries
- Do not modify
unless adding new plugin registrationapp/src/app.ts - Do not add plugins that duplicate existing functionality
- Always add corresponding unit tests for new plugins