@plyaz/core 1.16.0 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/common/hash.ts","../../src/utils/common/id.ts","../../src/utils/common/values.ts","../../src/utils/common/object.ts","../../src/utils/common/typeGuards.ts","../../src/utils/common/validation.ts","../../src/utils/featureFlags/context.ts","../../src/utils/featureFlags/conditions.ts","../../src/utils/runtime.ts","../../src/utils/files.ts","../../src/utils/hmr-singleton.ts"],"names":["FNV_CONSTANTS","MATH_CONSTANTS","HASH_SEED_CONSTANTS","FEATURE_FLAG_PROVIDERS","ISO_STANDARDS","CorePackageError","ERROR_CODES","PackageLogger","MIME_TYPE_EXTENSIONS","FILE_SIZE_UNITS","FILE_SIZE_MULTIPLIERS"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Hash Utilities\n *\n * Common hashing functions for consistent data distribution and rollouts.\n *\n * @fileoverview Hash utility functions\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS, FNV_CONSTANTS, HASH_SEED_CONSTANTS } from '@plyaz/config';\n\n/**\n * Optimized string hashing function for consistent distribution.\n * Uses FNV-1a hash algorithm for better distribution and performance.\n * FNV-1a provides excellent avalanche properties and is faster than\n * polynomial rolling hash for short to medium strings.\n *\n * @param str - String to hash\n * @returns Positive hash value\n *\n * @example\n * ```typescript\n * const hash = hashString('user123:AUTH_GOOGLE');\n * const bucket = hash % 100; // 0-99\n * ```\n *\n * @remarks\n * FNV-1a algorithm benefits:\n * - Excellent distribution for hash tables\n * - Fast computation with minimal operations\n * - Good avalanche effect (small input changes create large output changes)\n * - Consistent timing reduces timing attack vulnerabilities\n */\nexport function hashString(str: string): number {\n // Handle empty string edge case early\n if (str.length === 0) return 0;\n\n // Use FNV-1a constants from config\n let hash: number = FNV_CONSTANTS.FNV_32_OFFSET;\n\n // Process string with FNV-1a algorithm\n // Using charCodeAt is faster than alternatives and handles Unicode correctly\n for (let i = 0; i < str.length; i++) {\n // XOR with byte value then multiply by prime\n // This order (XOR first) is what makes it FNV-1a vs FNV-1\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, FNV_CONSTANTS.FNV_32_PRIME) >>> 0; // Ensure 32-bit unsigned\n }\n\n // Ensure positive value using >>> 0 for unsigned 32-bit conversion\n // This is more efficient than Math.abs() and handles edge cases better\n return hash >>> 0;\n}\n\n/**\n * Determines if a user should be included in a rollout based on percentage.\n * Uses consistent hashing to ensure the same user always gets the same result.\n *\n * @param identifier - Unique identifier for consistency (e.g., userId, flagKey)\n * @param percentage - Rollout percentage (0-100)\n * @returns true if identifier should be included in rollout\n *\n * @example\n * ```typescript\n * const shouldInclude = isInRollout('user123:AUTH_GOOGLE', 25); // 25% rollout\n * ```\n */\nexport function isInRollout(identifier: string, percentage: number): boolean {\n if (percentage >= MATH_CONSTANTS.PERCENTAGE_MAX) return true;\n if (percentage <= 0) return false;\n\n const hash = hashString(identifier);\n return hash % MATH_CONSTANTS.PERCENTAGE_MAX < percentage;\n}\n\n/**\n * Creates a consistent rollout identifier for a user and feature.\n *\n * @param featureKey - Feature or flag key\n * @param userId - User identifier (defaults to 'anonymous')\n * @returns Consistent identifier for rollout calculations\n *\n * @example\n * ```typescript\n * const identifier = createRolloutIdentifier('AUTH_GOOGLE', 'user123');\n * const inRollout = isInRollout(identifier, 50);\n * ```\n */\nexport function createRolloutIdentifier(featureKey: string, userId?: string): string {\n const trimmedUserId = userId?.trim();\n const effectiveUserId = trimmedUserId && trimmedUserId.length > 0 ? trimmedUserId : 'anonymous';\n return `${featureKey}:${effectiveUserId}`;\n}\n\n/**\n * Hash-based utilities for consistent data operations.\n */\nexport const HashUtils = {\n /**\n * Generates a hash-based bucket for load balancing or distribution.\n *\n * @param identifier - Unique identifier\n * @param bucketCount - Number of buckets (default: 10)\n * @returns Bucket number (0 to bucketCount-1)\n */\n getBucket: (identifier: string, bucketCount: number = 10): number => {\n return hashString(identifier) % bucketCount;\n },\n\n /**\n * Checks if an identifier falls within a specific bucket range.\n *\n * @param identifier - Unique identifier\n * @param startBucket - Starting bucket (inclusive)\n * @param endBucket - Ending bucket (inclusive)\n * @param totalBuckets - Total number of buckets (default: 100)\n * @returns true if identifier is in the bucket range\n */\n isInBucketRange: (\n identifier: string,\n startBucket: number,\n endBucket: number,\n totalBuckets: number = MATH_CONSTANTS.PERCENTAGE_MAX\n ): boolean => {\n const bucket = hashString(identifier) % totalBuckets;\n return bucket >= startBucket && bucket <= endBucket;\n },\n\n /**\n * Creates a deterministic random seed from a string.\n * Uses the improved hash function and ensures the seed is within\n * the safe range for JavaScript's Math.random seeding.\n *\n * @param str - String to convert to seed\n * @returns Deterministic seed value (0 to 2^31-1)\n */\n createSeed: (str: string): number => {\n // Use constant from config for consistency\n return hashString(str) % HASH_SEED_CONSTANTS.MAX_SAFE_SEED;\n },\n} as const;\n","/**\n * ID Generation Utilities\n *\n * Provides consistent ID generation across the application.\n * Uses globalThis.crypto when available, with a fallback for environments without it.\n *\n * @fileoverview ID generation utility functions\n */\n\n// Constants for ID generation\nconst RANDOM_ID_RADIX = 36;\nconst RANDOM_ID_SLICE_START = 2;\nconst SHORT_ID_LENGTH = 8;\nconst HEX_RADIX = 16;\nconst HEX_SLICE_START = 2;\nconst HEX_SLICE_END = 18;\nconst SPAN_ID_LENGTH = 16;\n\n/**\n * Generate a UUID v4 string.\n * Uses crypto.randomUUID when available, otherwise falls back to a timestamp-based ID.\n *\n * @returns A UUID v4 string or fallback ID\n *\n * @example\n * ```typescript\n * const id = generateId();\n * // => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' (crypto available)\n * // => '1701475200000-x7k9m2' (fallback)\n * ```\n */\nexport function generateId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;\n}\n\n/**\n * Generate a short random ID (8 characters).\n * Useful for correlation IDs, short references, etc.\n *\n * @returns A short random string\n *\n * @example\n * ```typescript\n * const shortId = generateShortId();\n * // => 'x7k9m2ab'\n * ```\n */\nexport function generateShortId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID().replace(/-/g, '').slice(0, SHORT_ID_LENGTH);\n }\n return Math.random()\n .toString(RANDOM_ID_RADIX)\n .slice(RANDOM_ID_SLICE_START, RANDOM_ID_SLICE_START + SHORT_ID_LENGTH);\n}\n\n/**\n * Generate a correlation ID for tracing.\n * Format: timestamp-randomString\n *\n * @returns A correlation ID string\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // => '1701475200000-x7k9m2'\n * ```\n */\nexport function generateCorrelationId(): string {\n return `${Date.now()}-${generateShortId()}`;\n}\n\n/**\n * Generate a trace ID for distributed tracing (32 hex characters / 128 bits).\n *\n * @returns A 32-character hex string\n *\n * @example\n * ```typescript\n * const traceId = generateTraceId();\n * // => 'a1b2c3d4e5f67890abcdef1234567890'\n * ```\n */\nexport function generateTraceId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use two UUIDs without dashes to get 64 hex chars, take first 32\n return cryptoApi.randomUUID().replace(/-/g, '');\n }\n // Fallback: concatenate two random hex strings\n return (\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END) +\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END)\n );\n}\n\n/**\n * Generate a span ID for distributed tracing (16 hex characters / 64 bits).\n *\n * @returns A 16-character hex string\n *\n * @example\n * ```typescript\n * const spanId = generateSpanId();\n * // => 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateSpanId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use UUID without dashes, take first 16 chars\n return cryptoApi.randomUUID().replace(/-/g, '').substring(0, SPAN_ID_LENGTH);\n }\n // Fallback: random hex string\n return Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END);\n}\n\n/**\n * UUID v4 regex pattern.\n * Matches standard UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n */\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Check if a string is a valid UUID v4.\n *\n * @param value - The string to check\n * @returns true if the string is a valid UUID\n *\n * @example\n * ```typescript\n * isValidUUID('a1b2c3d4-e5f6-4890-abcd-ef1234567890'); // true\n * isValidUUID('not-a-uuid'); // false\n * isValidUUID('bulk-upload-123456'); // false\n * ```\n */\nexport function isValidUUID(value: string | null | undefined): boolean {\n if (!value) return false;\n return UUID_REGEX.test(value);\n}\n\n/**\n * ID generation utilities object for convenient access.\n */\nexport const IdUtils = {\n generate: generateId,\n generateShort: generateShortId,\n generateCorrelation: generateCorrelationId,\n generateTraceId,\n generateSpanId,\n isValidUUID,\n} as const;\n","/* eslint-disable complexity */\n/**\n * Value Utilities\n *\n * Common utility functions for working with different value types.\n *\n * @fileoverview Value manipulation utilities\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS } from '@plyaz/config';\n\n/**\n * Determines if a value should be considered 'truthy' for feature flags.\n * More strict than JavaScript's built-in truthiness.\n *\n * @param value - The value to check\n * @returns true if the value is considered enabled/truthy\n *\n * @example\n * ```typescript\n * isTruthy(true) // true\n * isTruthy('enabled') // true\n * isTruthy('') // false\n * isTruthy('false') // false\n * isTruthy(0) // false\n * isTruthy(42) // true\n * isTruthy({}) // false\n * ```\n */\n// Helper function to check if a string is falsy\nfunction isStringFalsy(value: string): boolean {\n if (value === '') return true;\n const lower = value.toLowerCase().trim();\n return ['false', 'no', '0', 'off', 'disabled'].includes(lower);\n}\n\n// Helper function to check if an object is truthy\nfunction isObjectTruthy(value: object): boolean {\n if (Array.isArray(value)) return value.length > 0;\n if (value instanceof Map || value instanceof Set) return value.size > 0;\n if (value.constructor === Object) return Object.keys(value).length > 0;\n return true; // All other objects (Date, RegExp, etc) are truthy\n}\n\nexport function isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return !isStringFalsy(value);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'function':\n case 'symbol':\n return true;\n case 'object':\n return isObjectTruthy(value);\n default:\n return false;\n }\n}\n\n/**\n * Safely converts a value to a boolean with feature flag semantics.\n *\n * @param value - Value to convert\n * @param defaultValue - Default if conversion fails (default: false)\n * @returns Boolean representation\n *\n * @example\n * ```typescript\n * toBoolean('true') // true\n * toBoolean('yes') // true\n * toBoolean('1') // true\n * toBoolean('false') // false\n * toBoolean('no') // false\n * toBoolean('0') // false\n * ```\n */\n// Helper function to parse string to boolean\nfunction parseStringToBoolean(value: string, defaultValue: boolean): boolean {\n const lower = value.toLowerCase();\n if (['true', 'yes', '1', 'on', 'enabled'].includes(lower)) return true;\n if (['false', 'no', '0', 'off', 'disabled'].includes(lower)) return false;\n return defaultValue;\n}\n\nexport function toBoolean(value: unknown, defaultValue: boolean = false): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return parseStringToBoolean(value, defaultValue);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'object':\n case 'function':\n return true;\n default:\n return defaultValue;\n }\n}\n\n/**\n * Safely converts a value to a number.\n * Handles bigint, string, and number types.\n *\n * @param value - Value to convert (bigint, number, or string)\n * @param defaultValue - Default if conversion fails (default: 0)\n * @returns Number representation\n *\n * @example\n * ```typescript\n * toNumber(42) // 42\n * toNumber(BigInt(100)) // 100\n * toNumber('123') // 123\n * toNumber('invalid') // 0 (default)\n * toNumber('invalid', -1) // -1 (custom default)\n * ```\n */\nexport function toNumber(\n value: bigint | number | string | unknown,\n defaultValue: number = 0\n): number {\n if (value === null || value === undefined) return defaultValue;\n\n if (typeof value === 'bigint') return Number(value);\n if (typeof value === 'number') return isNaN(value) ? defaultValue : value;\n if (typeof value === 'string') {\n const parsed = Number.parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n }\n\n return defaultValue;\n}\n\n/**\n * Value validation and conversion utilities.\n */\nexport const ValueUtils = {\n /**\n * Checks if a value is a valid percentage (0-100).\n *\n * @param value - Value to check\n * @returns true if valid percentage\n */\n isValidPercentage: (value: unknown): boolean => {\n if (typeof value !== 'number') return false;\n return !isNaN(value) && isFinite(value) && value >= 0 && value <= MATH_CONSTANTS.PERCENTAGE_MAX;\n },\n\n /**\n * Clamps a number to a specific range.\n *\n * @param value - Value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns Clamped value\n */\n clamp: (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n },\n\n /**\n * Checks if a value is empty (null, undefined, empty string, empty array).\n *\n * @param value - Value to check\n * @returns true if empty\n */\n isEmpty: (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n },\n\n /**\n * Safely gets a nested property from an object.\n *\n * @param obj - Object to query\n * @param path - Dot-separated path (e.g., 'user.profile.name')\n * @param defaultValue - Default if path doesn't exist\n * @returns Property value or default\n */\n getNestedProperty: (obj: unknown, path: string, defaultValue?: unknown): unknown => {\n if (!obj || typeof obj !== 'object') return defaultValue;\n\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') return defaultValue;\n current = (current as Record<string, unknown>)[key];\n if (current === undefined) return defaultValue;\n }\n\n return current;\n },\n} as const;\n","/**\n * Object Utilities\n *\n * Provides utilities for working with nested object paths and property access.\n *\n * @fileoverview Object manipulation utilities\n */\n\n/**\n * Sets a value at a nested path in an object, creating intermediate objects as needed.\n *\n * @param obj - The target object to modify\n * @param path - Dot-separated path to the property (e.g., 'user.profile.name')\n * @param value - The value to set at the path\n *\n * @example\n * ```typescript\n * const obj = { user: { id: 1 } };\n * setNestedProperty(obj, 'user.profile.name', 'John');\n * // Result: { user: { id: 1, profile: { name: 'John' } } }\n * ```\n */\nexport function setNestedProperty(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): void {\n const keys = path.split('.');\n let current: Record<string, unknown> = obj;\n\n // Navigate to the parent object, creating intermediate objects as needed\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n // Set the final property\n const finalKey = keys[keys.length - 1];\n current[finalKey] = value;\n}\n\n/**\n * Gets a value at a nested path in an object.\n *\n * @param obj - The source object to read from\n * @param path - Dot-separated path to the property (e.g., 'user.profile.name')\n * @param defaultValue - Optional default value if the path doesn't exist\n * @returns The value at the path, or defaultValue if not found\n *\n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * getNestedProperty(obj, 'user.profile.name'); // 'John'\n * getNestedProperty(obj, 'user.settings.theme', 'dark'); // 'dark' (default)\n * ```\n */\nexport function getNestedProperty<T = unknown>(\n obj: Record<string, unknown>,\n path: string,\n defaultValue?: T\n): T | undefined {\n const keys = path.split('.');\n let current: unknown = obj;\n\n // Navigate through the path\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return defaultValue;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current !== undefined ? (current as T) : defaultValue;\n}\n\n/**\n * Checks if a nested path exists in an object.\n *\n * @param obj - The object to check\n * @param path - Dot-separated path to check (e.g., 'user.profile.name')\n * @returns True if the path exists and is not undefined\n *\n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * hasNestedProperty(obj, 'user.profile.name'); // true\n * hasNestedProperty(obj, 'user.settings.theme'); // false\n * ```\n */\nexport function hasNestedProperty(obj: Record<string, unknown>, path: string): boolean {\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return false;\n }\n if (!(key in (current as Record<string, unknown>))) {\n return false;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current !== undefined;\n}\n\n/**\n * Object utilities namespace for convenient grouped access.\n *\n * @example\n * ```typescript\n * import { ObjectUtils } from '@plyaz/core/utils';\n *\n * ObjectUtils.setNestedProperty(obj, 'user.name', 'John');\n * const name = ObjectUtils.getNestedProperty(obj, 'user.name');\n * ```\n */\nexport const ObjectUtils = {\n setNestedProperty,\n getNestedProperty,\n hasNestedProperty,\n} as const;\n","/**\n * Type Guards Utilities\n *\n * Common type guard functions for runtime type checking.\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Generic Type Guards\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Check if value is a non-null object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Check if object has a specific property\n */\nexport function hasProperty<K extends string>(obj: unknown, key: K): obj is Record<K, unknown> {\n return isObject(obj) && key in obj;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Type Guard Utilities Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Type guard utilities grouped in a class for namespaced access\n */\nexport const TypeGuardUtils = {\n isObject,\n hasProperty,\n} as const;\n","/**\n * Validation Utility Functions\n */\n\nimport { FEATURE_FLAG_PROVIDERS } from '@plyaz/types';\n\n/**\n * Type guard to check if value is string\n */\nexport const isString = (value: unknown): value is string => typeof value === 'string';\n\n/**\n * Type guard to check if value is defined (not undefined)\n */\nexport const isDefined = <T>(value: T | undefined): value is T => value !== undefined;\n\n/**\n * Type guard to check if value is number\n */\nexport const isNumber = (value: unknown): value is number => typeof value === 'number';\n\n/**\n * Helper function to get all valid provider types as array\n */\nexport const getValidProviders = (): string[] => Object.values(FEATURE_FLAG_PROVIDERS);\n","/**\n * Feature Flag Context Utilities\n *\n * Utilities for building, validating, and manipulating feature flag contexts.\n *\n * @fileoverview Feature flag context utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagContext } from '@plyaz/types';\nimport { ISO_STANDARDS } from '@plyaz/config';\n\n/**\n * Builder class for creating feature flag evaluation contexts.\n * Provides a fluent interface for setting context properties.\n *\n * @class FeatureFlagContextBuilder\n *\n * @example\n * ```typescript\n * const context = new FeatureFlagContextBuilder()\n * .setUserId('user123')\n * .setUserRole('premium')\n * .setEnvironment('production')\n * .setPlatform('web')\n * .setCustom({ subscription: 'premium', betaTester: true })\n * .build();\n * ```\n */\nexport class FeatureFlagContextBuilder {\n private context: Partial<FeatureFlagContext> = {};\n\n /**\n * Sets the user ID in the context.\n *\n * @param userId - User identifier\n * @returns Builder instance for chaining\n */\n setUserId(userId: string): this {\n this.context.userId = userId;\n return this;\n }\n\n /**\n * Sets the user email in the context.\n *\n * @param userEmail - User email address\n * @returns Builder instance for chaining\n */\n setUserEmail(userEmail: string): this {\n this.context.userEmail = userEmail;\n return this;\n }\n\n /**\n * Sets the user role in the context.\n *\n * @param userRole - User role or permission level\n * @returns Builder instance for chaining\n */\n setUserRole(userRole: string): this {\n this.context.userRole = userRole;\n return this;\n }\n\n /**\n * Sets the country in the context.\n *\n * @param country - Country code (ISO 3166-1 alpha-2)\n * @returns Builder instance for chaining\n */\n setCountry(country: string): this {\n this.context.country = country;\n return this;\n }\n\n /**\n * Sets the platform in the context.\n *\n * @param platform - Platform type\n * @returns Builder instance for chaining\n */\n setPlatform(platform: 'web' | 'mobile' | 'desktop'): this {\n this.context.platform = platform;\n return this;\n }\n\n /**\n * Sets the version in the context.\n *\n * @param version - Application version\n * @returns Builder instance for chaining\n */\n setVersion(version: string): this {\n this.context.version = version;\n return this;\n }\n\n /**\n * Sets the environment in the context.\n *\n * @param environment - Current environment\n * @returns Builder instance for chaining\n */\n setEnvironment(environment: 'development' | 'staging' | 'production'): this {\n this.context.environment = environment;\n return this;\n }\n\n /**\n * Sets custom context data.\n *\n * @param custom - Custom context properties\n * @returns Builder instance for chaining\n */\n setCustom(custom: Record<string, unknown>): this {\n this.context.custom = { ...this.context.custom, ...custom };\n return this;\n }\n\n /**\n * Adds a single custom property to the context.\n *\n * @param key - Custom property key\n * @param value - Custom property value\n * @returns Builder instance for chaining\n */\n addCustomProperty(key: string, value: unknown): this {\n this.context.custom ??= {};\n this.context.custom[key] = value;\n return this;\n }\n\n /**\n * Builds the final context object.\n * Validates required fields and returns the context.\n *\n * @returns Complete feature flag context\n * @throws Error if required environment is not set\n */\n build(): FeatureFlagContext {\n return {\n environment: this.context.environment ?? 'development',\n userId: this.context.userId,\n userEmail: this.context.userEmail,\n userRole: this.context.userRole,\n country: this.context.country,\n platform: this.context.platform,\n version: this.context.version,\n custom: this.context.custom,\n } satisfies FeatureFlagContext;\n }\n\n /**\n * Clears all context data and resets the builder.\n *\n * @returns Builder instance for chaining\n */\n clear(): this {\n this.context = {};\n return this;\n }\n\n /**\n * Creates a copy of the current builder state.\n *\n * @returns New builder instance with copied context\n */\n clone(): FeatureFlagContextBuilder {\n const cloned = new FeatureFlagContextBuilder();\n cloned.context = { ...this.context };\n if (this.context.custom) {\n cloned.context.custom = { ...this.context.custom };\n }\n return cloned;\n }\n}\n\n/**\n * Context utilities for common scenarios.\n */\nexport const ContextUtils = {\n /**\n * Creates a basic context for anonymous users using the builder.\n *\n * @param environment - Target environment\n * @param platform - User platform\n * @returns Basic anonymous context\n */\n createAnonymousContext(\n environment: 'development' | 'staging' | 'production',\n platform: 'web' | 'mobile' | 'desktop' = 'web'\n ): FeatureFlagContext {\n return new FeatureFlagContextBuilder()\n .setEnvironment(environment)\n .setPlatform(platform)\n .build();\n },\n\n /**\n * Creates a context for authenticated users using the builder.\n *\n * @param params - User context parameters\n * @returns User context\n */\n createUserContext(params: {\n userId: string;\n environment: 'development' | 'staging' | 'production';\n userEmail?: string;\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n }): FeatureFlagContext {\n const builder = new FeatureFlagContextBuilder()\n .setUserId(params.userId)\n .setEnvironment(params.environment);\n\n if (params.userEmail) builder.setUserEmail(params.userEmail);\n if (params.userRole) builder.setUserRole(params.userRole);\n if (params.platform) builder.setPlatform(params.platform);\n if (params.country) builder.setCountry(params.country);\n if (params.version) builder.setVersion(params.version);\n if (params.custom) builder.setCustom(params.custom);\n\n return builder.build();\n },\n\n /**\n * Creates a testing context with minimal required fields.\n *\n * @param overrides - Optional context overrides\n * @returns Testing context\n */\n createTestingContext(overrides: Partial<FeatureFlagContext> = {}): FeatureFlagContext {\n return {\n environment: 'development',\n platform: 'web',\n ...overrides,\n };\n },\n\n /**\n * Validates if a context object is complete and valid.\n *\n * @param context - Context to validate\n * @returns Validation result\n */\n validateContext(context: Partial<FeatureFlagContext>): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (!context.environment) {\n errors.push('Environment is required');\n } else if (!['development', 'staging', 'production'].includes(context.environment)) {\n errors.push('Environment must be development, staging, or production');\n }\n\n if (context.platform && !['web', 'mobile', 'desktop'].includes(context.platform)) {\n errors.push('Platform must be web, mobile, or desktop');\n }\n\n if (context.country && context.country.length !== ISO_STANDARDS.ISO_COUNTRY_CODE_LENGTH) {\n errors.push('Country must be a 2-letter ISO country code');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Merges multiple context objects, with later contexts taking precedence.\n *\n * @param contexts - Array of contexts to merge\n * @returns Merged context\n */\n mergeContexts(...contexts: Partial<FeatureFlagContext>[]): FeatureFlagContext {\n const merged = contexts.reduce((acc, context) => {\n const result = {\n ...acc,\n ...context,\n };\n\n // Only merge custom if either has it\n if (acc.custom || context.custom) {\n result.custom = {\n ...acc.custom,\n ...context.custom,\n };\n }\n\n return result;\n }, {} as Partial<FeatureFlagContext>);\n\n merged.environment ??= 'development';\n\n return merged as FeatureFlagContext;\n },\n\n /**\n * Extracts a specific field value from a context.\n *\n * @param field - Field name to extract\n * @param context - Context object\n * @returns Field value or undefined\n */\n getContextValue(field: string, context: FeatureFlagContext): unknown {\n const standardFields = {\n userId: (ctx: FeatureFlagContext) => ctx.userId,\n userEmail: (ctx: FeatureFlagContext) => ctx.userEmail,\n userRole: (ctx: FeatureFlagContext) => ctx.userRole,\n country: (ctx: FeatureFlagContext) => ctx.country,\n platform: (ctx: FeatureFlagContext) => ctx.platform,\n version: (ctx: FeatureFlagContext) => ctx.version,\n environment: (ctx: FeatureFlagContext) => ctx.environment,\n custom: (ctx: FeatureFlagContext) => ctx.custom,\n };\n\n if (field in standardFields) {\n return standardFields[field as keyof typeof standardFields](context);\n }\n\n return context.custom?.[field];\n },\n\n /**\n * Creates a context fingerprint for caching and consistency.\n *\n * @param context - Context to fingerprint\n * @returns String fingerprint\n */\n createFingerprint(context: FeatureFlagContext): string {\n const relevant = {\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n custom: context.custom,\n };\n\n // Filter out undefined values and sort keys for consistency\n const filtered = Object.entries(relevant)\n .filter(([, value]) => value !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\n\n return JSON.stringify(filtered);\n },\n\n /**\n * Sanitizes a context by removing sensitive information.\n *\n * @param context - Context to sanitize\n * @param sensitiveFields - Fields to remove (default: ['userEmail'])\n * @returns Sanitized context\n */\n sanitizeContext(\n context: FeatureFlagContext,\n sensitiveFields: string[] = ['userEmail']\n ): FeatureFlagContext {\n const sanitized = { ...context };\n\n // Deep copy custom object if it exists\n if (context.custom) {\n sanitized.custom = { ...context.custom };\n }\n\n for (const field of sensitiveFields) {\n if (field in sanitized) {\n delete (sanitized as Record<string, unknown>)[field];\n }\n if (sanitized.custom && field in sanitized.custom) {\n delete sanitized.custom[field];\n }\n }\n\n return sanitized;\n },\n} as const;\n\n/**\n * Utility for creating feature flag context for backend applications.\n *\n * @param params - Context parameters\n * @returns Backend-optimized feature flag context\n */\nexport function createBackendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'api',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n\n/**\n * Utility for creating feature flag context for frontend applications.\n *\n * @param params - Context parameters\n * @returns Frontend-optimized feature flag context\n */\nexport function createFrontendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'web',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n","/**\n * Feature Flag Condition Utilities\n *\n * Utilities for evaluating feature flag conditions and rules.\n *\n * @fileoverview Condition evaluation utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagCondition } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\n\n/**\n * Evaluates condition operator against context value.\n *\n * @param condition - The condition to evaluate\n * @param contextValue - The context value to check against\n * @returns true if the condition matches\n */\nexport function evaluateConditionOperator(\n condition: FeatureFlagCondition,\n contextValue: unknown\n): boolean {\n const { operator } = condition;\n\n if (isEqualityOperator(operator)) {\n return evaluateEqualityOperator(operator, contextValue, condition.value);\n }\n\n if (isStringOperator(operator)) {\n return evaluateStringOperator(operator, contextValue, condition.value);\n }\n\n if (isArrayOperator(operator)) {\n return evaluateArrayOperator(operator, condition.value, contextValue);\n }\n\n if (isNumericOperator(operator)) {\n return evaluateNumericOperator(operator, contextValue, condition.value);\n }\n\n return false;\n}\n\n/**\n * Checks if operator is equality-based.\n *\n * @param operator - The operator to check\n * @returns true if equality operator\n */\nexport function isEqualityOperator(operator: string): boolean {\n return operator === 'equals' || operator === 'not_equals';\n}\n\n/**\n * Checks if operator is string-based.\n *\n * @param operator - The operator to check\n * @returns true if string operator\n */\nexport function isStringOperator(operator: string): boolean {\n return operator === 'contains' || operator === 'not_contains';\n}\n\n/**\n * Checks if operator is array-based.\n *\n * @param operator - The operator to check\n * @returns true if array operator\n */\nexport function isArrayOperator(operator: string): boolean {\n return operator === 'in' || operator === 'not_in';\n}\n\n/**\n * Checks if operator is numeric-based.\n *\n * @param operator - The operator to check\n * @returns true if numeric operator\n */\nexport function isNumericOperator(operator: string): boolean {\n return operator === 'greater_than' || operator === 'less_than';\n}\n\n/**\n * Evaluates equality operators.\n *\n * @param operator - equals or not_equals\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateEqualityOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n const isEqual = contextValue === conditionValue;\n return operator === 'equals' ? isEqual : !isEqual;\n}\n\n/**\n * Evaluates string operators.\n *\n * @param operator - contains or not_contains\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateStringOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Handle string contains\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // Handle array contains\n if (Array.isArray(contextValue) && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // For not_contains, if neither string nor array match, return true\n return operator === 'not_contains';\n}\n\n/**\n * Evaluates array operators.\n *\n * @param operator - in or not_in\n * @param conditionValue - Array value from condition\n * @param contextValue - Value from context\n * @returns Evaluation result\n */\nexport function evaluateArrayOperator(\n operator: string,\n conditionValue: unknown,\n contextValue: unknown\n): boolean {\n if (!Array.isArray(conditionValue)) {\n // For not_in operator, if condition value is not an array, return true\n return operator === 'not_in';\n }\n\n const isIncluded = conditionValue.includes(contextValue);\n return operator === 'in' ? isIncluded : !isIncluded;\n}\n\n/**\n * Evaluates numeric operators.\n *\n * @param operator - greater_than or less_than\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nfunction compareValues<T>(operator: string, left: T, right: T): boolean {\n switch (operator) {\n case 'greater_than':\n return left > right;\n case 'less_than':\n return left < right;\n default:\n return false;\n }\n}\n\nexport function evaluateNumericOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Try numeric comparison first\n const contextNum = Number(contextValue);\n const conditionNum = Number(conditionValue);\n\n if (!isNaN(contextNum) && !isNaN(conditionNum)) {\n return compareValues(operator, contextNum, conditionNum);\n }\n\n // Fall back to string comparison for non-numeric values\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n return compareValues(operator, contextValue, conditionValue);\n }\n\n return false;\n}\n\n/**\n * Condition evaluation utilities.\n */\nexport const ConditionUtils = {\n /**\n * Evaluates multiple conditions with AND logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if all conditions match\n */\n evaluateConditionsAnd: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.every(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Evaluates multiple conditions with OR logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if any condition matches\n */\n evaluateConditionsOr: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.some(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Validates a condition structure.\n *\n * @param condition - Condition to validate\n * @returns Validation result\n */\n validateCondition: (\n condition: Partial<FeatureFlagCondition>\n ): {\n isValid: boolean;\n errors: string[];\n } => {\n const errors: string[] = [];\n\n if (!condition.field) {\n errors.push('Field is required');\n }\n\n if (!condition.operator) {\n errors.push('Operator is required');\n } else {\n const validOperators = [\n 'equals',\n 'not_equals',\n 'contains',\n 'not_contains',\n 'in',\n 'not_in',\n 'greater_than',\n 'less_than',\n ];\n if (!validOperators.includes(condition.operator)) {\n errors.push(`Invalid operator: ${condition.operator}`);\n }\n }\n\n if (condition.value === undefined) {\n errors.push('Value is required');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Creates a condition object with validation.\n *\n * @param field - Context field to evaluate\n * @param operator - Comparison operator\n * @param value - Value to compare against\n * @returns Valid condition object\n */\n createCondition: (\n field: string,\n operator: FeatureFlagCondition['operator'],\n value: FeatureFlagCondition['value']\n ): FeatureFlagCondition => {\n const condition = { field, operator, value } as FeatureFlagCondition;\n const validation = ConditionUtils.validateCondition(condition);\n\n if (!validation.isValid) {\n throw new CorePackageError(\n `Invalid condition: ${validation.errors.join(', ')}`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n\n return condition;\n },\n} as const;\n","/**\n * Runtime Detection Utilities\n *\n * Utilities for detecting the current JavaScript runtime environment.\n */\n\nimport type { CoreRuntimeEnvironment } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\n// Type-safe access to alternative runtime globals\nconst getGlobalProperty = (key: string): unknown => {\n return (globalThis as Record<string, unknown>)[key];\n};\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'Runtime' });\n\n/**\n * Check if a module is available via require.resolve\n */\nfunction isModuleAvailable(moduleName: string): boolean {\n const nodeRequire = globalThis.require;\n if (!nodeRequire) return false;\n\n const resolveModule = nodeRequire.resolve;\n if (!resolveModule) return false;\n\n try {\n resolveModule(moduleName);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check for alternative runtimes (Deno, Bun) */\nfunction detectAltRuntime(): CoreRuntimeEnvironment | null {\n if (typeof getGlobalProperty('Deno') !== 'undefined') return 'deno';\n if (typeof getGlobalProperty('Bun') !== 'undefined') return 'bun';\n return null;\n}\n\n/** Check for edge runtime */\nfunction detectEdgeRuntime(): CoreRuntimeEnvironment | null {\n if (typeof getGlobalProperty('EdgeRuntime') !== 'undefined') return 'edge';\n const isEdgeLike =\n typeof globalThis.caches !== 'undefined' &&\n typeof globalThis.Request !== 'undefined' &&\n typeof process === 'undefined';\n return isEdgeLike ? 'edge' : null;\n}\n\n/** Check for browser environment */\nfunction detectBrowser(): CoreRuntimeEnvironment | null {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n return null;\n}\n\n/** Check for Node.js framework */\nfunction detectNodeFramework(): CoreRuntimeEnvironment {\n // Check for Nuxt (SSR)\n if (process.env.__NUXT__ || process.env.NUXT_APP) return 'nuxt';\n // Check for Next.js (SSR)\n if (process.env.__NEXT_PRIVATE_ORIGIN || process.env.NEXT_RUNTIME) return 'nextjs';\n // Check for NestJS via module detection\n if (isModuleAvailable('@nestjs/core')) return 'nestjs';\n // Check for Express via module detection\n if (isModuleAvailable('express')) return 'express';\n return 'node';\n}\n\n/**\n * Detect the current runtime environment\n */\nexport function detectRuntime(): CoreRuntimeEnvironment {\n // Check alternative runtimes first\n const altRuntime = detectAltRuntime();\n if (altRuntime) return altRuntime;\n\n // Check for edge runtime\n const edgeRuntime = detectEdgeRuntime();\n if (edgeRuntime) return edgeRuntime;\n\n // Check for browser\n const browser = detectBrowser();\n if (browser) return browser;\n\n // Server-side detection (Node.js based)\n if (typeof process !== 'undefined' && process.versions?.node) {\n return detectNodeFramework();\n }\n\n return 'unknown';\n}\n\n/**\n * Load environment variables from a .env file\n */\nexport async function loadEnvFile(envPath: string, verbose?: boolean): Promise<void> {\n try {\n const dotenv = await import('dotenv');\n const result = dotenv.config({ path: envPath });\n\n if (result.error) {\n logger.warn(`Failed to load env file: ${result.error.message}`);\n } else if (verbose) {\n logger.info(`Loaded env from: ${envPath}`);\n }\n } catch {\n logger.warn('dotenv not available, skipping .env file loading');\n }\n}\n","/**\n * ============================================================================\n * FILE OPERATION UTILITIES\n * ============================================================================\n *\n * Framework-agnostic utilities for common file operations:\n * - Base64 encoding/decoding\n * - Blob creation and download triggering\n * - File key parsing\n * - Filename generation\n *\n * These utilities work in both browser and Node.js environments.\n */\n\nimport {\n MIME_TYPE_EXTENSIONS,\n FILE_SIZE_UNITS,\n FILE_SIZE_MULTIPLIERS,\n type ParsedFileKey,\n} from '@plyaz/types/core';\n\n// File key path segment counts\nconst FILE_KEY_FULL_PATH_SEGMENTS = 4;\nconst FILE_KEY_THREE_SEGMENTS = 3;\nconst FILE_KEY_TWO_SEGMENTS = 2;\nconst MIME_TYPE_PARTS = 2;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BASE64 CONVERSION\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Convert a File to base64 string (browser only).\n *\n * @param file - The File object to convert\n * @returns Promise resolving to base64 encoded string (without data URL prefix)\n *\n * @example\n * ```typescript\n * const base64 = await fileToBase64(file);\n * // Use for API upload\n * ```\n */\nexport function fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n // Remove data URL prefix (e.g., \"data:application/pdf;base64,\")\n const base64 = result.split(',')[1] || result;\n resolve(base64);\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Convert a base64 string to a Blob (browser only).\n *\n * @param base64 - The base64 encoded string\n * @param mimeType - The MIME type for the blob (default: 'application/octet-stream')\n * @returns A Blob containing the decoded data\n *\n * @example\n * ```typescript\n * const blob = base64ToBlob(downloadResult.buffer, 'application/pdf');\n * downloadBlob(blob, 'document.pdf');\n * ```\n */\nexport function base64ToBlob(base64: string, mimeType = 'application/octet-stream'): Blob {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new Blob([bytes], { type: mimeType });\n}\n\n/**\n * Convert a base64 string to a Buffer (Node.js only).\n *\n * @param base64 - The base64 encoded string\n * @returns A Buffer containing the decoded data\n *\n * @example\n * ```typescript\n * const buffer = base64ToBuffer(encodedData);\n * fs.writeFileSync('output.pdf', buffer);\n * ```\n */\nexport function base64ToBuffer(base64: string): Buffer {\n return Buffer.from(base64, 'base64');\n}\n\n/**\n * Convert a Buffer or Uint8Array to a base64 string.\n *\n * @param data - The binary data to encode\n * @returns The base64 encoded string\n *\n * @example\n * ```typescript\n * const base64 = bufferToBase64(fileBuffer);\n * ```\n */\nexport function bufferToBase64(data: Buffer | Uint8Array): string {\n if (Buffer.isBuffer(data)) {\n return data.toString('base64');\n }\n return Buffer.from(data).toString('base64');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BROWSER DOWNLOAD\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Trigger a browser download of a Blob.\n *\n * Creates a temporary anchor element to trigger the download,\n * then cleans up the object URL.\n *\n * @param blob - The Blob to download\n * @param filename - The filename to save as\n *\n * @example\n * ```typescript\n * const blob = base64ToBlob(data, 'application/pdf');\n * downloadBlob(blob, 'invoice.pdf');\n * ```\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n // Browser-only function - check if we're in a browser environment\n const win = globalThis as typeof globalThis & { document?: Document };\n if (!win.document) return;\n\n const url = URL.createObjectURL(blob);\n const a = win.document.createElement('a');\n a.href = url;\n a.download = filename;\n win.document.body.appendChild(a);\n a.click();\n win.document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Download a base64-encoded file in the browser.\n * Combines base64ToBlob and downloadBlob for convenience.\n *\n * @param base64 - The base64 encoded data\n * @param filename - The filename to save as\n * @param mimeType - The MIME type (default: 'application/octet-stream')\n *\n * @example\n * ```typescript\n * downloadBase64(response.data, 'report.pdf', 'application/pdf');\n * ```\n */\nexport function downloadBase64(\n base64: string,\n filename: string,\n mimeType = 'application/octet-stream'\n): void {\n const blob = base64ToBlob(base64, mimeType);\n downloadBlob(blob, filename);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILE KEY PARSING\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse a storage file key into its components.\n *\n * Supports various key formats:\n * - `entityType/entityId/category/filename`\n * - `entityType/entityId/filename`\n * - `category/filename`\n * - `filename`\n *\n * @param key - The storage key to parse\n * @returns Parsed components\n *\n * @example\n * ```typescript\n * const parsed = parseFileKey('user/123/documents/invoice.pdf');\n * // { entityType: 'user', entityId: '123', category: 'documents', filename: 'invoice.pdf' }\n * ```\n */\nexport function parseFileKey(key: string): ParsedFileKey {\n const parts = key.split('/');\n const result: ParsedFileKey = { raw: key };\n\n if (parts.length >= FILE_KEY_FULL_PATH_SEGMENTS) {\n // Full path: entityType/entityId/category/filename\n result.entityType = parts[0];\n result.entityId = parts[1];\n result.category = parts[2];\n result.filename = parts.slice(FILE_KEY_THREE_SEGMENTS).join('/');\n } else if (parts.length === FILE_KEY_THREE_SEGMENTS) {\n // entityType/entityId/filename or category/subcategory/filename\n result.entityType = parts[0];\n result.entityId = parts[1];\n result.filename = parts[FILE_KEY_TWO_SEGMENTS];\n } else if (parts.length === FILE_KEY_TWO_SEGMENTS) {\n // category/filename\n result.category = parts[0];\n result.filename = parts[1];\n } else {\n // Just filename\n result.filename = parts[0];\n }\n\n return result;\n}\n\n/**\n * Extract just the filename from a file key or path.\n *\n * @param key - The file key or path\n * @returns The filename portion\n *\n * @example\n * ```typescript\n * getFilenameFromKey('user/123/docs/invoice.pdf'); // 'invoice.pdf'\n * ```\n */\nexport function getFilenameFromKey(key: string): string {\n return key.split('/').pop() ?? key;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILENAME GENERATION\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate a filename from a template ID and output format.\n *\n * @param templateId - The template ID (may include path separators)\n * @param outputFormat - The desired output format (e.g., 'pdf', 'docx')\n * @returns A generated filename\n *\n * @example\n * ```typescript\n * generateFilename('invoices/default', 'pdf');\n * // 'default.pdf'\n * ```\n */\nexport function generateFilename(templateId: string, outputFormat: string): string {\n const baseName = templateId.split('/').pop() ?? 'document';\n return `${baseName}.${outputFormat}`;\n}\n\n/**\n * Generate a unique filename with timestamp.\n *\n * @param prefix - Filename prefix (default: 'file')\n * @param extension - File extension (default: 'bin')\n * @returns A unique filename\n *\n * @example\n * ```typescript\n * generateUniqueFilename('download', 'pdf');\n * // 'download-1704067200000.pdf'\n * ```\n */\nexport function generateUniqueFilename(prefix = 'file', extension = 'bin'): string {\n return `${prefix}-${Date.now()}.${extension}`;\n}\n\n/**\n * Infer file extension from MIME type.\n *\n * @param mimeType - The MIME type\n * @returns The inferred extension (without dot)\n *\n * @example\n * ```typescript\n * inferExtensionFromMimeType('application/pdf'); // 'pdf'\n * inferExtensionFromMimeType('image/png'); // 'png'\n * ```\n */\nexport function inferExtensionFromMimeType(mimeType: string): string {\n // Check exact match first using shared constants\n if (MIME_TYPE_EXTENSIONS[mimeType]) {\n return MIME_TYPE_EXTENSIONS[mimeType];\n }\n\n // Fallback: try to extract from mime type (e.g., 'image/png' -> 'png')\n const parts = mimeType.split('/');\n if (parts.length === MIME_TYPE_PARTS) {\n return parts[1].split(';')[0].trim();\n }\n\n return 'bin';\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILE SIZE FORMATTING\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Format file size in human-readable format.\n *\n * @param bytes - Size in bytes\n * @param decimals - Number of decimal places (default: 2)\n * @returns Formatted size string\n *\n * @example\n * ```typescript\n * formatFileSize(1024); // '1 KB'\n * formatFileSize(1536000); // '1.46 MB'\n * ```\n */\nexport function formatFileSize(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const size = Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n\n return `${size} ${FILE_SIZE_UNITS[i]}`;\n}\n\n/**\n * Parse a human-readable file size to bytes.\n *\n * @param sizeString - Size string (e.g., '1.5 MB', '100KB')\n * @returns Size in bytes\n *\n * @example\n * ```typescript\n * parseFileSize('1.5 MB'); // 1572864\n * parseFileSize('100KB'); // 102400\n * ```\n */\nexport function parseFileSize(sizeString: string): number {\n const match = sizeString.trim().match(/^([\\d.]+)\\s*([A-Z]+)$/i);\n if (!match) {\n return Number.parseInt(sizeString, 10) || 0;\n }\n\n const value = Number.parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n\n return Math.round(value * (FILE_SIZE_MULTIPLIERS[unit] ?? 1));\n}\n","/**\n * HMR-Safe Singleton Helper\n *\n * Creates singletons that persist across Next.js Hot Module Replacement (HMR).\n * Uses globalThis to store state so it survives code reloads in development.\n *\n * @example Core initialization\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import { Core, backendConfig } from '@plyaz/core/backend';\n *\n * export const getServerCore = createHmrSafeSingleton('core', async () => {\n * await Core.initialize(backendConfig);\n * return Core;\n * });\n *\n * // Usage in API routes\n * export async function GET() {\n * const core = await getServerCore();\n * // core.db, core.cache, etc.\n * }\n * ```\n *\n * @example Database connection\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n *\n * export const getDb = createHmrSafeSingleton('db', async () => {\n * const client = postgres(process.env.DATABASE_URL);\n * return drizzle(client);\n * });\n * ```\n *\n * @example Cache client\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import Redis from 'ioredis';\n *\n * export const getRedis = createHmrSafeSingleton('redis', async () => {\n * return new Redis(process.env.REDIS_URL);\n * });\n * ```\n */\n\nimport type { HmrSingletonOptions, HmrSingletonAccessor } from '@plyaz/types/core';\n\n// Re-export types for convenience\nexport type { HmrSingletonOptions, HmrSingletonAccessor } from '@plyaz/types/core';\n\n// Global storage key prefix\nconst GLOBAL_PREFIX = '__plyaz_hmr_singleton__';\n\n/**\n * Type guard to check if an object has a reset method\n */\nfunction hasResetMethod(obj: unknown): obj is { reset: () => Promise<void> } {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n 'reset' in obj &&\n typeof (obj as Record<string, unknown>).reset === 'function'\n );\n}\n\n/**\n * Create an HMR-safe singleton accessor.\n *\n * The singleton will persist across Next.js Hot Module Replacement in development,\n * preventing re-initialization on every code change.\n *\n * @param key - Unique key for this singleton (e.g., 'core', 'db', 'redis')\n * @param initializer - Async function that creates the singleton instance\n * @param options - Optional callbacks for lifecycle events\n * @returns Accessor function and utilities\n *\n * @example\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n *\n * const getCore = createHmrSafeSingleton('core', async () => {\n * await Core.initialize(config);\n * return Core;\n * });\n *\n * // In your API route or server component:\n * const core = await getCore();\n *\n * // Check if initialized:\n * if (getCore.isInitialized()) {\n * // Already initialized\n * }\n *\n * // Reset (for testing):\n * await getCore.reset();\n * ```\n */\nexport function createHmrSafeSingleton<T>(\n key: string,\n initializer: () => Promise<T>,\n options: HmrSingletonOptions = {}\n): HmrSingletonAccessor<T> {\n const { onInitialized, onError, onReset } = options;\n\n // Create unique global keys\n const instanceKey = `${GLOBAL_PREFIX}${key}_instance`;\n const promiseKey = `${GLOBAL_PREFIX}${key}_promise`;\n const initializedKey = `${GLOBAL_PREFIX}${key}_initialized`;\n\n // Type-safe global access\n const g = globalThis as unknown as Record<string, unknown>;\n\n // Helper functions for state management\n function getInstance(): T | undefined {\n return g[instanceKey] as T | undefined;\n }\n\n function setInstance(instance: T): void {\n g[instanceKey] = instance;\n }\n\n function clearInstance(): void {\n delete g[instanceKey];\n }\n\n function getPromise(): Promise<T> | undefined {\n return g[promiseKey] as Promise<T> | undefined;\n }\n\n function setPromise(promise: Promise<T> | null): void {\n if (promise === null) {\n delete g[promiseKey];\n } else {\n g[promiseKey] = promise;\n }\n }\n\n function isInit(): boolean {\n return g[initializedKey] === true;\n }\n\n function setInit(value: boolean): void {\n g[initializedKey] = value;\n }\n\n /**\n * Get the singleton instance, initializing if necessary\n */\n async function accessor(): Promise<T> {\n // Already initialized - return cached instance\n if (isInit()) {\n const instance = getInstance();\n if (instance !== undefined) {\n return instance;\n }\n }\n\n // Initialization in progress - wait for it\n const existingPromise = getPromise();\n if (existingPromise) {\n return existingPromise;\n }\n\n // Start initialization\n const initPromise = (async () => {\n try {\n const instance = await initializer();\n setInstance(instance);\n setInit(true);\n onInitialized?.();\n return instance;\n } catch (err) {\n // Reset on failure so next call can retry\n setPromise(null);\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n throw error;\n }\n })();\n\n setPromise(initPromise);\n return initPromise;\n }\n\n /**\n * Check if the singleton is initialized\n */\n accessor.isInitialized = (): boolean => isInit();\n\n /**\n * Reset the singleton (for testing or cleanup)\n */\n accessor.reset = async (): Promise<void> => {\n if (isInit()) {\n // Call cleanup if the instance has a reset method\n const instance = getInstance();\n if (hasResetMethod(instance)) {\n await instance.reset();\n }\n\n clearInstance();\n setInit(false);\n setPromise(null);\n onReset?.();\n }\n };\n\n return accessor;\n}\n"]}