From 8fa0c1c86f7120911e1179864a060cd6ec2a6bc1 Mon Sep 17 00:00:00 2001 From: RomanDenysov Date: Sat, 7 Feb 2026 13:30:08 +0100 Subject: [PATCH] chore: add vitest config, CLAUDE.md, and ignore .claude/ - Add vitest.config.ts with happy-dom environment - Add CLAUDE.md with project instructions - Add .claude/ to .gitignore (local Claude Code settings) Co-Authored-By: Claude Opus 4.6 --- .gitignore | 1 + CLAUDE.md | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ vitest.config.ts | 8 ++++++++ 3 files changed, 58 insertions(+) create mode 100644 CLAUDE.md create mode 100644 vitest.config.ts diff --git a/.gitignore b/.gitignore index 20c0f40..e6a6e30 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ coverage/ .idea/ .vscode/ *.swp/ +.claude/ # env .env diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..8ed4e9b --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,49 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Consentify is a minimal, headless cookie consent management SDK. It's a TypeScript monorepo with zero runtime dependencies, designed for SSR-safe usage in modern web frameworks. + +## Commands + +```bash +# Install dependencies +pnpm install + +# Build all packages +pnpm -r build + +# Build core only +pnpm -w --filter @consentify/core build +``` + +## Publishing + +CI publishes on tags matching `core-v*`: +```bash +pnpm changeset # Create changeset +pnpm changeset version # Version packages +git tag core-v1.0.0 && git push origin core-v1.0.0 # Trigger release +``` + +## Architecture + +### Core Package (`packages/core`) + +Single-file SDK (`src/index.ts`) built around `createConsentify()` factory that returns separate `client` and `server` APIs: + +- **Server API**: Reads/writes consent via raw `Cookie` headers (Node.js compatible) +- **Client API**: Browser-side storage with React `useSyncExternalStore` support via `subscribe()` and `getServerSnapshot()` + +Key design patterns: +- Policy versioning via hash - consent invalidates when categories change +- `'necessary'` category is always `true` and cannot be disabled +- Storage abstraction supports cookie (canonical) and localStorage (optional mirror) +- State uses discriminated union: `{ decision: 'unset' }` | `{ decision: 'decided', snapshot }` + +### Internal utilities +- `fnv1a()` / `stableStringify()` - deterministic policy hashing +- `readCookie()` / `writeCookie()` - isomorphic cookie handling +- Listener pattern for React reactivity (`listeners` Set, `syncState`, `notifyListeners`) diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..905d796 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + environment: 'happy-dom', + include: ['packages/*/src/**/*.test.ts'], + }, +});