feat: complete development environment setup and code quality improvements

- Set up pre-commit hooks with husky and lint-staged for automated code quality
- Improved TypeScript type safety by replacing 'any' types with proper generics
- Fixed markdown linting violations (MD030 spacing) across all documentation
- Fixed compound adjective hyphenation in technical documentation
- Fixed invalid JSON union syntax in API documentation examples
- Automated code formatting and linting on commit
- Enhanced error handling with better type constraints
- Configured biome and markdownlint for consistent code style
- All changes verified with successful production build
This commit is contained in:
2025-07-13 14:44:05 +02:00
parent 1d4e695e41
commit e2301725a3
54 changed files with 2335 additions and 1863 deletions

View File

@ -47,7 +47,7 @@ export interface CacheStats {
/**
* High-performance memory cache with advanced features
*/
export class PerformanceCache<K extends {} = string, V = any> {
export class PerformanceCache<K extends {} = string, V = unknown> {
private cache: LRUCache<K, CacheEntry<V>>;
private stats: {
hits: number;
@ -245,7 +245,7 @@ class CacheManager {
/**
* Create or get a named cache instance
*/
getCache<K extends {} = string, V = any>(
getCache<K extends {} = string, V = unknown>(
name: string,
options: CacheOptions = {}
): PerformanceCache<K, V> {

View File

@ -13,7 +13,7 @@ import { TIME } from "../constants";
export interface DeduplicationOptions {
ttl?: number; // How long to keep results cached
maxPending?: number; // Maximum pending requests per key
keyGenerator?: (...args: any[]) => string;
keyGenerator?: (...args: unknown[]) => string;
timeout?: number; // Request timeout
}
@ -94,7 +94,7 @@ export class RequestDeduplicator {
/**
* Memoize a function with deduplication
*/
memoize<Args extends any[], Return>(
memoize<Args extends readonly unknown[], Return>(
fn: (...args: Args) => Promise<Return>,
options: DeduplicationOptions = {}
) {
@ -212,7 +212,7 @@ export class RequestDeduplicator {
/**
* Generate a key from function arguments
*/
private generateKey(...args: any[]): string {
private generateKey(...args: unknown[]): string {
try {
return JSON.stringify(args);
} catch {
@ -351,7 +351,9 @@ class DeduplicationManager {
ReturnType<RequestDeduplicator["getStats"]>
> = {};
for (const [name, deduplicator] of Array.from(this.deduplicators.entries())) {
for (const [name, deduplicator] of Array.from(
this.deduplicators.entries()
)) {
stats[name] = deduplicator.getStats();
}
@ -427,7 +429,7 @@ export class DeduplicationUtils {
/**
* Create a deduplicated version of an async function
*/
static deduplicate<T extends any[], R>(
static deduplicate<T extends readonly unknown[], R>(
fn: (...args: T) => Promise<R>,
deduplicatorName = "default",
options: DeduplicationOptions = {}
@ -464,7 +466,7 @@ export class DeduplicationUtils {
options
);
descriptor.value = function (...args: any[]) {
descriptor.value = function (...args: unknown[]) {
const key = `${target.constructor.name}.${propertyKey}:${JSON.stringify(args)}`;
return deduplicator.execute(
key,

View File

@ -5,10 +5,10 @@
* caching, and deduplication into existing services and API endpoints.
*/
import { PerformanceUtils, performanceMonitor } from "./monitor";
import { caches, CacheUtils } from "./cache";
import { deduplicators, DeduplicationUtils } from "./deduplication";
import type { NextRequest, NextResponse } from "next/server";
import { CacheUtils, caches } from "./cache";
import { DeduplicationUtils, deduplicators } from "./deduplication";
import { PerformanceUtils, performanceMonitor } from "./monitor";
/**
* Performance integration options
@ -235,8 +235,8 @@ export function enhanceAPIRoute(
export function PerformanceEnhanced(
options: PerformanceIntegrationOptions = {}
) {
return function <T extends new (...args: any[]) => {}>(constructor: T) {
return class extends constructor {
return <T extends new (...args: any[]) => {}>(constructor: T) =>
class extends constructor {
constructor(...args: any[]) {
super(...args);
@ -259,7 +259,6 @@ export function PerformanceEnhanced(
});
}
};
};
}
/**
@ -268,11 +267,11 @@ export function PerformanceEnhanced(
export function PerformanceOptimized(
options: PerformanceIntegrationOptions = {}
) {
return function (
return (
target: unknown,
propertyKey: string,
descriptor: PropertyDescriptor
) {
) => {
const originalMethod = descriptor.value;
if (typeof originalMethod !== "function") {
@ -280,7 +279,7 @@ export function PerformanceOptimized(
}
descriptor.value = enhanceServiceMethod(
`${(target as any).constructor.name}.${propertyKey}`,
`${(target as { constructor: { name: string } }).constructor.name}.${propertyKey}`,
originalMethod,
options
);
@ -293,15 +292,15 @@ export function PerformanceOptimized(
* Simple caching decorator
*/
export function Cached(
cacheName: string = "default",
cacheName = "default",
ttl: number = 5 * 60 * 1000,
keyGenerator?: (...args: unknown[]) => string
) {
return function (
return (
target: unknown,
propertyKey: string,
descriptor: PropertyDescriptor
) {
) => {
const originalMethod = descriptor.value;
if (typeof originalMethod !== "function") {
@ -309,14 +308,14 @@ export function Cached(
}
descriptor.value = CacheUtils.cached(
`${(target as any).constructor.name}.${propertyKey}`,
`${(target as { constructor: { name: string } }).constructor.name}.${propertyKey}`,
originalMethod,
{
ttl,
keyGenerator:
keyGenerator ||
((...args) =>
`${(target as any).constructor.name}.${propertyKey}:${JSON.stringify(args)}`),
`${(target as { constructor: { name: string } }).constructor.name}.${propertyKey}:${JSON.stringify(args)}`),
}
);
@ -328,7 +327,7 @@ export function Cached(
* Simple deduplication decorator
*/
export function Deduplicated(
deduplicatorName: string = "default",
deduplicatorName = "default",
ttl: number = 2 * 60 * 1000
) {
return DeduplicationUtils.deduplicatedMethod(deduplicatorName, { ttl });
@ -349,15 +348,18 @@ function mergeOptions(
overrides: PerformanceIntegrationOptions
): PerformanceIntegrationOptions {
return {
cache: defaults.cache && overrides.cache
? { ...defaults.cache, ...overrides.cache }
: defaults.cache || overrides.cache,
deduplication: defaults.deduplication && overrides.deduplication
? { ...defaults.deduplication, ...overrides.deduplication }
: defaults.deduplication || overrides.deduplication,
monitoring: defaults.monitoring && overrides.monitoring
? { ...defaults.monitoring, ...overrides.monitoring }
: defaults.monitoring || overrides.monitoring,
cache:
defaults.cache && overrides.cache
? { ...defaults.cache, ...overrides.cache }
: defaults.cache || overrides.cache,
deduplication:
defaults.deduplication && overrides.deduplication
? { ...defaults.deduplication, ...overrides.deduplication }
: defaults.deduplication || overrides.deduplication,
monitoring:
defaults.monitoring && overrides.monitoring
? { ...defaults.monitoring, ...overrides.monitoring }
: defaults.monitoring || overrides.monitoring,
};
}
@ -367,7 +369,9 @@ function mergeOptions(
export function createEnhancedService<T>(
ServiceClass: new (...args: unknown[]) => T,
options: PerformanceIntegrationOptions = {}
): new (...args: unknown[]) => T {
): new (
...args: unknown[]
) => T {
return PerformanceEnhanced(options)(ServiceClass as never);
}
@ -436,10 +440,7 @@ export function getPerformanceIntegrationStatus() {
* Initialize performance systems
*/
export function initializePerformanceSystems(
options: {
monitoring?: boolean;
monitoringInterval?: number;
} = {}
options: { monitoring?: boolean; monitoringInterval?: number } = {}
) {
if (options.monitoring !== false) {
const interval = options.monitoringInterval || 30000;

View File

@ -777,7 +777,7 @@ export class PerformanceUtils {
throw new Error("Measured decorator can only be applied to methods");
}
descriptor.value = async function (...args: any[]) {
descriptor.value = async function (...args: unknown[]) {
const { result, duration } = await PerformanceUtils.measureAsync(
metricName,
() => originalMethod.apply(this, args)

View File

@ -5,14 +5,14 @@
* to improve system performance based on real-time metrics.
*/
import {
performanceMonitor,
type PerformanceMetrics,
type Bottleneck,
} from "./monitor";
import { cacheManager, type CacheStats } from "./cache";
import { deduplicationManager } from "./deduplication";
import { TIME } from "../constants";
import { type CacheStats, cacheManager } from "./cache";
import { deduplicationManager } from "./deduplication";
import {
type Bottleneck,
type PerformanceMetrics,
performanceMonitor,
} from "./monitor";
/**
* Optimization action types
@ -40,8 +40,8 @@ export interface OptimizationResult {
success: boolean;
message: string;
metrics?: {
before: any;
after: any;
before: Record<string, unknown>;
after: Record<string, unknown>;
improvement: number; // Percentage
};
};
@ -408,18 +408,17 @@ export class PerformanceOptimizer {
},
timestamp: new Date(),
};
} else {
return {
action: OptimizationAction.TRIGGER_GARBAGE_COLLECTION,
target: "system",
applied: false,
result: {
success: false,
message: "Garbage collection not available (run with --expose-gc)",
},
timestamp: new Date(),
};
}
return {
action: OptimizationAction.TRIGGER_GARBAGE_COLLECTION,
target: "system",
applied: false,
result: {
success: false,
message: "Garbage collection not available (run with --expose-gc)",
},
timestamp: new Date(),
};
} catch (error) {
return {
action: OptimizationAction.TRIGGER_GARBAGE_COLLECTION,