This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
OpenShock Common .NET library — shared utilities for the OpenShock ecosystem. Contains two main libraries: Common (utilities, validation, crypto, geolocation) and DynamicLinq (dynamic LINQ query builder for PostgreSQL/EF Core).
# Build
dotnet build
# Run all tests
dotnet test
# Run a single test project
dotnet test Common.Tests/Common.Tests.csproj
dotnet test DynamicLinq.Tests/DynamicLinq.Tests.csproj
# CI-style build + test
dotnet build --configuration Release && dotnet test --configuration Release --no-buildNo separate lint command — warnings are treated as errors in Debug configuration.
- Common/ — Main utility library (NuGet package output)
- Common.Tests/ — Unit tests for Common
- DynamicLinq/ — Dynamic LINQ expression builder targeting PostgreSQL via EF Core
- DynamicLinq.Tests/ — Tests for DynamicLinq (uses Testcontainers with PostgreSQL)
Solution file: Common.slnx
- .NET 9.0, latest C# language version
- Nullable reference types enabled globally
- Central package management via
Directory.Packages.props Directory.Build.propsenables implicit usings, XML docs, and treats warnings as errors in Debug- GitVersion used in CI for semantic versioning (requires full git history)
Uses TUnit (not xUnit/NUnit). Test methods use TUnit attributes and async patterns. DynamicLinq tests use Testcontainers for real PostgreSQL instances and Bogus for test data generation.
Constants— Domain hard limits (username/password lengths, shocker limits, durations, intensities)Utils—HashingUtils(BCrypt + legacy PBKDF2, SHA-256 token hashing),CryptoUtils(cryptographic RNG),MathUtils(Haversine),LatencyEmulator(timing-safe operations with Gaussian noise)Geo—Alpha2CountryCode(value-type struct wrapping ushort),DistanceLookup(pre-computed frozen dictionary of country-to-country distances)Validation—CharsetMatchersfor detecting emojis, zalgo text, zero-width spaces, control charsJsonSerialization— Custom converters (Unix milliseconds, flag-guarded enum strings)
QueryStringTokenizer— Parses filter strings with quoted values and escape sequencesDBExpressionBuilder— Converts string filter queries into LINQ expressions (supportseq,neq,lt,gt,lte,gte,ilike; multiple filters joined withand)OrderByQueryBuilder— Dynamic OrderBy/ThenBy from string input- Properties marked with
[IgnoreDataMember]are excluded from query building for security
stackalloc/Span<T>for short-lived buffersArrayPool<byte>for temporary allocationsFrozenDictionaryfor immutable lookup tablesCollectionsMarshalfor optimized dictionary operationsGeneratedRegexfor compiled regex patterns
- Password hashing uses BCrypt with SHA-512; PBKDF2 is legacy-only
- Token hashing uses SHA-256
- Timing-safe verification via
LatencyEmulatorsliding window statistics - Expression builder hides internal structure in error messages
AGPL-3.0-or-later