mirror of
https://github.com/xtr-dev/payload-feature-flags.git
synced 2025-12-10 02:43:25 +00:00
Replace redundant components with updated feature flag hooks and views. Add comprehensive documentation and ESLint config for improved development workflow.
This commit is contained in:
105
CLAUDE.md
Normal file
105
CLAUDE.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
This is a Payload CMS v3 plugin for feature flags (@xtr-dev/payload-feature-flags). The plugin enables feature toggles, A/B testing, and gradual rollouts through a dedicated collection and server-side hooks.
|
||||
|
||||
## Key Commands
|
||||
|
||||
### Development
|
||||
- `pnpm dev` - Start Next.js dev server with Payload CMS admin panel
|
||||
- `pnpm dev:payload` - Run Payload CLI commands for development
|
||||
- `pnpm dev:generate-types` - Generate TypeScript types from Payload config
|
||||
- `pnpm dev:generate-importmap` - Generate import map for admin panel
|
||||
|
||||
### Building
|
||||
- `pnpm build` - Full production build (copies files, builds types, compiles with SWC)
|
||||
- `pnpm build:types` - Generate TypeScript declarations only
|
||||
- `pnpm build:swc` - Compile TypeScript to JavaScript using SWC
|
||||
- `pnpm clean` - Remove dist directory and build artifacts
|
||||
- `pnpm copyfiles` - Copy non-TS assets to dist
|
||||
|
||||
### Testing & Quality
|
||||
- `pnpm test` - Run all tests (integration + e2e)
|
||||
- `pnpm test:int` - Run integration tests with Vitest
|
||||
- `pnpm test:e2e` - Run end-to-end tests with Playwright
|
||||
- `pnpm lint` - Run ESLint
|
||||
- `pnpm lint:fix` - Run ESLint with auto-fix
|
||||
|
||||
### Publishing
|
||||
- `pnpm prepublishOnly` - Clean and build before publishing (runs automatically)
|
||||
|
||||
## Architecture
|
||||
|
||||
### Plugin Structure
|
||||
The plugin follows Payload's plugin architecture with multiple exports:
|
||||
|
||||
- **Main export (`src/index.ts`)**: Core plugin configuration function
|
||||
- **RSC export (`src/exports/rsc.ts`)**: Server-side hooks for React Server Components
|
||||
- **Client export (`src/exports/client.ts`)**: Client-side components (currently placeholder)
|
||||
|
||||
### Core Components
|
||||
|
||||
#### Plugin Configuration (`src/index.ts`)
|
||||
- `PayloadFeatureFlagsConfig`: Main configuration type
|
||||
- `payloadFeatureFlags()`: Plugin factory function that creates a Payload collection and optional API endpoints
|
||||
- Collection overrides support for full customization
|
||||
- Feature toggles for rollouts, variants, and API endpoints
|
||||
|
||||
#### Server Hooks (`src/hooks/server.ts`)
|
||||
- `getFeatureFlag()`: Fetch individual flag data
|
||||
- `isFeatureEnabled()`: Simple boolean check
|
||||
- `getAllFeatureFlags()`: Get all active flags
|
||||
- `isUserInRollout()`: Check percentage-based rollouts with consistent hashing
|
||||
- `getUserVariant()`: A/B testing variant selection
|
||||
- `getFeatureFlagsByTag()`: Query flags by tags
|
||||
|
||||
#### API Endpoints (`src/endpoints/customEndpointHandler.ts`)
|
||||
- `GET /api/feature-flags` - List all active feature flags
|
||||
- `GET /api/feature-flags/:flag` - Get specific flag data
|
||||
- Only created when `enableApi: true`
|
||||
|
||||
### Collection Schema
|
||||
The plugin creates a feature flags collection with these key fields:
|
||||
- `name` (unique): Flag identifier
|
||||
- `enabled`: On/off toggle
|
||||
- `rolloutPercentage`: 0-100% rollout control
|
||||
- `variants`: Array for A/B testing with weights
|
||||
- `tags`: Organization and filtering
|
||||
- `metadata`: Additional JSON data
|
||||
|
||||
### Development Environment
|
||||
- Uses MongoDB Memory Server for testing
|
||||
- Next.js for admin panel development
|
||||
- SWC for fast compilation
|
||||
- Vitest for integration testing
|
||||
- Playwright for E2E testing
|
||||
|
||||
### Export Strategy
|
||||
The plugin publishes with different entry points:
|
||||
- **Development**: Points to TypeScript sources (`src/`)
|
||||
- **Production**: Points to compiled JavaScript (`dist/`)
|
||||
- Supports both CommonJS and ESM through package.json exports
|
||||
|
||||
## Important Notes
|
||||
|
||||
### Plugin Integration
|
||||
The plugin integrates with Payload by:
|
||||
1. Creating a feature flags collection with configurable slug and fields
|
||||
2. Adding optional REST API endpoints
|
||||
3. Providing server-side hooks that work with any collection slug
|
||||
4. Supporting full collection customization through `collectionOverrides`
|
||||
|
||||
### Security Considerations
|
||||
- REST API endpoints are disabled by default (`enableApi: false`)
|
||||
- Server-side hooks are the preferred method for accessing feature flags
|
||||
- Collection access can be restricted through `collectionOverrides.access`
|
||||
|
||||
### Testing Setup
|
||||
The development configuration (`dev/payload.config.ts`) includes:
|
||||
- MongoDB Memory Server for isolated testing
|
||||
- Test collections (posts, media)
|
||||
- Example plugin configuration with collection overrides
|
||||
- Seeding functionality for development data
|
||||
Reference in New Issue
Block a user