@attrx/role-morphic 0.1.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/RoleMorphic.ts","../src/contracts/IVariant.ts","../src/contracts/SimpleRole.ts","../src/contracts/ComplexRole.ts","../src/roles/area/constants.ts","../src/roles/area/AreaRole.ts","../src/roles/length/constants.ts","../src/roles/length/LengthRole.ts","../src/roles/mass/constants.ts","../src/roles/mass/MassRole.ts","../src/roles/temperature/constants.ts","../src/roles/temperature/TemperatureRole.ts","../src/roles/angle/constants.ts","../src/roles/angle/AngleRole.ts","../src/roles/energy/constants.ts","../src/roles/energy/EnergyRole.ts","../src/roles/power/constants.ts","../src/roles/power/PowerRole.ts","../src/roles/speed/constants.ts","../src/roles/speed/SpeedRole.ts","../src/roles/date/variants/IsoVariant.ts","../src/roles/date/variants/TimestampVariant.ts","../src/roles/date/variants/EpochVariant.ts","../src/roles/date/DateRole.ts","../src/roles/volume/constants.ts","../src/roles/volume/VolumeRole.ts","../src/roles/time/constants.ts","../src/roles/time/TimeRole.ts","../src/roles/digital/constants.ts","../src/roles/digital/DigitalRole.ts","../src/roles/frequency/constants.ts","../src/roles/frequency/FrequencyRole.ts","../src/roles/pressure/constants.ts","../src/roles/pressure/PressureRole.ts","../src/roles/color/types.ts","../src/roles/color/variants/HexVariant.ts","../src/roles/color/variants/RgbObjectVariant.ts","../src/roles/color/variants/RgbStringVariant.ts","../src/roles/color/variants/HslObjectVariant.ts","../src/roles/color/variants/HslStringVariant.ts","../src/roles/color/ColorRole.ts"],"names":["p","q"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * RoleMorphic\n *\n * Motor de conversão polimórfica de valores.\n * Permite que um valor assuma múltiplas formas (variantes) mantendo sua identidade semântica.\n *\n * Arquitetura Hub-and-Spoke:\n * - Cada role tem uma variante BASE que serve como pivot\n * - Toda conversão passa pela base: origem -> base -> destino\n * - Isso reduz a complexidade de N² para 2N conversões\n */\n\nimport {\n RoleSpec,\n VariantSpec,\n ParsedVariantId,\n ConversionResult,\n ReversibilityResult,\n MorpherFn,\n MorpherSpec,\n} from \"./types\";\n\nexport class RoleMorphic {\n /** Registry de roles */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private roles = new Map<string, RoleSpec<any>>();\n\n /** Registry de morphers (transformações cross-role) */\n private morphers = new Map<string, MorpherFn>();\n\n // ===========================================================================\n // ROLE MANAGEMENT\n // ===========================================================================\n\n /**\n * Registra uma nova role\n */\n register<TBase = unknown>(roleId: string, spec: RoleSpec<TBase>): this {\n if (this.roles.has(roleId)) {\n throw new Error(`Role \"${roleId}\" is already registered`);\n }\n\n // Valida que a base existe nas variantes\n if (!spec.variants[spec.base]) {\n throw new Error(\n `Base variant \"${spec.base}\" not found in role \"${roleId}\" variants`,\n );\n }\n\n this.roles.set(roleId, spec);\n return this;\n }\n\n /**\n * Remove uma role registrada\n */\n unregister(roleId: string): boolean {\n return this.roles.delete(roleId);\n }\n\n /**\n * Verifica se uma role está registrada\n */\n hasRole(roleId: string): boolean {\n return this.roles.has(roleId);\n }\n\n /**\n * Obtém a spec de uma role\n */\n getRole(roleId: string): RoleSpec | undefined {\n return this.roles.get(roleId);\n }\n\n /**\n * Lista todas as roles registradas\n */\n listRoles(): string[] {\n return Array.from(this.roles.keys());\n }\n\n // ===========================================================================\n // VARIANT UTILITIES\n // ===========================================================================\n\n /**\n * Parseia um identificador de variante\n *\n * \"color:rgb:object\" => { role: \"color\", variant: \"rgb:object\" }\n * \"area:m2\" => { role: \"area\", variant: \"m2\" }\n */\n parseVariantId(fullId: string): ParsedVariantId {\n const colonIndex = fullId.indexOf(\":\");\n if (colonIndex === -1) {\n throw new Error(\n `Invalid variant identifier \"${fullId}\". Expected format: \"role:variant\"`,\n );\n }\n\n return {\n role: fullId.slice(0, colonIndex),\n variant: fullId.slice(colonIndex + 1),\n };\n }\n\n /**\n * Verifica se uma variante existe\n */\n hasVariant(fullId: string): boolean {\n try {\n const { role, variant } = this.parseVariantId(fullId);\n const spec = this.roles.get(role);\n return spec ? variant in spec.variants : false;\n } catch {\n return false;\n }\n }\n\n /**\n * Obtém a spec de uma variante\n */\n getVariant(fullId: string): VariantSpec | undefined {\n const { role, variant } = this.parseVariantId(fullId);\n const spec = this.roles.get(role);\n return spec?.variants[variant];\n }\n\n /**\n * Lista todas as variantes de uma role\n */\n listVariants(roleId: string): string[] {\n const spec = this.roles.get(roleId);\n if (!spec) return [];\n return Object.keys(spec.variants);\n }\n\n /**\n * Lista variantes para as quais uma variante pode converter\n */\n getConvertibleVariants(fullId: string): string[] {\n const { role, variant } = this.parseVariantId(fullId);\n const spec = this.roles.get(role);\n\n if (!spec) return [];\n\n return Object.keys(spec.variants)\n .filter((v) => v !== variant)\n .map((v) => `${role}:${v}`);\n }\n\n // ===========================================================================\n // CONVERSION\n // ===========================================================================\n\n /**\n * Converte um valor de uma variante para outra (mesma role)\n *\n * @param from - Identificador da variante de origem (ex: \"color:hex\")\n * @param to - Identificador da variante de destino (ex: \"color:rgb:object\")\n * @param value - Valor a converter\n * @returns Valor convertido\n * @throws Error se a conversão não for possível\n */\n convert<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n ): TTo {\n const fromParsed = this.parseVariantId(from);\n const toParsed = this.parseVariantId(to);\n\n // Validação: mesma role\n if (fromParsed.role !== toParsed.role) {\n throw new Error(\n `Cannot convert between different roles (\"${fromParsed.role}\" -> \"${toParsed.role}\"). ` +\n `Use morph() for cross-role transformations.`,\n );\n }\n\n const roleSpec = this.roles.get(fromParsed.role);\n if (!roleSpec) {\n throw new Error(`Role \"${fromParsed.role}\" is not registered`);\n }\n\n const fromVariant = roleSpec.variants[fromParsed.variant];\n const toVariant = roleSpec.variants[toParsed.variant];\n\n if (!fromVariant) {\n throw new Error(\n `Variant \"${fromParsed.variant}\" not found in role \"${fromParsed.role}\"`,\n );\n }\n\n if (!toVariant) {\n throw new Error(\n `Variant \"${toParsed.variant}\" not found in role \"${fromParsed.role}\"`,\n );\n }\n\n // Otimização: se origem === destino, retorna o valor\n if (fromParsed.variant === toParsed.variant) {\n return value as unknown as TTo;\n }\n\n // Conversão via base (hub-and-spoke)\n const baseVariant = roleSpec.base;\n\n // Se origem é a base, pula toBase\n const baseValue =\n fromParsed.variant === baseVariant ? value : fromVariant.toBase(value);\n\n // Se destino é a base, retorna baseValue\n if (toParsed.variant === baseVariant) {\n return baseValue as TTo;\n }\n\n // Converte da base para o destino\n return toVariant.fromBase(baseValue) as TTo;\n }\n\n /**\n * Tenta converter, retornando Result ao invés de throw\n */\n tryConvert<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n ): ConversionResult<TTo> {\n try {\n const result = this.convert<TFrom, TTo>(from, to, value);\n return { ok: true, value: result };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n // ===========================================================================\n // SAFE CONVERSION (with reversibility check)\n // ===========================================================================\n\n /**\n * Verifica se uma conversão é reversível (sem perda de dados)\n */\n isReversible<T = unknown>(from: string, to: string, value: T): boolean {\n try {\n const converted = this.convert(from, to, value);\n const reconverted = this.convert(to, from, converted);\n\n // Compara via JSON (deep equality simples)\n return JSON.stringify(value) === JSON.stringify(reconverted);\n } catch {\n return false;\n }\n }\n\n /**\n * Retorna detalhes sobre a reversibilidade de uma conversão\n */\n checkReversibility<T = unknown>(\n from: string,\n to: string,\n value: T,\n ): ReversibilityResult {\n try {\n const converted = this.convert(from, to, value);\n const reconverted = this.convert(to, from, converted);\n const reversible = JSON.stringify(value) === JSON.stringify(reconverted);\n\n return {\n reversible,\n original: value,\n converted,\n reconverted,\n };\n } catch (error) {\n return {\n reversible: false,\n original: value,\n converted: null,\n reconverted: null,\n };\n }\n }\n\n /**\n * Converte apenas se a conversão for reversível\n *\n * @throws Error se a conversão causar perda de dados\n */\n convertSafe<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n ): TTo {\n const result = this.checkReversibility(from, to, value);\n\n if (!result.reversible) {\n throw new Error(\n `Conversion from \"${from}\" to \"${to}\" is not reversible. ` +\n `Original: ${JSON.stringify(value)}, ` +\n `Reconverted: ${JSON.stringify(result.reconverted)}`,\n );\n }\n\n return result.converted as TTo;\n }\n\n // ===========================================================================\n // MORPHERS (cross-role transformations)\n // ===========================================================================\n\n /**\n * Registra um morpher para transformação entre roles diferentes\n */\n registerMorpher<TFrom = unknown, TTo = unknown>(\n spec: MorpherSpec<TFrom, TTo>,\n ): this {\n const key = `${spec.from}->${spec.to}`;\n\n if (this.morphers.has(key)) {\n throw new Error(`Morpher \"${key}\" is already registered`);\n }\n\n this.morphers.set(key, spec.transform as MorpherFn);\n return this;\n }\n\n /**\n * Remove um morpher\n */\n unregisterMorpher(from: string, to: string): boolean {\n return this.morphers.delete(`${from}->${to}`);\n }\n\n /**\n * Verifica se existe um morpher para a transformação\n */\n hasMorpher(from: string, to: string): boolean {\n return this.morphers.has(`${from}->${to}`);\n }\n\n /**\n * Lista morphers disponíveis a partir de uma variante\n */\n getMorphersFrom(from: string): string[] {\n const prefix = `${from}->`;\n const targets: string[] = [];\n\n for (const key of this.morphers.keys()) {\n if (key.startsWith(prefix)) {\n targets.push(key.slice(prefix.length));\n }\n }\n\n return targets;\n }\n\n /**\n * Transforma um valor de uma role para outra usando um morpher registrado\n */\n morph<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n ): TTo {\n const key = `${from}->${to}`;\n const morpher = this.morphers.get(key);\n\n if (!morpher) {\n throw new Error(\n `No morpher registered for \"${from}\" -> \"${to}\". ` +\n `Register one with registerMorpher().`,\n );\n }\n\n return morpher(value) as TTo;\n }\n\n /**\n * Tenta transformar, retornando Result ao invés de throw\n */\n tryMorph<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n ): ConversionResult<TTo> {\n try {\n const result = this.morph<TFrom, TTo>(from, to, value);\n return { ok: true, value: result };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n // ===========================================================================\n // CONVENIENCE METHODS\n // ===========================================================================\n\n /**\n * Converte ou transforma automaticamente\n *\n * - Se mesma role: usa convert()\n * - Se roles diferentes: usa morph()\n */\n auto<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n ): TTo {\n const fromParsed = this.parseVariantId(from);\n const toParsed = this.parseVariantId(to);\n\n if (fromParsed.role === toParsed.role) {\n return this.convert<TFrom, TTo>(from, to, value);\n }\n\n return this.morph<TFrom, TTo>(from, to, value);\n }\n\n /**\n * Converte um valor para a variante base da sua role\n */\n toBase<T = unknown, TBase = unknown>(fullId: string, value: T): TBase {\n const { role, variant } = this.parseVariantId(fullId);\n const spec = this.roles.get(role);\n\n if (!spec) {\n throw new Error(`Role \"${role}\" is not registered`);\n }\n\n // Se já é a base, retorna direto\n if (variant === spec.base) {\n return value as unknown as TBase;\n }\n\n const variantSpec = spec.variants[variant];\n if (!variantSpec) {\n throw new Error(`Variant \"${variant}\" not found in role \"${role}\"`);\n }\n\n return variantSpec.toBase(value) as TBase;\n }\n\n /**\n * Converte um valor da base para uma variante específica\n */\n fromBase<TBase = unknown, T = unknown>(fullId: string, baseValue: TBase): T {\n const { role, variant } = this.parseVariantId(fullId);\n const spec = this.roles.get(role);\n\n if (!spec) {\n throw new Error(`Role \"${role}\" is not registered`);\n }\n\n // Se é a base, retorna direto\n if (variant === spec.base) {\n return baseValue as unknown as T;\n }\n\n const variantSpec = spec.variants[variant];\n if (!variantSpec) {\n throw new Error(`Variant \"${variant}\" not found in role \"${role}\"`);\n }\n\n return variantSpec.fromBase(baseValue) as T;\n }\n}\n","/**\n * IVariant - Interface para variantes de ComplexRole\n *\n * Cada variante complexa (hex, rgb:object, hsl:string) implementa esta interface.\n * Usada quando variantes têm tipos/estruturas diferentes.\n *\n * @example\n * class HexVariant implements IVariant<string, RGBA> { ... }\n * class RgbObjectVariant implements IVariant<RGBA, RGBA> { ... }\n */\n\nimport type { ValidationResult, BaseFormatOptions } from \"../types\";\nimport type { Result } from \"./IRole\";\n\n// =============================================================================\n// IVARIANT INTERFACE\n// =============================================================================\n\n/**\n * Interface para uma variante de ComplexRole.\n *\n * @typeParam TValue - Tipo do valor nesta variante (ex: string para hex, RGBA para rgb:object)\n * @typeParam TBase - Tipo da base da role (ex: RGBA para color)\n *\n * @example\n * // Variante hex de Color\n * class HexVariant implements IVariant<string, RGBA> {\n * name = 'hex';\n * type = 'string';\n *\n * toBase(hex: string): RGBA { ... }\n * fromBase(rgba: RGBA): string { ... }\n * cast(input: unknown): string | null { ... }\n * validate(hex: string): ValidationResult { ... }\n * format(hex: string, opts?): string { ... }\n * }\n */\nexport interface IVariant<TValue = unknown, TBase = unknown> {\n // ===========================================================================\n // METADATA\n // ===========================================================================\n\n /** Nome da variante (ex: \"hex\", \"rgb:object\", \"hsl:string\") */\n readonly name: string;\n\n /** Tipo primitivo do valor (ex: \"string\", \"object\") */\n readonly type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n /**\n * Converte valor desta variante para o formato base da role.\n *\n * @example\n * hexVariant.toBase('#ff0000') // { r: 255, g: 0, b: 0, a: 1 }\n */\n toBase(value: TValue): TBase;\n\n /**\n * Converte do formato base para esta variante.\n *\n * @example\n * hexVariant.fromBase({ r: 255, g: 0, b: 0, a: 1 }) // '#ff0000ff'\n */\n fromBase(base: TBase): TValue;\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n /**\n * Tenta normalizar um input desconhecido para o tipo desta variante.\n * Retorna null se não conseguir.\n *\n * @example\n * hexVariant.cast('ff0000') // '#ff0000'\n * hexVariant.cast('red') // '#ff0000'\n * hexVariant.cast('rgb(255,0,0)') // '#ff0000'\n * hexVariant.cast(123) // null\n */\n cast(input: unknown): TValue | null;\n\n /**\n * Versão safe que retorna Result\n */\n tryCast(input: unknown): Result<TValue>;\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n /**\n * Valida se um valor atende às regras desta variante.\n *\n * @example\n * hexVariant.validate('#ff0000') // { valid: true, errors: [] }\n * hexVariant.validate('#gg0000') // { valid: false, errors: ['Invalid hex character'] }\n */\n validate(value: TValue): ValidationResult;\n\n /**\n * Versão simplificada que retorna boolean\n */\n isValid(value: TValue): boolean;\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n /**\n * Formata valor para apresentação humana.\n *\n * @example\n * hexVariant.format('#ff0000') // '#ff0000'\n * hexVariant.format('#ff0000', { uppercase: true }) // '#FF0000'\n */\n format(value: TValue, options?: BaseFormatOptions): string;\n}\n\n// =============================================================================\n// ABSTRACT BASE CLASS\n// =============================================================================\n\n/**\n * Classe base abstrata que implementa métodos auxiliares comuns.\n * Variantes concretas podem estender esta classe.\n */\nexport abstract class BaseVariant<TValue = unknown, TBase = unknown>\n implements IVariant<TValue, TBase>\n{\n abstract readonly name: string;\n abstract readonly type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n\n abstract toBase(value: TValue): TBase;\n abstract fromBase(base: TBase): TValue;\n abstract cast(input: unknown): TValue | null;\n abstract validate(value: TValue): ValidationResult;\n abstract format(value: TValue, options?: BaseFormatOptions): string;\n\n /**\n * Implementação padrão de tryCast usando cast\n */\n tryCast(input: unknown): Result<TValue> {\n const result = this.cast(input);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to ${this.name}`,\n };\n }\n return { ok: true, value: result };\n }\n\n /**\n * Implementação padrão de isValid usando validate\n */\n isValid(value: TValue): boolean {\n return this.validate(value).valid;\n }\n}\n\n// =============================================================================\n// TYPE HELPERS\n// =============================================================================\n\n/**\n * Extrai o tipo de valor de uma variante\n */\nexport type VariantValueType<V extends IVariant> =\n V extends IVariant<infer TValue, unknown> ? TValue : never;\n\n/**\n * Extrai o tipo base de uma variante\n */\nexport type VariantBaseType<V extends IVariant> =\n V extends IVariant<unknown, infer TBase> ? TBase : never;\n","/**\n * SimpleRole - Classe base abstrata para roles numéricas\n *\n * Para roles onde TODAS as variantes são do mesmo tipo (geralmente number).\n * Implementa os 4 pilares com lógica compartilhada via fatores de conversão.\n *\n * Roles que estendem: Area, Length, Mass, Volume, Speed, Pressure, Energy, etc.\n *\n * @example\n * class AreaRole extends SimpleRole<number> {\n * readonly name = 'area';\n * readonly base = 'square_meter';\n * readonly factors = { square_meter: 1, hectare: 10000, acre: 4046.86 };\n * readonly symbols = { square_meter: 'm²', hectare: 'ha', acre: 'ac' };\n * }\n */\n\nimport type {\n RoleSpec,\n VariantSpec,\n ValidationResult,\n ValidationRule,\n BaseFormatOptions,\n FormatSpec,\n} from \"../types\";\nimport type { IRole, Result } from \"./IRole\";\n\n// =============================================================================\n// CONFIG TYPES\n// =============================================================================\n\n/**\n * Configuração de uma unidade em SimpleRole\n */\nexport interface SimpleUnitConfig {\n /** Fator de conversão para a base (ou função para temperatura) */\n factor?: number;\n /** Fórmula de conversão para base (para temperatura) */\n toBase?: (value: number) => number;\n /** Fórmula de conversão da base (para temperatura) */\n fromBase?: (value: number) => number;\n /** Símbolo da unidade (ex: \"m²\", \"ha\") */\n symbol: string;\n /** Nome singular (ex: \"hectare\") */\n singular?: string;\n /** Nome plural (ex: \"hectares\") */\n plural?: string;\n /** Se true, não adiciona espaço antes do símbolo (ex: 45° ao invés de 45 °) */\n noSpace?: boolean;\n}\n\n/**\n * Configuração de validação para SimpleRole\n */\nexport interface SimpleValidationConfig {\n /** Valor mínimo permitido */\n min?: number;\n /** Valor máximo permitido */\n max?: number;\n /** Deve ser inteiro */\n integer?: boolean;\n /** Mensagem de erro customizada para min */\n minError?: string;\n /** Mensagem de erro customizada para max */\n maxError?: string;\n}\n\n/**\n * Alias para reconhecimento no cast\n */\nexport type UnitAliases = Record<string, string>;\n\n// =============================================================================\n// SIMPLE ROLE CLASS\n// =============================================================================\n\n/**\n * Classe base abstrata para roles numéricas simples.\n *\n * Subclasses devem definir:\n * - name: Nome da role\n * - base: Variante base\n * - units: Configuração de cada unidade\n * - aliases: (opcional) Aliases para cast\n * - validation: (opcional) Regras de validação\n */\nexport abstract class SimpleRole implements IRole<number> {\n // ===========================================================================\n // ABSTRACT PROPERTIES (subclasses devem implementar)\n // ===========================================================================\n\n /** Nome único da role */\n abstract readonly name: string;\n\n /** Nome da variante base */\n abstract readonly base: string;\n\n /** Configuração de cada unidade */\n abstract readonly units: Record<string, SimpleUnitConfig>;\n\n // ===========================================================================\n // OPTIONAL PROPERTIES (subclasses podem sobrescrever)\n // ===========================================================================\n\n /** Aliases para reconhecimento no cast (ex: \"ha\" → \"hectare\") */\n readonly aliases: UnitAliases = {};\n\n /** Regras de validação */\n readonly validation: SimpleValidationConfig = {};\n\n // ===========================================================================\n // INTROSPECTION\n // ===========================================================================\n\n getVariants(): string[] {\n return Object.keys(this.units);\n }\n\n hasVariant(variant: string): boolean {\n return variant in this.units;\n }\n\n // ===========================================================================\n // CONVERT (Pilar 1)\n // ===========================================================================\n\n convert<TFrom = number, TTo = number>(\n from: string,\n to: string,\n value: TFrom,\n ): TTo {\n const numValue = value as unknown as number;\n\n // Otimização: mesma variante\n if (from === to) {\n return value as unknown as TTo;\n }\n\n // Converte para base e depois para destino\n const baseValue = this.toBase(from, numValue);\n return this.fromBase(to, baseValue) as unknown as TTo;\n }\n\n tryConvert<TFrom = number, TTo = number>(\n from: string,\n to: string,\n value: TFrom,\n ): Result<TTo> {\n try {\n if (!this.hasVariant(from)) {\n return { ok: false, error: `Unknown variant: ${from}` };\n }\n if (!this.hasVariant(to)) {\n return { ok: false, error: `Unknown variant: ${to}` };\n }\n const result = this.convert<TFrom, TTo>(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n }\n\n toBase<T = number>(variant: string, value: T): number {\n const numValue = value as unknown as number;\n const unit = this.units[variant];\n\n if (!unit) {\n throw new Error(`Unknown variant: ${variant}`);\n }\n\n // Usa fórmula se definida (temperatura), senão usa fator\n if (unit.toBase) {\n return unit.toBase(numValue);\n }\n\n return numValue * (unit.factor ?? 1);\n }\n\n fromBase<T = number>(variant: string, baseValue: number): T {\n const unit = this.units[variant];\n\n if (!unit) {\n throw new Error(`Unknown variant: ${variant}`);\n }\n\n // Usa fórmula se definida (temperatura), senão usa fator\n if (unit.fromBase) {\n return unit.fromBase(baseValue) as unknown as T;\n }\n\n return (baseValue / (unit.factor ?? 1)) as unknown as T;\n }\n\n // ===========================================================================\n // CAST (Pilar 2)\n // ===========================================================================\n\n cast<T = number>(variant: string, input: unknown): T | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? (input as unknown as T) : null;\n }\n\n // String\n if (typeof input === \"string\") {\n const parsed = this.parseString(input, variant);\n return parsed !== null ? (parsed as unknown as T) : null;\n }\n\n return null;\n }\n\n tryCast<T = number>(variant: string, input: unknown): Result<T> {\n const result = this.cast<T>(variant, input);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to ${this.name}:${variant}`,\n };\n }\n return { ok: true, value: result };\n }\n\n /**\n * Parseia string para número, detectando unidade se presente.\n * Subclasses podem sobrescrever para lógica customizada.\n */\n protected parseString(input: string, targetVariant: string): number | null {\n const trimmed = input.trim().toLowerCase();\n\n // Extrai número e possível unidade\n const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n\n let [, numStr, unitStr] = match;\n\n // Normaliza número\n const numValue = this.parseNumber(numStr);\n if (numValue === null) {\n return null;\n }\n\n // Se tem unidade no input, converte se necessário\n unitStr = unitStr.trim();\n if (unitStr) {\n const detectedUnit = this.detectUnit(unitStr);\n if (detectedUnit && detectedUnit !== targetVariant) {\n // Converte da unidade detectada para a target\n return this.convert(detectedUnit, targetVariant, numValue);\n }\n }\n\n return numValue;\n }\n\n /**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\n protected parseNumber(numStr: string): number | null {\n // Remove espaços\n numStr = numStr.replace(/\\s/g, \"\");\n\n const lastComma = numStr.lastIndexOf(\",\");\n const lastDot = numStr.lastIndexOf(\".\");\n const hasComma = lastComma !== -1;\n const hasDot = lastDot !== -1;\n\n if (hasComma && hasDot) {\n if (lastComma > lastDot) {\n // Brasileiro: 1.000,50\n numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n } else {\n // Americano: 1,000.50\n numStr = numStr.replace(/,/g, \"\");\n }\n } else if (hasComma && !hasDot) {\n // Só vírgulas: detecta se é milhar ou decimal\n const afterComma = numStr.split(\",\").slice(1);\n const isThousandSep = afterComma.every((part) => part.length === 3);\n if (isThousandSep) {\n numStr = numStr.replace(/,/g, \"\");\n } else {\n numStr = numStr.replace(\",\", \".\");\n }\n } else if (!hasComma && hasDot) {\n // Só pontos: múltiplos pontos = milhar brasileiro\n const afterDot = numStr.split(\".\").slice(1);\n if (afterDot.length > 1) {\n numStr = numStr.replace(/\\./g, \"\");\n }\n }\n\n const value = parseFloat(numStr);\n return isNaN(value) ? null : value;\n }\n\n /**\n * Detecta unidade a partir de string (símbolo ou alias)\n */\n protected detectUnit(unitStr: string): string | null {\n const normalized = unitStr.toLowerCase().trim();\n\n // Checa aliases primeiro\n if (normalized in this.aliases) {\n return this.aliases[normalized];\n }\n\n // Checa símbolos e nomes\n for (const [variant, config] of Object.entries(this.units)) {\n if (\n config.symbol.toLowerCase() === normalized ||\n config.singular?.toLowerCase() === normalized ||\n config.plural?.toLowerCase() === normalized ||\n variant.toLowerCase() === normalized\n ) {\n return variant;\n }\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE (Pilar 3)\n // ===========================================================================\n\n validate(variant: string, value: unknown): ValidationResult {\n const errors: string[] = [];\n\n // Tipo\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finito\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Min\n if (this.validation.min !== undefined && value < this.validation.min) {\n const msg =\n this.validation.minError ??\n `Value must be at least ${this.validation.min}`;\n errors.push(msg);\n }\n\n // Max\n if (this.validation.max !== undefined && value > this.validation.max) {\n const msg =\n this.validation.maxError ??\n `Value must be at most ${this.validation.max}`;\n errors.push(msg);\n }\n\n // Integer\n if (this.validation.integer && !Number.isInteger(value)) {\n errors.push(\"Value must be an integer\");\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n isValid(variant: string, value: unknown): boolean {\n return this.validate(variant, value).valid;\n }\n\n // ===========================================================================\n // FORMAT (Pilar 4)\n // ===========================================================================\n\n format(variant: string, value: unknown, options: BaseFormatOptions = {}): string {\n const { decimals = 2, verbose = false, locale } = options;\n const unit = this.units[variant];\n\n if (!unit) {\n throw new Error(`Unknown variant: ${variant}`);\n }\n\n const numValue = value as number;\n\n // Formata número\n let formattedValue: string;\n if (locale) {\n formattedValue = numValue.toLocaleString(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n });\n } else {\n formattedValue = Number(numValue.toFixed(decimals)).toString();\n }\n\n // Escolhe símbolo ou nome\n const separator = unit.noSpace ? \"\" : \" \";\n\n if (verbose) {\n const name = numValue === 1 ? unit.singular : unit.plural;\n return `${formattedValue} ${name || unit.symbol}`;\n }\n\n return `${formattedValue}${separator}${unit.symbol}`;\n }\n\n // ===========================================================================\n // COMPATIBILITY\n // ===========================================================================\n\n toSpec(): RoleSpec<number> {\n const variants: Record<string, VariantSpec<unknown, number>> = {};\n\n for (const [name, config] of Object.entries(this.units)) {\n const factor = config.factor ?? 1;\n\n const toBaseFn = config.toBase\n ? (v: unknown) => config.toBase!(v as number)\n : (v: unknown) => (v as number) * factor;\n const fromBaseFn = config.fromBase\n ? (v: number) => config.fromBase!(v)\n : (v: number) => v / factor;\n\n variants[name] = {\n type: \"number\",\n toBase: toBaseFn,\n fromBase: fromBaseFn,\n cast: (input: unknown) => this.cast(name, input),\n validate: {\n min: this.validation.min,\n max: this.validation.max,\n integer: this.validation.integer,\n custom: (v: unknown) => {\n const result = this.validate(name, v);\n return result.valid ? null : result.errors[0];\n },\n } as ValidationRule,\n format: {\n symbol: config.symbol,\n singular: config.singular,\n plural: config.plural,\n } as FormatSpec<unknown>,\n };\n }\n\n return {\n base: this.base,\n variants,\n };\n }\n}\n","/**\n * ComplexRole - Classe base abstrata para roles com variantes heterogêneas\n *\n * Para roles onde cada variante tem tipo/estrutura diferente.\n * Cada variante é implementada como sua própria classe (IVariant).\n *\n * Roles que estendem: Color, Date, etc.\n *\n * @example\n * class ColorRole extends ComplexRole<RGBA> {\n * readonly name = 'color';\n * readonly base = 'rgb_object';\n *\n * protected createVariants() {\n * return {\n * 'hex': new HexVariant(),\n * 'rgb_object': new RgbObjectVariant(),\n * 'rgb_string': new RgbStringVariant(),\n * 'hsl_object': new HslObjectVariant(),\n * };\n * }\n * }\n */\n\nimport type {\n RoleSpec,\n VariantSpec,\n ValidationResult,\n BaseFormatOptions,\n} from \"../types\";\nimport type { IRole, Result } from \"./IRole\";\nimport type { IVariant } from \"./IVariant\";\n\n// =============================================================================\n// COMPLEX ROLE CLASS\n// =============================================================================\n\n/**\n * Classe base abstrata para roles com variantes heterogêneas.\n *\n * Subclasses devem definir:\n * - name: Nome da role\n * - base: Variante base\n * - createVariants(): Factory que retorna mapa de variantes\n *\n * @typeParam TBase - Tipo do valor na variante base\n */\nexport abstract class ComplexRole<TBase = unknown> implements IRole<TBase> {\n // ===========================================================================\n // ABSTRACT PROPERTIES (subclasses devem implementar)\n // ===========================================================================\n\n /** Nome único da role */\n abstract readonly name: string;\n\n /** Nome da variante base */\n abstract readonly base: string;\n\n // ===========================================================================\n // VARIANTS\n // ===========================================================================\n\n /** Cache das variantes */\n private _variants: Map<string, IVariant<unknown, TBase>> | null = null;\n\n /**\n * Factory method para criar variantes.\n * Subclasses devem implementar.\n */\n protected abstract createVariants(): Record<string, IVariant<unknown, TBase>>;\n\n /**\n * Retorna mapa de variantes (lazy initialization)\n */\n protected get variants(): Map<string, IVariant<unknown, TBase>> {\n if (!this._variants) {\n this._variants = new Map(Object.entries(this.createVariants()));\n }\n return this._variants;\n }\n\n /**\n * Retorna uma variante específica\n */\n protected getVariant(name: string): IVariant<unknown, TBase> {\n const variant = this.variants.get(name);\n if (!variant) {\n throw new Error(`Unknown variant: ${name}`);\n }\n return variant;\n }\n\n // ===========================================================================\n // INTROSPECTION\n // ===========================================================================\n\n getVariants(): string[] {\n return Array.from(this.variants.keys());\n }\n\n hasVariant(variant: string): boolean {\n return this.variants.has(variant);\n }\n\n // ===========================================================================\n // CONVERT (Pilar 1)\n // ===========================================================================\n\n convert<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n ): TTo {\n // Otimização: mesma variante\n if (from === to) {\n return value as unknown as TTo;\n }\n\n const fromVariant = this.getVariant(from);\n const toVariant = this.getVariant(to);\n\n // from → base → to\n const baseValue = fromVariant.toBase(value);\n return toVariant.fromBase(baseValue) as unknown as TTo;\n }\n\n tryConvert<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n ): Result<TTo> {\n try {\n if (!this.hasVariant(from)) {\n return { ok: false, error: `Unknown variant: ${from}` };\n }\n if (!this.hasVariant(to)) {\n return { ok: false, error: `Unknown variant: ${to}` };\n }\n const result = this.convert<TFrom, TTo>(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n }\n\n toBase<T = unknown>(variant: string, value: T): TBase {\n return this.getVariant(variant).toBase(value);\n }\n\n fromBase<T = unknown>(variant: string, baseValue: TBase): T {\n return this.getVariant(variant).fromBase(baseValue) as T;\n }\n\n // ===========================================================================\n // CAST (Pilar 2)\n // ===========================================================================\n\n cast<T = unknown>(variant: string, input: unknown): T | null {\n return this.getVariant(variant).cast(input) as T | null;\n }\n\n tryCast<T = unknown>(variant: string, input: unknown): Result<T> {\n const result = this.cast<T>(variant, input);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to ${this.name}:${variant}`,\n };\n }\n return { ok: true, value: result };\n }\n\n // ===========================================================================\n // VALIDATE (Pilar 3)\n // ===========================================================================\n\n validate(variant: string, value: unknown): ValidationResult {\n return this.getVariant(variant).validate(value);\n }\n\n isValid(variant: string, value: unknown): boolean {\n return this.validate(variant, value).valid;\n }\n\n // ===========================================================================\n // FORMAT (Pilar 4)\n // ===========================================================================\n\n format(variant: string, value: unknown, options?: BaseFormatOptions): string {\n return this.getVariant(variant).format(value, options);\n }\n\n // ===========================================================================\n // COMPATIBILITY\n // ===========================================================================\n\n toSpec(): RoleSpec<TBase> {\n const variants: Record<string, VariantSpec<unknown, TBase>> = {};\n\n for (const [name, variant] of this.variants.entries()) {\n variants[name] = {\n type: variant.type,\n toBase: (v: unknown) => variant.toBase(v),\n fromBase: (v: TBase) => variant.fromBase(v),\n cast: (input: unknown) => variant.cast(input),\n validate: {\n custom: (v: unknown) => {\n const result = variant.validate(v);\n return result.valid ? null : result.errors[0];\n },\n },\n format: {\n symbol: name,\n formatter: (v: unknown, opts?: BaseFormatOptions) =>\n variant.format(v, opts),\n },\n };\n }\n\n return {\n base: this.base,\n variants,\n };\n }\n}\n","/**\n * Area Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de área.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AreaUnit =\n // SI\n | \"square_kilometer\"\n | \"hectare\"\n | \"are\"\n | \"square_meter\"\n | \"square_decimeter\"\n | \"square_centimeter\"\n | \"square_millimeter\"\n // Imperial/US\n | \"square_mile\"\n | \"acre\"\n | \"square_yard\"\n | \"square_foot\"\n | \"square_inch\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de área.\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Imperial: derivados de (comprimento)² onde comprimento é exato desde 1959\n *\n * Relações imperiais:\n * - 1 in² = (0.0254 m)² = 0.00064516 m²\n * - 1 ft² = (0.3048 m)² = 0.09290304 m²\n * - 1 yd² = (0.9144 m)² = 0.83612736 m²\n * - 1 mi² = (1609.344 m)² = 2589988.110336 m²\n * - 1 acre = 43560 ft² = 4046.8564224 m²\n */\nexport const AREA_UNITS: Record<AreaUnit, SimpleUnitConfig> = {\n // SI Units (todos exatos)\n square_kilometer: {\n factor: 1_000_000,\n symbol: \"km²\",\n singular: \"square kilometer\",\n plural: \"square kilometers\",\n },\n hectare: {\n factor: 10_000,\n symbol: \"ha\",\n singular: \"hectare\",\n plural: \"hectares\",\n },\n are: {\n factor: 100,\n symbol: \"a\",\n singular: \"are\",\n plural: \"ares\",\n },\n square_meter: {\n factor: 1,\n symbol: \"m²\",\n singular: \"square meter\",\n plural: \"square meters\",\n },\n square_decimeter: {\n factor: 0.01,\n symbol: \"dm²\",\n singular: \"square decimeter\",\n plural: \"square decimeters\",\n },\n square_centimeter: {\n factor: 0.0001,\n symbol: \"cm²\",\n singular: \"square centimeter\",\n plural: \"square centimeters\",\n },\n square_millimeter: {\n factor: 0.000001,\n symbol: \"mm²\",\n singular: \"square millimeter\",\n plural: \"square millimeters\",\n },\n\n // Imperial/US (todos exatos, derivados de comprimento² desde 1959)\n square_mile: {\n factor: 2_589_988.110336,\n symbol: \"mi²\",\n singular: \"square mile\",\n plural: \"square miles\",\n },\n acre: {\n factor: 4_046.8564224,\n symbol: \"ac\",\n singular: \"acre\",\n plural: \"acres\",\n },\n square_yard: {\n factor: 0.83612736,\n symbol: \"yd²\",\n singular: \"square yard\",\n plural: \"square yards\",\n },\n square_foot: {\n factor: 0.09290304,\n symbol: \"ft²\",\n singular: \"square foot\",\n plural: \"square feet\",\n },\n square_inch: {\n factor: 0.00064516,\n symbol: \"in²\",\n singular: \"square inch\",\n plural: \"square inches\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const AREA_ALIASES: UnitAliases = {\n // square_kilometer\n \"km²\": \"square_kilometer\",\n km2: \"square_kilometer\",\n \"sq km\": \"square_kilometer\",\n \"square kilometer\": \"square_kilometer\",\n \"square kilometers\": \"square_kilometer\",\n \"quilômetro quadrado\": \"square_kilometer\",\n \"quilômetros quadrados\": \"square_kilometer\",\n\n // hectare\n ha: \"hectare\",\n hectare: \"hectare\",\n hectares: \"hectare\",\n\n // are\n a: \"are\",\n are: \"are\",\n ares: \"are\",\n\n // square_meter\n \"m²\": \"square_meter\",\n m2: \"square_meter\",\n \"sq m\": \"square_meter\",\n \"square meter\": \"square_meter\",\n \"square meters\": \"square_meter\",\n \"metro quadrado\": \"square_meter\",\n \"metros quadrados\": \"square_meter\",\n\n // square_decimeter\n \"dm²\": \"square_decimeter\",\n dm2: \"square_decimeter\",\n\n // square_centimeter\n \"cm²\": \"square_centimeter\",\n cm2: \"square_centimeter\",\n \"sq cm\": \"square_centimeter\",\n\n // square_millimeter\n \"mm²\": \"square_millimeter\",\n mm2: \"square_millimeter\",\n \"sq mm\": \"square_millimeter\",\n\n // square_mile\n \"mi²\": \"square_mile\",\n mi2: \"square_mile\",\n \"sq mi\": \"square_mile\",\n \"square mile\": \"square_mile\",\n \"square miles\": \"square_mile\",\n\n // acre\n ac: \"acre\",\n acre: \"acre\",\n acres: \"acre\",\n\n // square_yard\n \"yd²\": \"square_yard\",\n yd2: \"square_yard\",\n \"sq yd\": \"square_yard\",\n \"square yard\": \"square_yard\",\n \"square yards\": \"square_yard\",\n\n // square_foot\n \"ft²\": \"square_foot\",\n ft2: \"square_foot\",\n \"sq ft\": \"square_foot\",\n \"square foot\": \"square_foot\",\n \"square feet\": \"square_foot\",\n\n // square_inch\n \"in²\": \"square_inch\",\n in2: \"square_inch\",\n \"sq in\": \"square_inch\",\n \"square inch\": \"square_inch\",\n \"square inches\": \"square_inch\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const AREA_UNIT_LIST = Object.keys(AREA_UNITS) as AreaUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const AREA_FACTORS: Record<AreaUnit, number> = Object.fromEntries(\n Object.entries(AREA_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<AreaUnit, number>;\n","/**\n * AreaRole - Role para conversão de unidades de área\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const area = new AreaRole();\n * area.convert('hectare', 'acre', 1) // 2.47105\n * area.cast('hectare', '100 ha') // 100\n * area.validate('hectare', 100) // { valid: true, errors: [] }\n * area.format('hectare', 2.5) // \"2.5 ha\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { AREA_UNITS, AREA_ALIASES, type AreaUnit } from \"./constants\";\n\n// =============================================================================\n// AREA ROLE CLASS\n// =============================================================================\n\nexport class AreaRole extends SimpleRole {\n readonly name = \"area\";\n readonly base = \"square_meter\";\n readonly units = AREA_UNITS;\n readonly aliases = AREA_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Area cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da AreaRole */\nexport const areaRole = new AreaRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de área\n *\n * @example\n * convertArea(1, 'hectare', 'acre') // 2.47105\n */\nexport function convertArea(\n value: number,\n from: AreaUnit,\n to: AreaUnit,\n): number {\n return areaRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de área com unidade\n *\n * @example\n * formatArea(2.5, 'hectare') // \"2.5 ha\"\n * formatArea(2.5, 'hectare', { verbose: true }) // \"2.5 hectares\"\n */\nexport function formatArea(\n value: number,\n unit: AreaUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return areaRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de área\n *\n * @example\n * validateArea(100) // { valid: true, errors: [] }\n * validateArea(-5) // { valid: false, errors: ['Area cannot be negative'] }\n */\nexport function validateArea(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return areaRole.validate(\"square_meter\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castArea('100 ha') // 100\n * castArea('100') // 100\n * castArea('invalid') // null\n */\nexport function castArea(\n input: unknown,\n targetUnit: AreaUnit = \"square_meter\",\n): number | null {\n return areaRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castArea que retorna Result\n */\nexport function tryCastArea(\n input: unknown,\n targetUnit: AreaUnit = \"square_meter\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return areaRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectAreaUnit('100 ha') // 'hectare'\n * detectAreaUnit('100 acres') // 'acre'\n * detectAreaUnit('100') // null\n */\nexport function detectAreaUnit(input: string): AreaUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (areaRole as any).detectUnit(unitStr) as AreaUnit | null;\n}\n","/**\n * Length Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de comprimento.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type LengthUnit =\n // SI\n | \"kilometer\"\n | \"hectometer\"\n | \"decameter\"\n | \"meter\"\n | \"decimeter\"\n | \"centimeter\"\n | \"millimeter\"\n | \"micrometer\"\n | \"nanometer\"\n // Imperial/US\n | \"inch\"\n | \"foot\"\n | \"yard\"\n | \"mile\"\n // Nautical\n | \"nautical_mile\"\n // Other\n | \"fathom\"\n | \"furlong\"\n | \"league\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de comprimento.\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Imperial: exatos desde International Yard and Pound Agreement (1959)\n * - 1 yard = 0.9144 m (exato por definição)\n * - 1 foot = 0.3048 m (= yard/3)\n * - 1 inch = 0.0254 m (= foot/12)\n * - 1 mile = 1609.344 m (= 5280 feet)\n */\nexport const LENGTH_UNITS: Record<LengthUnit, SimpleUnitConfig> = {\n // SI Units (todos exatos)\n kilometer: {\n factor: 1000,\n symbol: \"km\",\n singular: \"kilometer\",\n plural: \"kilometers\",\n },\n hectometer: {\n factor: 100,\n symbol: \"hm\",\n singular: \"hectometer\",\n plural: \"hectometers\",\n },\n decameter: {\n factor: 10,\n symbol: \"dam\",\n singular: \"decameter\",\n plural: \"decameters\",\n },\n meter: {\n factor: 1,\n symbol: \"m\",\n singular: \"meter\",\n plural: \"meters\",\n },\n decimeter: {\n factor: 0.1,\n symbol: \"dm\",\n singular: \"decimeter\",\n plural: \"decimeters\",\n },\n centimeter: {\n factor: 0.01,\n symbol: \"cm\",\n singular: \"centimeter\",\n plural: \"centimeters\",\n },\n millimeter: {\n factor: 0.001,\n symbol: \"mm\",\n singular: \"millimeter\",\n plural: \"millimeters\",\n },\n micrometer: {\n factor: 0.000001,\n symbol: \"μm\",\n singular: \"micrometer\",\n plural: \"micrometers\",\n },\n nanometer: {\n factor: 0.000000001,\n symbol: \"nm\",\n singular: \"nanometer\",\n plural: \"nanometers\",\n },\n\n // Imperial/US (exatos desde 1959)\n inch: {\n factor: 0.0254,\n symbol: \"in\",\n singular: \"inch\",\n plural: \"inches\",\n },\n foot: {\n factor: 0.3048,\n symbol: \"ft\",\n singular: \"foot\",\n plural: \"feet\",\n },\n yard: {\n factor: 0.9144,\n symbol: \"yd\",\n singular: \"yard\",\n plural: \"yards\",\n },\n mile: {\n factor: 1609.344,\n symbol: \"mi\",\n singular: \"mile\",\n plural: \"miles\",\n },\n\n // Nautical (exato por definição internacional)\n nautical_mile: {\n factor: 1852,\n symbol: \"nmi\",\n singular: \"nautical mile\",\n plural: \"nautical miles\",\n },\n\n // Other (derivados, portanto exatos)\n fathom: {\n factor: 1.8288, // 6 feet\n symbol: \"ftm\",\n singular: \"fathom\",\n plural: \"fathoms\",\n },\n furlong: {\n factor: 201.168, // 660 feet = 1/8 mile\n symbol: \"fur\",\n singular: \"furlong\",\n plural: \"furlongs\",\n },\n league: {\n factor: 4828.032, // 3 miles\n symbol: \"lea\",\n singular: \"league\",\n plural: \"leagues\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const LENGTH_ALIASES: UnitAliases = {\n // kilometer\n km: \"kilometer\",\n kilometer: \"kilometer\",\n kilometers: \"kilometer\",\n quilômetro: \"kilometer\",\n quilômetros: \"kilometer\",\n\n // hectometer\n hm: \"hectometer\",\n hectometer: \"hectometer\",\n hectometers: \"hectometer\",\n\n // decameter\n dam: \"decameter\",\n decameter: \"decameter\",\n decameters: \"decameter\",\n\n // meter\n m: \"meter\",\n meter: \"meter\",\n meters: \"meter\",\n metro: \"meter\",\n metros: \"meter\",\n\n // decimeter\n dm: \"decimeter\",\n decimeter: \"decimeter\",\n decimeters: \"decimeter\",\n\n // centimeter\n cm: \"centimeter\",\n centimeter: \"centimeter\",\n centimeters: \"centimeter\",\n centímetro: \"centimeter\",\n centímetros: \"centimeter\",\n\n // millimeter\n mm: \"millimeter\",\n millimeter: \"millimeter\",\n millimeters: \"millimeter\",\n milímetro: \"millimeter\",\n milímetros: \"millimeter\",\n\n // micrometer\n μm: \"micrometer\",\n um: \"micrometer\",\n micrometer: \"micrometer\",\n micrometers: \"micrometer\",\n micron: \"micrometer\",\n microns: \"micrometer\",\n\n // nanometer\n nm: \"nanometer\",\n nanometer: \"nanometer\",\n nanometers: \"nanometer\",\n\n // inch\n in: \"inch\",\n '\"': \"inch\",\n inch: \"inch\",\n inches: \"inch\",\n polegada: \"inch\",\n polegadas: \"inch\",\n\n // foot\n ft: \"foot\",\n \"'\": \"foot\",\n foot: \"foot\",\n feet: \"foot\",\n pé: \"foot\",\n pés: \"foot\",\n\n // yard\n yd: \"yard\",\n yard: \"yard\",\n yards: \"yard\",\n jarda: \"yard\",\n jardas: \"yard\",\n\n // mile\n mi: \"mile\",\n mile: \"mile\",\n miles: \"mile\",\n milha: \"mile\",\n milhas: \"mile\",\n\n // nautical_mile\n nmi: \"nautical_mile\",\n \"nautical mile\": \"nautical_mile\",\n \"nautical miles\": \"nautical_mile\",\n \"milha náutica\": \"nautical_mile\",\n \"milhas náuticas\": \"nautical_mile\",\n\n // fathom\n ftm: \"fathom\",\n fathom: \"fathom\",\n fathoms: \"fathom\",\n braça: \"fathom\",\n braças: \"fathom\",\n\n // furlong\n fur: \"furlong\",\n furlong: \"furlong\",\n furlongs: \"furlong\",\n\n // league\n lea: \"league\",\n league: \"league\",\n leagues: \"league\",\n légua: \"league\",\n léguas: \"league\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const LENGTH_UNIT_LIST = Object.keys(LENGTH_UNITS) as LengthUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const LENGTH_FACTORS: Record<LengthUnit, number> = Object.fromEntries(\n Object.entries(LENGTH_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<LengthUnit, number>;\n","/**\n * LengthRole - Role para conversão de unidades de comprimento\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const length = new LengthRole();\n * length.convert('kilometer', 'mile', 1) // 0.621371\n * length.cast('meter', '100 m') // 100\n * length.validate('meter', 100) // { valid: true, errors: [] }\n * length.format('kilometer', 42.195) // \"42.2 km\"\n */\n\nimport { SimpleRole } from \"../../contracts\";\nimport { LENGTH_UNITS, LENGTH_ALIASES, type LengthUnit } from \"./constants\";\n\n// =============================================================================\n// LENGTH ROLE CLASS\n// =============================================================================\n\nexport class LengthRole extends SimpleRole {\n readonly name = \"length\";\n readonly base = \"meter\";\n readonly units = LENGTH_UNITS;\n readonly aliases = LENGTH_ALIASES;\n\n // Length pode ser negativo (posição relativa), então não definimos min\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da LengthRole */\nexport const lengthRole = new LengthRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de comprimento\n *\n * @example\n * convertLength(1, 'mile', 'kilometer') // 1.609344\n */\nexport function convertLength(\n value: number,\n from: LengthUnit,\n to: LengthUnit,\n): number {\n return lengthRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de comprimento com unidade\n *\n * @example\n * formatLength(42.195, 'kilometer') // \"42.2 km\"\n * formatLength(42.195, 'kilometer', { verbose: true }) // \"42.2 kilometers\"\n */\nexport function formatLength(\n value: number,\n unit: LengthUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return lengthRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de comprimento\n *\n * @example\n * validateLength(100) // { valid: true, errors: [] }\n */\nexport function validateLength(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return lengthRole.validate(\"meter\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castLength('100 m') // 100\n * castLength('100') // 100\n * castLength('invalid') // null\n */\nexport function castLength(\n input: unknown,\n targetUnit: LengthUnit = \"meter\",\n): number | null {\n return lengthRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castLength que retorna Result\n */\nexport function tryCastLength(\n input: unknown,\n targetUnit: LengthUnit = \"meter\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return lengthRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectLengthUnit('100 km') // 'kilometer'\n * detectLengthUnit('100 ft') // 'foot'\n * detectLengthUnit('100') // null\n */\nexport function detectLengthUnit(input: string): LengthUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (lengthRole as any).detectUnit(unitStr) as LengthUnit | null;\n}\n","/**\n * Mass Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de massa.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n *\n * Nota: Massa ≠ Peso\n * - Massa: quantidade de matéria (invariante)\n * - Peso: força gravitacional (varia com localização)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type MassUnit =\n // SI / Metric\n | \"metric_ton\"\n | \"kilogram\"\n | \"hectogram\"\n | \"decagram\"\n | \"gram\"\n | \"decigram\"\n | \"centigram\"\n | \"milligram\"\n | \"microgram\"\n // Avoirdupois (US/UK)\n | \"long_ton\"\n | \"short_ton\"\n | \"stone\"\n | \"pound\"\n | \"ounce\"\n | \"dram\"\n | \"grain\"\n // Troy (metais preciosos)\n | \"troy_pound\"\n | \"troy_ounce\"\n | \"pennyweight\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de massa.\n *\n * Base: kilogram (kg) - Unidade SI de massa\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Avoirdupois: exatos desde International Yard and Pound Agreement (1959)\n * - 1 pound = 0.45359237 kg (exato por definição)\n * - Outras derivadas de pound\n * - Troy: derivados de grain e pound avoirdupois\n */\nexport const MASS_UNITS: Record<MassUnit, SimpleUnitConfig> = {\n // ===========================================================================\n // SI / Metric\n // ===========================================================================\n metric_ton: {\n factor: 1000,\n symbol: \"t\",\n singular: \"metric ton\",\n plural: \"metric tons\",\n },\n kilogram: {\n factor: 1,\n symbol: \"kg\",\n singular: \"kilogram\",\n plural: \"kilograms\",\n },\n hectogram: {\n factor: 0.1,\n symbol: \"hg\",\n singular: \"hectogram\",\n plural: \"hectograms\",\n },\n decagram: {\n factor: 0.01,\n symbol: \"dag\",\n singular: \"decagram\",\n plural: \"decagrams\",\n },\n gram: {\n factor: 0.001,\n symbol: \"g\",\n singular: \"gram\",\n plural: \"grams\",\n },\n decigram: {\n factor: 0.0001,\n symbol: \"dg\",\n singular: \"decigram\",\n plural: \"decigrams\",\n },\n centigram: {\n factor: 0.00001,\n symbol: \"cg\",\n singular: \"centigram\",\n plural: \"centigrams\",\n },\n milligram: {\n factor: 0.000001,\n symbol: \"mg\",\n singular: \"milligram\",\n plural: \"milligrams\",\n },\n microgram: {\n factor: 0.000000001,\n symbol: \"μg\",\n singular: \"microgram\",\n plural: \"micrograms\",\n },\n\n // ===========================================================================\n // Avoirdupois (US/UK) - Sistema padrão para peso comum\n // ===========================================================================\n long_ton: {\n factor: 1016.0469088, // 2240 lb (exato)\n symbol: \"long tn\",\n singular: \"long ton\",\n plural: \"long tons\",\n },\n short_ton: {\n factor: 907.18474, // 2000 lb (exato)\n symbol: \"sh tn\",\n singular: \"short ton\",\n plural: \"short tons\",\n },\n stone: {\n factor: 6.35029318, // 14 lb (exato)\n symbol: \"st\",\n singular: \"stone\",\n plural: \"stone\", // stone não muda no plural em inglês\n },\n pound: {\n factor: 0.45359237, // Exato desde 1959\n symbol: \"lb\",\n singular: \"pound\",\n plural: \"pounds\",\n },\n ounce: {\n factor: 0.028349523125, // 1/16 lb (exato)\n symbol: \"oz\",\n singular: \"ounce\",\n plural: \"ounces\",\n },\n dram: {\n factor: 0.0017718451953125, // 1/16 oz (exato)\n symbol: \"dr\",\n singular: \"dram\",\n plural: \"drams\",\n },\n grain: {\n factor: 0.00006479891, // 1/7000 lb (exato)\n symbol: \"gr\",\n singular: \"grain\",\n plural: \"grains\",\n },\n\n // ===========================================================================\n // Troy (metais preciosos)\n // ===========================================================================\n troy_pound: {\n factor: 0.3732417216, // 12 troy oz (exato)\n symbol: \"lb t\",\n singular: \"troy pound\",\n plural: \"troy pounds\",\n },\n troy_ounce: {\n factor: 0.0311034768, // 480 grains (exato)\n symbol: \"oz t\",\n singular: \"troy ounce\",\n plural: \"troy ounces\",\n },\n pennyweight: {\n factor: 0.00155517384, // 1/20 troy oz (exato)\n symbol: \"dwt\",\n singular: \"pennyweight\",\n plural: \"pennyweights\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const MASS_ALIASES: UnitAliases = {\n // metric_ton\n t: \"metric_ton\",\n tonne: \"metric_ton\",\n tonnes: \"metric_ton\",\n \"metric ton\": \"metric_ton\",\n \"metric tons\": \"metric_ton\",\n tonelada: \"metric_ton\",\n toneladas: \"metric_ton\",\n\n // kilogram\n kg: \"kilogram\",\n kilo: \"kilogram\",\n kilos: \"kilogram\",\n kilogram: \"kilogram\",\n kilograms: \"kilogram\",\n quilograma: \"kilogram\",\n quilogramas: \"kilogram\",\n\n // hectogram\n hg: \"hectogram\",\n hectogram: \"hectogram\",\n hectograms: \"hectogram\",\n\n // decagram\n dag: \"decagram\",\n decagram: \"decagram\",\n decagrams: \"decagram\",\n\n // gram\n g: \"gram\",\n gram: \"gram\",\n grams: \"gram\",\n grama: \"gram\",\n gramas: \"gram\",\n\n // decigram\n dg: \"decigram\",\n decigram: \"decigram\",\n decigrams: \"decigram\",\n\n // centigram\n cg: \"centigram\",\n centigram: \"centigram\",\n centigrams: \"centigram\",\n\n // milligram\n mg: \"milligram\",\n milligram: \"milligram\",\n milligrams: \"milligram\",\n miligrama: \"milligram\",\n miligramas: \"milligram\",\n\n // microgram\n μg: \"microgram\",\n ug: \"microgram\",\n mcg: \"microgram\",\n microgram: \"microgram\",\n micrograms: \"microgram\",\n\n // long_ton\n \"long tn\": \"long_ton\",\n \"long ton\": \"long_ton\",\n \"long tons\": \"long_ton\",\n \"imperial ton\": \"long_ton\",\n\n // short_ton\n \"sh tn\": \"short_ton\",\n \"short ton\": \"short_ton\",\n \"short tons\": \"short_ton\",\n \"us ton\": \"short_ton\",\n ton: \"short_ton\", // Default \"ton\" para short ton (US)\n tons: \"short_ton\",\n\n // stone\n st: \"stone\",\n stone: \"stone\",\n stones: \"stone\",\n\n // pound\n lb: \"pound\",\n lbs: \"pound\",\n pound: \"pound\",\n pounds: \"pound\",\n libra: \"pound\",\n libras: \"pound\",\n \"#\": \"pound\",\n\n // ounce\n oz: \"ounce\",\n ounce: \"ounce\",\n ounces: \"ounce\",\n onça: \"ounce\",\n onças: \"ounce\",\n\n // dram\n dr: \"dram\",\n dram: \"dram\",\n drams: \"dram\",\n\n // grain\n gr: \"grain\",\n grain: \"grain\",\n grains: \"grain\",\n\n // troy_pound\n \"lb t\": \"troy_pound\",\n \"troy pound\": \"troy_pound\",\n \"troy pounds\": \"troy_pound\",\n\n // troy_ounce\n \"oz t\": \"troy_ounce\",\n ozt: \"troy_ounce\",\n \"troy ounce\": \"troy_ounce\",\n \"troy ounces\": \"troy_ounce\",\n\n // pennyweight\n dwt: \"pennyweight\",\n pennyweight: \"pennyweight\",\n pennyweights: \"pennyweight\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const MASS_UNIT_LIST = Object.keys(MASS_UNITS) as MassUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const MASS_FACTORS: Record<MassUnit, number> = Object.fromEntries(\n Object.entries(MASS_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<MassUnit, number>;\n","/**\n * MassRole - Role para conversão de unidades de massa\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const mass = new MassRole();\n * mass.convert('kilogram', 'pound', 1) // 2.20462\n * mass.cast('kilogram', '100 kg') // 100\n * mass.validate('kilogram', 100) // { valid: true, errors: [] }\n * mass.format('kilogram', 75.5) // \"75.5 kg\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { MASS_UNITS, MASS_ALIASES, type MassUnit } from \"./constants\";\n\n// =============================================================================\n// MASS ROLE CLASS\n// =============================================================================\n\nexport class MassRole extends SimpleRole {\n readonly name = \"mass\";\n readonly base = \"kilogram\";\n readonly units = MASS_UNITS;\n readonly aliases = MASS_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Mass cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da MassRole */\nexport const massRole = new MassRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de massa\n *\n * @example\n * convertMass(1, 'kilogram', 'pound') // 2.20462\n */\nexport function convertMass(\n value: number,\n from: MassUnit,\n to: MassUnit,\n): number {\n return massRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de massa com unidade\n *\n * @example\n * formatMass(75.5, 'kilogram') // \"75.5 kg\"\n * formatMass(75.5, 'kilogram', { verbose: true }) // \"75.5 kilograms\"\n */\nexport function formatMass(\n value: number,\n unit: MassUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return massRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de massa\n *\n * @example\n * validateMass(100) // { valid: true, errors: [] }\n * validateMass(-5) // { valid: false, errors: ['Mass cannot be negative'] }\n */\nexport function validateMass(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return massRole.validate(\"kilogram\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castMass('100 kg') // 100\n * castMass('100') // 100\n * castMass('invalid') // null\n */\nexport function castMass(\n input: unknown,\n targetUnit: MassUnit = \"kilogram\",\n): number | null {\n return massRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castMass que retorna Result\n */\nexport function tryCastMass(\n input: unknown,\n targetUnit: MassUnit = \"kilogram\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return massRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectMassUnit('100 kg') // 'kilogram'\n * detectMassUnit('100 lbs') // 'pound'\n * detectMassUnit('100') // null\n */\nexport function detectMassUnit(input: string): MassUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (massRole as any).detectUnit(unitStr) as MassUnit | null;\n}\n","/**\n * Temperature Role - Constants\n *\n * Fórmulas de conversão, símbolos e aliases para unidades de temperatura.\n *\n * IMPORTANTE: Temperatura usa FÓRMULAS, não fatores multiplicativos.\n * Isso porque as escalas têm offsets diferentes (0°C ≠ 0°F ≠ 0K).\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type TemperatureUnit = \"celsius\" | \"fahrenheit\" | \"kelvin\" | \"rankine\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de temperatura.\n *\n * Base: celsius (°C)\n *\n * Fórmulas de conversão:\n * - Celsius ↔ Fahrenheit: °F = °C × 9/5 + 32\n * - Celsius ↔ Kelvin: K = °C + 273.15\n * - Celsius ↔ Rankine: °R = (°C + 273.15) × 9/5\n *\n * Pontos de referência:\n * | Descrição | Celsius | Fahrenheit | Kelvin | Rankine |\n * |------------------|---------|------------|---------|---------|\n * | Zero absoluto | -273.15 | -459.67 | 0 | 0 |\n * | Congelamento H₂O | 0 | 32 | 273.15 | 491.67 |\n * | Corpo humano | 37 | 98.6 | 310.15 | 558.27 |\n * | Ebulição H₂O | 100 | 212 | 373.15 | 671.67 |\n */\nexport const TEMPERATURE_UNITS: Record<TemperatureUnit, SimpleUnitConfig> = {\n celsius: {\n symbol: \"°C\",\n singular: \"degree Celsius\",\n plural: \"degrees Celsius\",\n toBase: (c: number) => c,\n fromBase: (c: number) => c,\n noSpace: true, // 25°C não 25 °C\n },\n fahrenheit: {\n symbol: \"°F\",\n singular: \"degree Fahrenheit\",\n plural: \"degrees Fahrenheit\",\n toBase: (f: number) => (f - 32) * (5 / 9),\n fromBase: (c: number) => c * (9 / 5) + 32,\n noSpace: true, // 77°F não 77 °F\n },\n kelvin: {\n symbol: \"K\",\n singular: \"kelvin\",\n plural: \"kelvins\",\n toBase: (k: number) => k - 273.15,\n fromBase: (c: number) => c + 273.15,\n // Kelvin usa espaço: \"273 K\" (convenção SI)\n },\n rankine: {\n symbol: \"°R\",\n singular: \"degree Rankine\",\n plural: \"degrees Rankine\",\n toBase: (r: number) => (r - 491.67) * (5 / 9),\n fromBase: (c: number) => (c + 273.15) * (9 / 5),\n noSpace: true, // 500°R não 500 °R\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const TEMPERATURE_ALIASES: UnitAliases = {\n // celsius\n c: \"celsius\",\n \"°c\": \"celsius\",\n celsius: \"celsius\",\n centigrade: \"celsius\",\n grau: \"celsius\",\n graus: \"celsius\",\n\n // fahrenheit\n f: \"fahrenheit\",\n \"°f\": \"fahrenheit\",\n fahrenheit: \"fahrenheit\",\n fahr: \"fahrenheit\",\n\n // kelvin\n k: \"kelvin\",\n kelvin: \"kelvin\",\n kelvins: \"kelvin\",\n\n // rankine\n r: \"rankine\",\n \"°r\": \"rankine\",\n rankine: \"rankine\",\n ra: \"rankine\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const TEMPERATURE_UNIT_LIST = Object.keys(\n TEMPERATURE_UNITS,\n) as TemperatureUnit[];\n\n/**\n * Constantes importantes\n */\nexport const TEMPERATURE_CONSTANTS = {\n /** Zero absoluto em Celsius */\n ABSOLUTE_ZERO_CELSIUS: -273.15,\n /** Zero absoluto em Fahrenheit */\n ABSOLUTE_ZERO_FAHRENHEIT: -459.67,\n /** Offset Celsius → Kelvin */\n CELSIUS_TO_KELVIN_OFFSET: 273.15,\n /** Offset Fahrenheit → Rankine (são a mesma escala, só diferente offset) */\n FAHRENHEIT_TO_RANKINE_OFFSET: 459.67,\n /** Ponto de congelamento da água em Fahrenheit */\n WATER_FREEZING_FAHRENHEIT: 32,\n /** Ponto de ebulição da água em Fahrenheit */\n WATER_BOILING_FAHRENHEIT: 212,\n} as const;\n","/**\n * TemperatureRole - Role para conversão de unidades de temperatura\n *\n * DIFERENTE das outras SimpleRoles: usa FÓRMULAS em vez de fatores.\n * Isso porque escalas de temperatura têm offsets diferentes.\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const temp = new TemperatureRole();\n * temp.convert('celsius', 'fahrenheit', 0) // 32\n * temp.convert('celsius', 'kelvin', 0) // 273.15\n * temp.cast('celsius', '100 °C') // 100\n * temp.validate('kelvin', 300) // { valid: true, errors: [] }\n * temp.format('fahrenheit', 98.6) // \"98.6 °F\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport {\n TEMPERATURE_UNITS,\n TEMPERATURE_ALIASES,\n TEMPERATURE_CONSTANTS,\n type TemperatureUnit,\n} from \"./constants\";\n\n// =============================================================================\n// TEMPERATURE ROLE CLASS\n// =============================================================================\n\nexport class TemperatureRole extends SimpleRole {\n readonly name = \"temperature\";\n readonly base = \"celsius\";\n readonly units = TEMPERATURE_UNITS;\n readonly aliases = TEMPERATURE_ALIASES;\n\n // Temperatura tem validação especial: não pode ser abaixo do zero absoluto\n readonly validation: SimpleValidationConfig = {\n min: TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_CELSIUS,\n minError: \"Temperature cannot be below absolute zero (-273.15°C)\",\n };\n\n /**\n * Override validate para considerar o zero absoluto na escala correta\n */\n validate(\n variant: string,\n value: unknown,\n ): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Tipo\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finito\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Zero absoluto (converte para a escala atual)\n const absoluteZero = this.getAbsoluteZero(variant);\n if (value < absoluteZero) {\n errors.push(\n `Temperature cannot be below absolute zero (${absoluteZero}${this.units[variant]?.symbol || \"\"})`,\n );\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n /**\n * Retorna o zero absoluto na escala especificada\n */\n private getAbsoluteZero(variant: string): number {\n switch (variant) {\n case \"celsius\":\n return TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_CELSIUS;\n case \"fahrenheit\":\n return TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_FAHRENHEIT;\n case \"kelvin\":\n return 0;\n case \"rankine\":\n return 0;\n default:\n return TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_CELSIUS;\n }\n }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da TemperatureRole */\nexport const temperatureRole = new TemperatureRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de temperatura\n *\n * @example\n * convertTemperature(0, 'celsius', 'fahrenheit') // 32\n * convertTemperature(100, 'celsius', 'kelvin') // 373.15\n */\nexport function convertTemperature(\n value: number,\n from: TemperatureUnit,\n to: TemperatureUnit,\n): number {\n return temperatureRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de temperatura com unidade\n *\n * @example\n * formatTemperature(37, 'celsius') // \"37 °C\"\n * formatTemperature(98.6, 'fahrenheit', { verbose: true }) // \"98.6 degrees Fahrenheit\"\n */\nexport function formatTemperature(\n value: number,\n unit: TemperatureUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return temperatureRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de temperatura\n *\n * @example\n * validateTemperature(100, 'celsius') // { valid: true, errors: [] }\n * validateTemperature(-300, 'celsius') // { valid: false, errors: ['...below absolute zero...'] }\n * validateTemperature(-500, 'fahrenheit') // { valid: false, errors: ['...below absolute zero...'] }\n */\nexport function validateTemperature(\n value: unknown,\n unit: TemperatureUnit = \"celsius\",\n): {\n valid: boolean;\n errors: string[];\n} {\n return temperatureRole.validate(unit, value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castTemperature('100 °C') // 100\n * castTemperature('100') // 100\n * castTemperature('invalid') // null\n */\nexport function castTemperature(\n input: unknown,\n targetUnit: TemperatureUnit = \"celsius\",\n): number | null {\n return temperatureRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castTemperature que retorna Result\n */\nexport function tryCastTemperature(\n input: unknown,\n targetUnit: TemperatureUnit = \"celsius\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return temperatureRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectTemperatureUnit('100 °C') // 'celsius'\n * detectTemperatureUnit('100 K') // 'kelvin'\n * detectTemperatureUnit('100') // null\n */\nexport function detectTemperatureUnit(input: string): TemperatureUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (temperatureRole as any).detectUnit(unitStr) as TemperatureUnit | null;\n}\n","/**\n * Angle Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de ângulo.\n *\n * Base: degree (grau) - mais comum em aplicações práticas.\n * Nota: Embora radiano seja a unidade SI, grau é mais intuitivo para a maioria dos casos.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811 (2008)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AngleUnit =\n | \"turn\"\n | \"degree\"\n | \"arcminute\"\n | \"arcsecond\"\n | \"milliarcsecond\"\n | \"radian\"\n | \"milliradian\"\n | \"gradian\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/**\n * Fator exato: 180/π graus por radiano\n * Valor: 57.29577951308232...\n */\nconst DEGREES_PER_RADIAN = 180 / Math.PI;\n\n/**\n * Fator exato: 180/(1000π) graus por milirradiano\n */\nconst DEGREES_PER_MILLIRADIAN = 180 / (1000 * Math.PI);\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de ângulo.\n *\n * Fatores EXATOS:\n * - turn: 360 (definição)\n * - degree: 1 (base)\n * - arcminute: 1/60 (definição)\n * - arcsecond: 1/3600 (definição)\n * - milliarcsecond: 1/3600000 (definição)\n * - gradian: 360/400 = 0.9 (definição)\n * - radian: 180/π (exato por definição matemática)\n * - milliradian: 180/(1000π) (derivado)\n */\nexport const ANGLE_UNITS: Record<AngleUnit, SimpleUnitConfig> = {\n // Volta completa\n turn: {\n factor: 360,\n symbol: \"tr\",\n singular: \"turn\",\n plural: \"turns\",\n },\n\n // Base\n degree: {\n factor: 1,\n symbol: \"°\",\n singular: \"degree\",\n plural: \"degrees\",\n noSpace: true, // 45° não 45 °\n },\n\n // Subdivisões do grau\n arcminute: {\n factor: 1 / 60, // 0.016666...\n symbol: \"′\",\n singular: \"arcminute\",\n plural: \"arcminutes\",\n noSpace: true, // 30′ não 30 ′\n },\n arcsecond: {\n factor: 1 / 3600, // 0.000277...\n symbol: \"″\",\n singular: \"arcsecond\",\n plural: \"arcseconds\",\n noSpace: true, // 45″ não 45 ″\n },\n milliarcsecond: {\n factor: 1 / 3600000, // 2.777...e-7\n symbol: \"mas\",\n singular: \"milliarcsecond\",\n plural: \"milliarcseconds\",\n },\n\n // Radianos (unidade SI)\n radian: {\n factor: DEGREES_PER_RADIAN, // 180/π ≈ 57.2958\n symbol: \"rad\",\n singular: \"radian\",\n plural: \"radians\",\n },\n milliradian: {\n factor: DEGREES_PER_MILLIRADIAN, // 180/(1000π) ≈ 0.0573\n symbol: \"mrad\",\n singular: \"milliradian\",\n plural: \"milliradians\",\n },\n\n // Gradiano (gon)\n gradian: {\n factor: 0.9, // 360/400\n symbol: \"gon\",\n singular: \"gradian\",\n plural: \"gradians\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const ANGLE_ALIASES: UnitAliases = {\n // turn\n tr: \"turn\",\n turn: \"turn\",\n turns: \"turn\",\n rev: \"turn\",\n revolution: \"turn\",\n revolutions: \"turn\",\n volta: \"turn\",\n voltas: \"turn\",\n\n // degree\n \"°\": \"degree\",\n deg: \"degree\",\n degree: \"degree\",\n degrees: \"degree\",\n grau: \"degree\",\n graus: \"degree\",\n\n // arcminute\n \"′\": \"arcminute\",\n \"'\": \"arcminute\",\n arcmin: \"arcminute\",\n arcminute: \"arcminute\",\n arcminutes: \"arcminute\",\n \"minute of arc\": \"arcminute\",\n \"minutes of arc\": \"arcminute\",\n\n // arcsecond\n \"″\": \"arcsecond\",\n '\"': \"arcsecond\",\n arcsec: \"arcsecond\",\n arcsecond: \"arcsecond\",\n arcseconds: \"arcsecond\",\n \"second of arc\": \"arcsecond\",\n \"seconds of arc\": \"arcsecond\",\n\n // milliarcsecond\n mas: \"milliarcsecond\",\n milliarcsecond: \"milliarcsecond\",\n milliarcseconds: \"milliarcsecond\",\n\n // radian\n rad: \"radian\",\n radian: \"radian\",\n radians: \"radian\",\n radiano: \"radian\",\n radianos: \"radian\",\n\n // milliradian\n mrad: \"milliradian\",\n milliradian: \"milliradian\",\n milliradians: \"milliradian\",\n milirradiano: \"milliradian\",\n milirredianos: \"milliradian\",\n\n // gradian\n gon: \"gradian\",\n grad: \"gradian\",\n grade: \"gradian\",\n gradian: \"gradian\",\n gradians: \"gradian\",\n grado: \"gradian\",\n grados: \"gradian\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const ANGLE_UNIT_LIST = Object.keys(ANGLE_UNITS) as AngleUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const ANGLE_FACTORS: Record<AngleUnit, number> = Object.fromEntries(\n Object.entries(ANGLE_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<AngleUnit, number>;\n","/**\n * AngleRole - Role para conversão de unidades de ângulo\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const angle = new AngleRole();\n * angle.convert('degree', 'radian', 180) // π ≈ 3.14159\n * angle.cast('degree', '90°') // 90\n * angle.validate('degree', 90) // { valid: true, errors: [] }\n * angle.format('degree', 45) // \"45°\"\n */\n\nimport { SimpleRole } from \"../../contracts\";\nimport { ANGLE_UNITS, ANGLE_ALIASES, type AngleUnit } from \"./constants\";\n\n// =============================================================================\n// ANGLE ROLE CLASS\n// =============================================================================\n\nexport class AngleRole extends SimpleRole {\n readonly name = \"angle\";\n readonly base = \"degree\";\n readonly units = ANGLE_UNITS;\n readonly aliases = ANGLE_ALIASES;\n\n // Ângulo pode ser negativo (rotação anti-horária) e maior que 360° (múltiplas voltas)\n // Não definimos min/max na validação\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da AngleRole */\nexport const angleRole = new AngleRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de ângulo\n *\n * @example\n * convertAngle(180, 'degree', 'radian') // π ≈ 3.14159\n * convertAngle(1, 'turn', 'degree') // 360\n */\nexport function convertAngle(\n value: number,\n from: AngleUnit,\n to: AngleUnit,\n): number {\n return angleRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de ângulo com unidade\n *\n * @example\n * formatAngle(45, 'degree') // \"45°\"\n * formatAngle(45, 'degree', { verbose: true }) // \"45 degrees\"\n */\nexport function formatAngle(\n value: number,\n unit: AngleUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return angleRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de ângulo\n *\n * @example\n * validateAngle(90) // { valid: true, errors: [] }\n * validateAngle(NaN) // { valid: false, errors: [...] }\n */\nexport function validateAngle(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return angleRole.validate(\"degree\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castAngle('90°') // 90\n * castAngle('90 deg') // 90\n * castAngle('invalid') // null\n */\nexport function castAngle(\n input: unknown,\n targetUnit: AngleUnit = \"degree\",\n): number | null {\n return angleRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castAngle que retorna Result\n */\nexport function tryCastAngle(\n input: unknown,\n targetUnit: AngleUnit = \"degree\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return angleRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectAngleUnit('90°') // 'degree'\n * detectAngleUnit('3.14 rad') // 'radian'\n * detectAngleUnit('100') // null\n */\nexport function detectAngleUnit(input: string): AngleUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (angleRole as any).detectUnit(unitStr) as AngleUnit | null;\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Converte graus para radianos\n *\n * @example\n * degreesToRadians(180) // π ≈ 3.14159\n * degreesToRadians(90) // π/2 ≈ 1.5708\n */\nexport function degreesToRadians(degrees: number): number {\n return angleRole.convert(\"degree\", \"radian\", degrees);\n}\n\n/**\n * Converte radianos para graus\n *\n * @example\n * radiansToDegrees(Math.PI) // 180\n * radiansToDegrees(Math.PI / 2) // 90\n */\nexport function radiansToDegrees(radians: number): number {\n return angleRole.convert(\"radian\", \"degree\", radians);\n}\n\n/**\n * Normaliza ângulo para o intervalo [0, 360)\n *\n * @example\n * normalizeAngle(450) // 90\n * normalizeAngle(-90) // 270\n * normalizeAngle(360) // 0\n */\nexport function normalizeAngle(degrees: number): number {\n const normalized = degrees % 360;\n // Evita -0 (JavaScript tem +0 e -0)\n if (normalized === 0) return 0;\n return normalized < 0 ? normalized + 360 : normalized;\n}\n","/**\n * Energy Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de energia.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n * - CODATA 2018 (electronvolt)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EnergyUnit =\n // SI\n | \"gigajoule\"\n | \"megajoule\"\n | \"kilojoule\"\n | \"joule\"\n | \"millijoule\"\n // Calories\n | \"calorie\"\n | \"kilocalorie\"\n // Watt-hour\n | \"watt_hour\"\n | \"kilowatt_hour\"\n | \"megawatt_hour\"\n | \"gigawatt_hour\"\n // BTU\n | \"btu\"\n | \"therm\"\n // Scientific\n | \"electronvolt\"\n | \"kiloelectronvolt\"\n | \"megaelectronvolt\"\n | \"erg\"\n // Mechanical\n | \"foot_pound\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de energia.\n *\n * Base: joule (J) - unidade SI de energia\n * 1 joule = 1 newton × 1 metro = 1 kg⋅m²/s²\n *\n * Fatores exatos:\n * - SI: prefixos são potências de 10\n * - Calorie (IT): 4.1868 J (International Table, recomendado)\n * - Watt-hour: 3600 J (1 W × 1 h)\n * - BTU (IT): 1055.05585262 J (International Table)\n * - Electronvolt: 1.602176634e-19 J (SI 2019, exato)\n * - Erg: 1e-7 J (CGS)\n */\nexport const ENERGY_UNITS: Record<EnergyUnit, SimpleUnitConfig> = {\n // SI Units (todos exatos)\n gigajoule: {\n factor: 1_000_000_000,\n symbol: \"GJ\",\n singular: \"gigajoule\",\n plural: \"gigajoules\",\n },\n megajoule: {\n factor: 1_000_000,\n symbol: \"MJ\",\n singular: \"megajoule\",\n plural: \"megajoules\",\n },\n kilojoule: {\n factor: 1_000,\n symbol: \"kJ\",\n singular: \"kilojoule\",\n plural: \"kilojoules\",\n },\n joule: {\n factor: 1,\n symbol: \"J\",\n singular: \"joule\",\n plural: \"joules\",\n },\n millijoule: {\n factor: 0.001,\n symbol: \"mJ\",\n singular: \"millijoule\",\n plural: \"millijoules\",\n },\n\n // Calories (International Table - IT)\n // 1 cal (IT) = 4.1868 J (exato por definição)\n calorie: {\n factor: 4.1868,\n symbol: \"cal\",\n singular: \"calorie\",\n plural: \"calories\",\n },\n // 1 kcal = 1000 cal = 4186.8 J (= 1 \"food Calorie\")\n kilocalorie: {\n factor: 4186.8,\n symbol: \"kcal\",\n singular: \"kilocalorie\",\n plural: \"kilocalories\",\n },\n\n // Watt-hour (exatos)\n // 1 Wh = 1 W × 3600 s = 3600 J\n watt_hour: {\n factor: 3600,\n symbol: \"Wh\",\n singular: \"watt-hour\",\n plural: \"watt-hours\",\n },\n kilowatt_hour: {\n factor: 3_600_000,\n symbol: \"kWh\",\n singular: \"kilowatt-hour\",\n plural: \"kilowatt-hours\",\n },\n megawatt_hour: {\n factor: 3_600_000_000,\n symbol: \"MWh\",\n singular: \"megawatt-hour\",\n plural: \"megawatt-hours\",\n },\n gigawatt_hour: {\n factor: 3_600_000_000_000,\n symbol: \"GWh\",\n singular: \"gigawatt-hour\",\n plural: \"gigawatt-hours\",\n },\n\n // BTU (International Table)\n // 1 BTU (IT) = 1055.05585262 J (definição)\n btu: {\n factor: 1055.05585262,\n symbol: \"BTU\",\n singular: \"BTU\",\n plural: \"BTUs\",\n },\n // 1 therm = 100,000 BTU (IT)\n therm: {\n factor: 105505585.262,\n symbol: \"thm\",\n singular: \"therm\",\n plural: \"therms\",\n },\n\n // Scientific\n // 1 eV = 1.602176634e-19 J (SI 2019, exato por definição)\n electronvolt: {\n factor: 1.602176634e-19,\n symbol: \"eV\",\n singular: \"electronvolt\",\n plural: \"electronvolts\",\n },\n kiloelectronvolt: {\n factor: 1.602176634e-16,\n symbol: \"keV\",\n singular: \"kiloelectronvolt\",\n plural: \"kiloelectronvolts\",\n },\n megaelectronvolt: {\n factor: 1.602176634e-13,\n symbol: \"MeV\",\n singular: \"megaelectronvolt\",\n plural: \"megaelectronvolts\",\n },\n // 1 erg = 1e-7 J (CGS, exato)\n erg: {\n factor: 1e-7,\n symbol: \"erg\",\n singular: \"erg\",\n plural: \"ergs\",\n },\n\n // Mechanical\n // 1 ft⋅lbf = 1.3558179483314004 J (derivado de foot e pound-force)\n foot_pound: {\n factor: 1.3558179483314004,\n symbol: \"ft⋅lbf\",\n singular: \"foot-pound\",\n plural: \"foot-pounds\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const ENERGY_ALIASES: UnitAliases = {\n // gigajoule\n gj: \"gigajoule\",\n gigajoule: \"gigajoule\",\n gigajoules: \"gigajoule\",\n\n // megajoule\n mj: \"megajoule\",\n megajoule: \"megajoule\",\n megajoules: \"megajoule\",\n\n // kilojoule\n kj: \"kilojoule\",\n kilojoule: \"kilojoule\",\n kilojoules: \"kilojoule\",\n\n // joule\n j: \"joule\",\n joule: \"joule\",\n joules: \"joule\",\n\n // millijoule\n \"mj \": \"millijoule\", // note: conflict with megajoule, use context\n millijoule: \"millijoule\",\n millijoules: \"millijoule\",\n\n // calorie\n cal: \"calorie\",\n calorie: \"calorie\",\n calories: \"calorie\",\n caloria: \"calorie\",\n calorias: \"calorie\",\n\n // kilocalorie\n kcal: \"kilocalorie\",\n kilocalorie: \"kilocalorie\",\n kilocalories: \"kilocalorie\",\n quilocaloria: \"kilocalorie\",\n quilocalorias: \"kilocalorie\",\n caloria_alimentar: \"kilocalorie\",\n \"food calorie\": \"kilocalorie\",\n \"food calories\": \"kilocalorie\",\n Calorie: \"kilocalorie\", // big C = kcal\n Calories: \"kilocalorie\",\n Cal: \"kilocalorie\",\n\n // watt_hour\n wh: \"watt_hour\",\n \"watt-hour\": \"watt_hour\",\n \"watt-hours\": \"watt_hour\",\n \"watt hour\": \"watt_hour\",\n \"watt hours\": \"watt_hour\",\n\n // kilowatt_hour\n kwh: \"kilowatt_hour\",\n \"kw-h\": \"kilowatt_hour\",\n \"kw h\": \"kilowatt_hour\",\n \"kilowatt-hour\": \"kilowatt_hour\",\n \"kilowatt-hours\": \"kilowatt_hour\",\n \"kilowatt hour\": \"kilowatt_hour\",\n \"kilowatt hours\": \"kilowatt_hour\",\n\n // megawatt_hour\n mwh: \"megawatt_hour\",\n \"megawatt-hour\": \"megawatt_hour\",\n \"megawatt-hours\": \"megawatt_hour\",\n\n // gigawatt_hour\n gwh: \"gigawatt_hour\",\n \"gigawatt-hour\": \"gigawatt_hour\",\n \"gigawatt-hours\": \"gigawatt_hour\",\n\n // btu\n btu: \"btu\",\n btus: \"btu\",\n \"british thermal unit\": \"btu\",\n \"british thermal units\": \"btu\",\n\n // therm\n thm: \"therm\",\n therm: \"therm\",\n therms: \"therm\",\n\n // electronvolt\n ev: \"electronvolt\",\n electronvolt: \"electronvolt\",\n electronvolts: \"electronvolt\",\n \"electron-volt\": \"electronvolt\",\n \"electron-volts\": \"electronvolt\",\n \"electron volt\": \"electronvolt\",\n \"electron volts\": \"electronvolt\",\n\n // kiloelectronvolt\n kev: \"kiloelectronvolt\",\n kiloelectronvolt: \"kiloelectronvolt\",\n kiloelectronvolts: \"kiloelectronvolt\",\n\n // megaelectronvolt\n mev: \"megaelectronvolt\",\n megaelectronvolt: \"megaelectronvolt\",\n megaelectronvolts: \"megaelectronvolt\",\n\n // erg\n erg: \"erg\",\n ergs: \"erg\",\n\n // foot_pound\n \"ft-lb\": \"foot_pound\",\n \"ft-lbf\": \"foot_pound\",\n \"ft⋅lbf\": \"foot_pound\",\n \"ft·lbf\": \"foot_pound\",\n \"foot-pound\": \"foot_pound\",\n \"foot-pounds\": \"foot_pound\",\n \"foot pound\": \"foot_pound\",\n \"foot pounds\": \"foot_pound\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const ENERGY_UNIT_LIST = Object.keys(ENERGY_UNITS) as EnergyUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const ENERGY_FACTORS: Record<EnergyUnit, number> = Object.fromEntries(\n Object.entries(ENERGY_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<EnergyUnit, number>;\n","/**\n * EnergyRole - Role para conversão de unidades de energia\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const energy = new EnergyRole();\n * energy.convert('kilocalorie', 'kilojoule', 1) // 4.1868\n * energy.cast('joule', '100 J') // 100\n * energy.validate('joule', 100) // { valid: true, errors: [] }\n * energy.format('kilowatt_hour', 2.5) // \"2.5 kWh\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { ENERGY_UNITS, ENERGY_ALIASES, type EnergyUnit } from \"./constants\";\n\n// =============================================================================\n// ENERGY ROLE CLASS\n// =============================================================================\n\nexport class EnergyRole extends SimpleRole {\n readonly name = \"energy\";\n readonly base = \"joule\";\n readonly units = ENERGY_UNITS;\n readonly aliases = ENERGY_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Energy cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da EnergyRole */\nexport const energyRole = new EnergyRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de energia\n *\n * @example\n * convertEnergy(1, 'kilocalorie', 'kilojoule') // 4.1868\n * convertEnergy(1, 'kilowatt_hour', 'megajoule') // 3.6\n */\nexport function convertEnergy(\n value: number,\n from: EnergyUnit,\n to: EnergyUnit,\n): number {\n return energyRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de energia com unidade\n *\n * @example\n * formatEnergy(2.5, 'kilowatt_hour') // \"2.5 kWh\"\n * formatEnergy(2.5, 'kilowatt_hour', { verbose: true }) // \"2.5 kilowatt-hours\"\n */\nexport function formatEnergy(\n value: number,\n unit: EnergyUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return energyRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de energia\n *\n * @example\n * validateEnergy(100) // { valid: true, errors: [] }\n * validateEnergy(-5) // { valid: false, errors: ['Energy cannot be negative'] }\n */\nexport function validateEnergy(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return energyRole.validate(\"joule\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castEnergy('100 kWh') // 100\n * castEnergy('100') // 100\n * castEnergy('invalid') // null\n */\nexport function castEnergy(\n input: unknown,\n targetUnit: EnergyUnit = \"joule\",\n): number | null {\n return energyRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castEnergy que retorna Result\n */\nexport function tryCastEnergy(\n input: unknown,\n targetUnit: EnergyUnit = \"joule\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return energyRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectEnergyUnit('100 kWh') // 'kilowatt_hour'\n * detectEnergyUnit('100 BTU') // 'btu'\n * detectEnergyUnit('100') // null\n */\nexport function detectEnergyUnit(input: string): EnergyUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (energyRole as any).detectUnit(unitStr) as EnergyUnit | null;\n}\n","/**\n * Power Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de potência.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type PowerUnit =\n // SI\n | \"gigawatt\"\n | \"megawatt\"\n | \"kilowatt\"\n | \"watt\"\n | \"milliwatt\"\n | \"microwatt\"\n // Horsepower\n | \"horsepower_mechanical\"\n | \"horsepower_metric\"\n | \"horsepower_electric\"\n | \"horsepower_boiler\"\n // BTU-based\n | \"btu_per_hour\"\n | \"btu_per_second\"\n // Other\n | \"ton_of_refrigeration\"\n | \"foot_pound_per_second\"\n | \"calorie_per_second\"\n | \"kilocalorie_per_hour\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de potência.\n *\n * Base: watt (W) - unidade SI de potência\n * 1 watt = 1 joule por segundo = 1 kg⋅m²/s³\n *\n * Cavalos-vapor (existem várias definições):\n * - Mechanical (imperial): 550 ft⋅lbf/s = 745.69987158227 W\n * - Metric (PS, CV, pk): 75 kgf⋅m/s = 735.49875 W (exato)\n * - Electrical: 746 W (exato por definição)\n * - Boiler: 9809.5 W (33,475 BTU/h)\n */\nexport const POWER_UNITS: Record<PowerUnit, SimpleUnitConfig> = {\n // SI Units (todos exatos)\n gigawatt: {\n factor: 1_000_000_000,\n symbol: \"GW\",\n singular: \"gigawatt\",\n plural: \"gigawatts\",\n },\n megawatt: {\n factor: 1_000_000,\n symbol: \"MW\",\n singular: \"megawatt\",\n plural: \"megawatts\",\n },\n kilowatt: {\n factor: 1_000,\n symbol: \"kW\",\n singular: \"kilowatt\",\n plural: \"kilowatts\",\n },\n watt: {\n factor: 1,\n symbol: \"W\",\n singular: \"watt\",\n plural: \"watts\",\n },\n milliwatt: {\n factor: 0.001,\n symbol: \"mW\",\n singular: \"milliwatt\",\n plural: \"milliwatts\",\n },\n microwatt: {\n factor: 0.000001,\n symbol: \"μW\",\n singular: \"microwatt\",\n plural: \"microwatts\",\n },\n\n // Horsepower variants\n // Mechanical (imperial): 550 ft⋅lbf/s\n // = 550 × 0.3048 m × 4.4482216152605 N / s = 745.69987158227 W\n horsepower_mechanical: {\n factor: 745.69987158227,\n symbol: \"hp\",\n singular: \"horsepower\",\n plural: \"horsepower\",\n },\n // Metric (PS, CV, pk): 75 kgf⋅m/s = 75 × 9.80665 W = 735.49875 W (exato)\n horsepower_metric: {\n factor: 735.49875,\n symbol: \"PS\",\n singular: \"metric horsepower\",\n plural: \"metric horsepower\",\n },\n // Electrical: 746 W (exato por definição)\n horsepower_electric: {\n factor: 746,\n symbol: \"hp(E)\",\n singular: \"electric horsepower\",\n plural: \"electric horsepower\",\n },\n // Boiler: 33,475 BTU/h = 9809.5 W\n horsepower_boiler: {\n factor: 9809.5,\n symbol: \"hp(S)\",\n singular: \"boiler horsepower\",\n plural: \"boiler horsepower\",\n },\n\n // BTU-based\n // 1 BTU/h = 1055.05585262 J / 3600 s = 0.29307107017222 W\n btu_per_hour: {\n factor: 0.29307107017222,\n symbol: \"BTU/h\",\n singular: \"BTU per hour\",\n plural: \"BTUs per hour\",\n },\n // 1 BTU/s = 1055.05585262 W\n btu_per_second: {\n factor: 1055.05585262,\n symbol: \"BTU/s\",\n singular: \"BTU per second\",\n plural: \"BTUs per second\",\n },\n\n // Other\n // 1 ton of refrigeration = 12000 BTU/h = 3516.8528420667 W\n ton_of_refrigeration: {\n factor: 3516.8528420667,\n symbol: \"TR\",\n singular: \"ton of refrigeration\",\n plural: \"tons of refrigeration\",\n },\n // 1 ft⋅lbf/s = 1.3558179483314004 W\n foot_pound_per_second: {\n factor: 1.3558179483314004,\n symbol: \"ft⋅lbf/s\",\n singular: \"foot-pound per second\",\n plural: \"foot-pounds per second\",\n },\n // 1 cal/s = 4.1868 W\n calorie_per_second: {\n factor: 4.1868,\n symbol: \"cal/s\",\n singular: \"calorie per second\",\n plural: \"calories per second\",\n },\n // 1 kcal/h = 4186.8 / 3600 = 1.163 W\n kilocalorie_per_hour: {\n factor: 1.163,\n symbol: \"kcal/h\",\n singular: \"kilocalorie per hour\",\n plural: \"kilocalories per hour\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const POWER_ALIASES: UnitAliases = {\n // gigawatt\n gw: \"gigawatt\",\n gigawatt: \"gigawatt\",\n gigawatts: \"gigawatt\",\n\n // megawatt\n mw: \"megawatt\",\n megawatt: \"megawatt\",\n megawatts: \"megawatt\",\n\n // kilowatt\n kw: \"kilowatt\",\n kilowatt: \"kilowatt\",\n kilowatts: \"kilowatt\",\n\n // watt\n w: \"watt\",\n watt: \"watt\",\n watts: \"watt\",\n\n // milliwatt\n milliwatt: \"milliwatt\",\n milliwatts: \"milliwatt\",\n\n // microwatt\n μw: \"microwatt\",\n uw: \"microwatt\",\n microwatt: \"microwatt\",\n microwatts: \"microwatt\",\n\n // horsepower_mechanical\n hp: \"horsepower_mechanical\",\n horsepower: \"horsepower_mechanical\",\n \"horse power\": \"horsepower_mechanical\",\n \"cavalo-vapor\": \"horsepower_mechanical\",\n\n // horsepower_metric\n ps: \"horsepower_metric\",\n cv: \"horsepower_metric\",\n pk: \"horsepower_metric\",\n \"metric horsepower\": \"horsepower_metric\",\n \"cavalo-vapor métrico\": \"horsepower_metric\",\n pferdestärke: \"horsepower_metric\",\n\n // horsepower_electric\n \"hp(e)\": \"horsepower_electric\",\n \"electric horsepower\": \"horsepower_electric\",\n \"electrical horsepower\": \"horsepower_electric\",\n\n // horsepower_boiler\n \"hp(s)\": \"horsepower_boiler\",\n \"boiler horsepower\": \"horsepower_boiler\",\n bhp: \"horsepower_boiler\",\n\n // btu_per_hour\n \"btu/h\": \"btu_per_hour\",\n \"btu/hr\": \"btu_per_hour\",\n btuh: \"btu_per_hour\",\n \"btu per hour\": \"btu_per_hour\",\n \"btus per hour\": \"btu_per_hour\",\n\n // btu_per_second\n \"btu/s\": \"btu_per_second\",\n \"btu per second\": \"btu_per_second\",\n\n // ton_of_refrigeration\n tr: \"ton_of_refrigeration\",\n rt: \"ton_of_refrigeration\",\n \"ton of refrigeration\": \"ton_of_refrigeration\",\n \"tons of refrigeration\": \"ton_of_refrigeration\",\n \"refrigeration ton\": \"ton_of_refrigeration\",\n \"refrigeration tons\": \"ton_of_refrigeration\",\n\n // foot_pound_per_second\n \"ft-lb/s\": \"foot_pound_per_second\",\n \"ft-lbf/s\": \"foot_pound_per_second\",\n \"ft⋅lbf/s\": \"foot_pound_per_second\",\n \"ft·lbf/s\": \"foot_pound_per_second\",\n \"foot-pound per second\": \"foot_pound_per_second\",\n \"foot-pounds per second\": \"foot_pound_per_second\",\n\n // calorie_per_second\n \"cal/s\": \"calorie_per_second\",\n \"calorie per second\": \"calorie_per_second\",\n \"calories per second\": \"calorie_per_second\",\n\n // kilocalorie_per_hour\n \"kcal/h\": \"kilocalorie_per_hour\",\n \"kcal/hr\": \"kilocalorie_per_hour\",\n \"kilocalorie per hour\": \"kilocalorie_per_hour\",\n \"kilocalories per hour\": \"kilocalorie_per_hour\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const POWER_UNIT_LIST = Object.keys(POWER_UNITS) as PowerUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const POWER_FACTORS: Record<PowerUnit, number> = Object.fromEntries(\n Object.entries(POWER_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<PowerUnit, number>;\n","/**\n * PowerRole - Role para conversão de unidades de potência\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const power = new PowerRole();\n * power.convert('horsepower_mechanical', 'kilowatt', 1) // 0.7457\n * power.cast('watt', '100 W') // 100\n * power.validate('watt', 100) // { valid: true, errors: [] }\n * power.format('kilowatt', 2.5) // \"2.5 kW\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { POWER_UNITS, POWER_ALIASES, type PowerUnit } from \"./constants\";\n\n// =============================================================================\n// POWER ROLE CLASS\n// =============================================================================\n\nexport class PowerRole extends SimpleRole {\n readonly name = \"power\";\n readonly base = \"watt\";\n readonly units = POWER_UNITS;\n readonly aliases = POWER_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Power cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da PowerRole */\nexport const powerRole = new PowerRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de potência\n *\n * @example\n * convertPower(1, 'horsepower_mechanical', 'kilowatt') // 0.7457\n * convertPower(1000, 'watt', 'kilowatt') // 1\n */\nexport function convertPower(\n value: number,\n from: PowerUnit,\n to: PowerUnit,\n): number {\n return powerRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de potência com unidade\n *\n * @example\n * formatPower(2.5, 'kilowatt') // \"2.5 kW\"\n * formatPower(2.5, 'kilowatt', { verbose: true }) // \"2.5 kilowatts\"\n */\nexport function formatPower(\n value: number,\n unit: PowerUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return powerRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de potência\n *\n * @example\n * validatePower(100) // { valid: true, errors: [] }\n * validatePower(-5) // { valid: false, errors: ['Power cannot be negative'] }\n */\nexport function validatePower(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return powerRole.validate(\"watt\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castPower('100 kW') // 100\n * castPower('100') // 100\n * castPower('invalid') // null\n */\nexport function castPower(\n input: unknown,\n targetUnit: PowerUnit = \"watt\",\n): number | null {\n return powerRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castPower que retorna Result\n */\nexport function tryCastPower(\n input: unknown,\n targetUnit: PowerUnit = \"watt\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return powerRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectPowerUnit('100 kW') // 'kilowatt'\n * detectPowerUnit('100 hp') // 'horsepower_mechanical'\n * detectPowerUnit('100') // null\n */\nexport function detectPowerUnit(input: string): PowerUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (powerRole as any).detectUnit(unitStr) as PowerUnit | null;\n}\n","/**\n * Speed Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de velocidade.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n * - International Yard and Pound Agreement (1959)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type SpeedUnit =\n // SI\n | \"meter_per_second\"\n | \"kilometer_per_hour\"\n // Imperial/US\n | \"mile_per_hour\"\n | \"foot_per_second\"\n // Nautical\n | \"knot\"\n // Scientific\n | \"mach\"\n | \"speed_of_light\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de velocidade.\n *\n * Fatores exatos:\n * - km/h = 1000/3600 m/s = 0.277777... m/s\n * - mph = 1609.344/3600 m/s = 0.44704 m/s (exato, derivado de mile)\n * - ft/s = 0.3048 m/s (exato, derivado de foot)\n * - knot = 1852/3600 m/s = 0.514444... m/s (exato, derivado de nautical mile)\n *\n * Fatores aproximados:\n * - Mach: varia com temperatura/altitude, usando 340.29 m/s (nível do mar, 15°C)\n * - Velocidade da luz: exato por definição SI (299792458 m/s)\n */\nexport const SPEED_UNITS: Record<SpeedUnit, SimpleUnitConfig> = {\n // SI Units\n meter_per_second: {\n factor: 1,\n symbol: \"m/s\",\n singular: \"meter per second\",\n plural: \"meters per second\",\n },\n kilometer_per_hour: {\n factor: 1000 / 3600, // 0.277777...\n symbol: \"km/h\",\n singular: \"kilometer per hour\",\n plural: \"kilometers per hour\",\n },\n\n // Imperial/US (exatos desde 1959)\n mile_per_hour: {\n factor: 0.44704, // 1609.344 / 3600 (exato)\n symbol: \"mph\",\n singular: \"mile per hour\",\n plural: \"miles per hour\",\n },\n foot_per_second: {\n factor: 0.3048, // exato\n symbol: \"ft/s\",\n singular: \"foot per second\",\n plural: \"feet per second\",\n },\n\n // Nautical (exato)\n knot: {\n factor: 1852 / 3600, // 0.514444...\n symbol: \"kn\",\n singular: \"knot\",\n plural: \"knots\",\n },\n\n // Scientific\n mach: {\n factor: 340.29, // velocidade do som ao nível do mar, 15°C (aproximado)\n symbol: \"Ma\",\n singular: \"mach\",\n plural: \"mach\",\n },\n speed_of_light: {\n factor: 299792458, // exato por definição SI\n symbol: \"c\",\n singular: \"speed of light\",\n plural: \"speed of light\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const SPEED_ALIASES: UnitAliases = {\n // meter_per_second\n \"m/s\": \"meter_per_second\",\n mps: \"meter_per_second\",\n \"meter per second\": \"meter_per_second\",\n \"meters per second\": \"meter_per_second\",\n \"metro por segundo\": \"meter_per_second\",\n \"metros por segundo\": \"meter_per_second\",\n\n // kilometer_per_hour\n \"km/h\": \"kilometer_per_hour\",\n kmh: \"kilometer_per_hour\",\n kph: \"kilometer_per_hour\",\n \"kilometer per hour\": \"kilometer_per_hour\",\n \"kilometers per hour\": \"kilometer_per_hour\",\n \"kilometre per hour\": \"kilometer_per_hour\",\n \"kilometres per hour\": \"kilometer_per_hour\",\n \"quilômetro por hora\": \"kilometer_per_hour\",\n \"quilômetros por hora\": \"kilometer_per_hour\",\n\n // mile_per_hour\n mph: \"mile_per_hour\",\n \"mi/h\": \"mile_per_hour\",\n \"mile per hour\": \"mile_per_hour\",\n \"miles per hour\": \"mile_per_hour\",\n \"milha por hora\": \"mile_per_hour\",\n \"milhas por hora\": \"mile_per_hour\",\n\n // foot_per_second\n \"ft/s\": \"foot_per_second\",\n fps: \"foot_per_second\",\n \"foot per second\": \"foot_per_second\",\n \"feet per second\": \"foot_per_second\",\n \"pé por segundo\": \"foot_per_second\",\n \"pés por segundo\": \"foot_per_second\",\n\n // knot\n kn: \"knot\",\n kt: \"knot\",\n kts: \"knot\",\n knot: \"knot\",\n knots: \"knot\",\n nó: \"knot\",\n nós: \"knot\",\n\n // mach\n ma: \"mach\",\n mach: \"mach\",\n\n // speed_of_light\n c: \"speed_of_light\",\n \"speed of light\": \"speed_of_light\",\n \"velocidade da luz\": \"speed_of_light\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const SPEED_UNIT_LIST = Object.keys(SPEED_UNITS) as SpeedUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const SPEED_FACTORS: Record<SpeedUnit, number> = Object.fromEntries(\n Object.entries(SPEED_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<SpeedUnit, number>;\n","/**\n * SpeedRole - Role para conversão de unidades de velocidade\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const speed = new SpeedRole();\n * speed.convert('kilometer_per_hour', 'mile_per_hour', 100) // 62.1371\n * speed.cast('meter_per_second', '100 km/h') // 27.7778\n * speed.validate('meter_per_second', 100) // { valid: true, errors: [] }\n * speed.format('kilometer_per_hour', 120) // \"120 km/h\"\n */\n\nimport { SimpleRole } from \"../../contracts\";\nimport { SPEED_UNITS, SPEED_ALIASES, type SpeedUnit } from \"./constants\";\n\n// =============================================================================\n// SPEED ROLE CLASS\n// =============================================================================\n\nexport class SpeedRole extends SimpleRole {\n readonly name = \"speed\";\n readonly base = \"meter_per_second\";\n readonly units = SPEED_UNITS;\n readonly aliases = SPEED_ALIASES;\n\n // Speed pode ser negativo (movimento em direção oposta)\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da SpeedRole */\nexport const speedRole = new SpeedRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de velocidade\n *\n * @example\n * convertSpeed(100, 'kilometer_per_hour', 'mile_per_hour') // 62.1371\n */\nexport function convertSpeed(\n value: number,\n from: SpeedUnit,\n to: SpeedUnit,\n): number {\n return speedRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de velocidade com unidade\n *\n * @example\n * formatSpeed(120, 'kilometer_per_hour') // \"120 km/h\"\n * formatSpeed(120, 'kilometer_per_hour', { verbose: true }) // \"120 kilometers per hour\"\n */\nexport function formatSpeed(\n value: number,\n unit: SpeedUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return speedRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de velocidade\n *\n * @example\n * validateSpeed(100) // { valid: true, errors: [] }\n */\nexport function validateSpeed(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return speedRole.validate(\"meter_per_second\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castSpeed('100 km/h') // 100\n * castSpeed('100') // 100\n * castSpeed('invalid') // null\n */\nexport function castSpeed(\n input: unknown,\n targetUnit: SpeedUnit = \"meter_per_second\",\n): number | null {\n return speedRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castSpeed que retorna Result\n */\nexport function tryCastSpeed(\n input: unknown,\n targetUnit: SpeedUnit = \"meter_per_second\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return speedRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectSpeedUnit('100 km/h') // 'kilometer_per_hour'\n * detectSpeedUnit('60 mph') // 'mile_per_hour'\n * detectSpeedUnit('100') // null\n */\nexport function detectSpeedUnit(input: string): SpeedUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (speedRole as any).detectUnit(unitStr) as SpeedUnit | null;\n}\n","/**\n * IsoVariant - Variante ISO 8601 para Date\n *\n * Representa data como string ISO 8601.\n *\n * @example\n * \"2024-12-05T19:30:00.000Z\"\n * \"2024-12-05T19:30:00.000-03:00\"\n * \"2024-12-05\"\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { DateIso, DateTimestamp, DateFormatOptions } from \"../types\";\n\n// Regex para validar ISO 8601 (formatos comuns)\nconst ISO_FULL_REGEX =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?(Z|[+-]\\d{2}:\\d{2})?$/;\nconst ISO_DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst ISO_DATE_TIME_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\n\nexport class IsoVariant extends BaseVariant<DateIso, DateTimestamp> {\n readonly name = \"iso\";\n readonly type = \"string\" as const;\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n toBase(value: DateIso): DateTimestamp {\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n throw new Error(`Invalid ISO date: ${value}`);\n }\n return date.getTime();\n }\n\n fromBase(base: DateTimestamp): DateIso {\n const date = new Date(base);\n if (isNaN(date.getTime())) {\n throw new Error(`Invalid timestamp: ${base}`);\n }\n return date.toISOString();\n }\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n cast(input: unknown): DateIso | null {\n // Já é string\n if (typeof input === \"string\") {\n const trimmed = input.trim();\n\n // Tenta parsear\n const date = new Date(trimmed);\n if (!isNaN(date.getTime())) {\n return date.toISOString();\n }\n\n return null;\n }\n\n // Número (timestamp)\n if (typeof input === \"number\") {\n if (!Number.isFinite(input)) return null;\n const date = new Date(input);\n if (!isNaN(date.getTime())) {\n return date.toISOString();\n }\n return null;\n }\n\n // Date object\n if (input instanceof Date) {\n if (isNaN(input.getTime())) return null;\n return input.toISOString();\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n validate(value: DateIso): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"string\") {\n errors.push(\"ISO date must be a string\");\n return { valid: false, errors };\n }\n\n const trimmed = value.trim();\n\n // Verifica se é um formato ISO válido\n if (\n !ISO_DATE_TIME_REGEX.test(trimmed) &&\n !ISO_DATE_ONLY_REGEX.test(trimmed)\n ) {\n errors.push(\"Invalid ISO 8601 format\");\n return { valid: false, errors };\n }\n\n // Verifica se a data é parseável\n const date = new Date(trimmed);\n if (isNaN(date.getTime())) {\n errors.push(\"Invalid date value\");\n return { valid: false, errors };\n }\n\n return { valid: true, errors: [] };\n }\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n format(value: DateIso, options?: FormatOptions): string {\n const opts = options as DateFormatOptions | undefined;\n const date = new Date(value);\n\n if (isNaN(date.getTime())) {\n return \"Invalid Date\";\n }\n\n // Se não especificar opções, retorna o ISO string\n if (\n !opts ||\n (!opts.dateStyle && !opts.timeStyle && !opts.dateOnly && !opts.timeOnly)\n ) {\n return value;\n }\n\n const locale = opts.locale || \"en-US\";\n const formatOptions: Intl.DateTimeFormatOptions = {};\n\n if (opts.timeZone) {\n formatOptions.timeZone = opts.timeZone;\n }\n\n if (opts.dateOnly) {\n formatOptions.dateStyle = opts.dateStyle || \"medium\";\n } else if (opts.timeOnly) {\n formatOptions.timeStyle = opts.timeStyle || \"medium\";\n } else {\n if (opts.dateStyle) formatOptions.dateStyle = opts.dateStyle;\n if (opts.timeStyle) formatOptions.timeStyle = opts.timeStyle;\n }\n\n return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n }\n}\n","/**\n * TimestampVariant - Variante base para Date\n *\n * Representa data como milissegundos desde epoch (como JavaScript Date.getTime())\n *\n * @example\n * 1733425800000 // 2024-12-05T19:30:00.000Z\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { DateTimestamp, DateFormatOptions } from \"../types\";\n\nexport class TimestampVariant extends BaseVariant<\n DateTimestamp,\n DateTimestamp\n> {\n readonly name = \"timestamp\";\n readonly type = \"number\" as const;\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n toBase(value: DateTimestamp): DateTimestamp {\n return value;\n }\n\n fromBase(base: DateTimestamp): DateTimestamp {\n return base;\n }\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n cast(input: unknown): DateTimestamp | null {\n // Já é número\n if (typeof input === \"number\") {\n if (!Number.isFinite(input)) return null;\n return input;\n }\n\n // String numérica\n if (typeof input === \"string\") {\n const trimmed = input.trim();\n\n // String numérica pura\n if (/^-?\\d+$/.test(trimmed)) {\n const num = parseInt(trimmed, 10);\n if (Number.isFinite(num)) return num;\n }\n\n // Tenta parsear como ISO date\n const date = new Date(trimmed);\n if (!isNaN(date.getTime())) {\n return date.getTime();\n }\n\n return null;\n }\n\n // Date object\n if (input instanceof Date) {\n const ts = input.getTime();\n return isNaN(ts) ? null : ts;\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n validate(value: DateTimestamp): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"number\") {\n errors.push(\"Timestamp must be a number\");\n return { valid: false, errors };\n }\n\n if (!Number.isFinite(value)) {\n errors.push(\"Timestamp must be a finite number\");\n return { valid: false, errors };\n }\n\n if (!Number.isInteger(value)) {\n errors.push(\"Timestamp must be an integer\");\n return { valid: false, errors };\n }\n\n return { valid: true, errors: [] };\n }\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n format(value: DateTimestamp, options?: FormatOptions): string {\n const opts = options as DateFormatOptions | undefined;\n const date = new Date(value);\n\n if (isNaN(date.getTime())) {\n return \"Invalid Date\";\n }\n\n // Se não especificar opções, retorna o timestamp como string\n if (\n !opts ||\n (!opts.dateStyle && !opts.timeStyle && !opts.dateOnly && !opts.timeOnly)\n ) {\n return String(value);\n }\n\n const locale = opts.locale || \"en-US\";\n const formatOptions: Intl.DateTimeFormatOptions = {};\n\n if (opts.timeZone) {\n formatOptions.timeZone = opts.timeZone;\n }\n\n if (opts.dateOnly) {\n formatOptions.dateStyle = opts.dateStyle || \"medium\";\n } else if (opts.timeOnly) {\n formatOptions.timeStyle = opts.timeStyle || \"medium\";\n } else {\n if (opts.dateStyle) formatOptions.dateStyle = opts.dateStyle;\n if (opts.timeStyle) formatOptions.timeStyle = opts.timeStyle;\n }\n\n return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n }\n}\n","/**\n * EpochVariant - Variante Unix Epoch para Date\n *\n * Representa data como segundos desde epoch (Unix timestamp).\n *\n * @example\n * 1733425800 // 2024-12-05T19:30:00Z\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { DateEpoch, DateTimestamp, DateFormatOptions } from \"../types\";\n\nexport class EpochVariant extends BaseVariant<DateEpoch, DateTimestamp> {\n readonly name = \"epoch\";\n readonly type = \"number\" as const;\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n toBase(value: DateEpoch): DateTimestamp {\n // Epoch (segundos) → timestamp (milissegundos)\n return value * 1000;\n }\n\n fromBase(base: DateTimestamp): DateEpoch {\n // timestamp (milissegundos) → epoch (segundos)\n return Math.floor(base / 1000);\n }\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n cast(input: unknown): DateEpoch | null {\n // Já é número\n if (typeof input === \"number\") {\n if (!Number.isFinite(input)) return null;\n // Se parece ser milissegundos (> 1e10), converte para segundos\n if (Math.abs(input) > 1e11) {\n return Math.floor(input / 1000);\n }\n return Math.floor(input);\n }\n\n // String numérica\n if (typeof input === \"string\") {\n const trimmed = input.trim();\n\n // String numérica pura\n if (/^-?\\d+$/.test(trimmed)) {\n const num = parseInt(trimmed, 10);\n if (Number.isFinite(num)) {\n // Se parece ser milissegundos (> 1e10), converte para segundos\n if (Math.abs(num) > 1e11) {\n return Math.floor(num / 1000);\n }\n return num;\n }\n }\n\n // Tenta parsear como ISO date e converter\n const date = new Date(trimmed);\n if (!isNaN(date.getTime())) {\n return Math.floor(date.getTime() / 1000);\n }\n\n return null;\n }\n\n // Date object\n if (input instanceof Date) {\n const ts = input.getTime();\n return isNaN(ts) ? null : Math.floor(ts / 1000);\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n validate(value: DateEpoch): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"number\") {\n errors.push(\"Epoch must be a number\");\n return { valid: false, errors };\n }\n\n if (!Number.isFinite(value)) {\n errors.push(\"Epoch must be a finite number\");\n return { valid: false, errors };\n }\n\n if (!Number.isInteger(value)) {\n errors.push(\"Epoch must be an integer\");\n return { valid: false, errors };\n }\n\n return { valid: true, errors: [] };\n }\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n format(value: DateEpoch, options?: FormatOptions): string {\n const opts = options as DateFormatOptions | undefined;\n const date = new Date(value * 1000);\n\n if (isNaN(date.getTime())) {\n return \"Invalid Date\";\n }\n\n // Se não especificar opções, retorna o epoch como string\n if (\n !opts ||\n (!opts.dateStyle && !opts.timeStyle && !opts.dateOnly && !opts.timeOnly)\n ) {\n return String(value);\n }\n\n const locale = opts.locale || \"en-US\";\n const formatOptions: Intl.DateTimeFormatOptions = {};\n\n if (opts.timeZone) {\n formatOptions.timeZone = opts.timeZone;\n }\n\n if (opts.dateOnly) {\n formatOptions.dateStyle = opts.dateStyle || \"medium\";\n } else if (opts.timeOnly) {\n formatOptions.timeStyle = opts.timeStyle || \"medium\";\n } else {\n if (opts.dateStyle) formatOptions.dateStyle = opts.dateStyle;\n if (opts.timeStyle) formatOptions.timeStyle = opts.timeStyle;\n }\n\n return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n }\n}\n","/**\n * DateRole - Role para conversão e manipulação de datas\n *\n * ComplexRole com 3 variantes:\n * - iso: string ISO 8601 (\"2024-12-05T19:30:00.000Z\")\n * - timestamp: number em milissegundos (1733425800000)\n * - epoch: number em segundos (1733425800)\n *\n * @example\n * const date = new DateRole();\n * date.convert('iso', 'epoch', '2024-12-05T19:30:00.000Z') // 1733425800\n * date.convert('epoch', 'iso', 1733425800) // '2024-12-05T19:30:00.000Z'\n * date.cast('iso', '2024-12-05') // '2024-12-05T00:00:00.000Z'\n * date.format('iso', '2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' })\n */\n\nimport { ComplexRole } from \"../../contracts\";\nimport type { IVariant } from \"../../contracts\";\nimport type { DateTimestamp, DateFormatOptions } from \"./types\";\nimport { IsoVariant, TimestampVariant, EpochVariant } from \"./variants\";\n\n// =============================================================================\n// DATE ROLE CLASS\n// =============================================================================\n\nexport class DateRole extends ComplexRole<DateTimestamp> {\n readonly name = \"date\";\n readonly base = \"timestamp\";\n\n protected createVariants(): Record<string, IVariant<unknown, DateTimestamp>> {\n return {\n iso: new IsoVariant(),\n timestamp: new TimestampVariant(),\n epoch: new EpochVariant(),\n };\n }\n\n /**\n * Override format to accept DateFormatOptions\n */\n format(variant: string, value: unknown, options?: DateFormatOptions): string {\n return super.format(variant, value, options);\n }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da DateRole */\nexport const dateRole = new DateRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\n/**\n * Converte entre variantes de data\n *\n * @example\n * convertDate('iso', 'epoch', '2024-12-05T19:30:00.000Z') // 1733425800\n */\nexport function convertDate<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n): TTo {\n return dateRole.convert<TFrom, TTo>(from, to, value);\n}\n\n/**\n * Formata uma data para apresentação\n *\n * @example\n * formatDate('iso', '2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' })\n * // \"quinta-feira, 5 de dezembro de 2024\"\n */\nexport function formatDate(\n variant: string,\n value: unknown,\n options?: {\n locale?: string;\n dateStyle?: \"full\" | \"long\" | \"medium\" | \"short\";\n timeStyle?: \"full\" | \"long\" | \"medium\" | \"short\";\n timeZone?: string;\n dateOnly?: boolean;\n timeOnly?: boolean;\n },\n): string {\n return dateRole.format(variant, value, options);\n}\n\n/**\n * Valida um valor de data\n *\n * @example\n * validateDate('iso', '2024-12-05T19:30:00.000Z') // { valid: true, errors: [] }\n * validateDate('iso', 'invalid') // { valid: false, errors: [...] }\n */\nexport function validateDate(\n variant: string,\n value: unknown,\n): { valid: boolean; errors: string[] } {\n return dateRole.validate(variant, value);\n}\n\n/**\n * Faz cast de input para uma variante de data\n *\n * @example\n * castDate('iso', '2024-12-05') // '2024-12-05T00:00:00.000Z'\n * castDate('timestamp', '2024-12-05T19:30:00.000Z') // 1733425800000\n * castDate('epoch', new Date()) // 1733425800\n */\nexport function castDate<T = unknown>(\n variant: string,\n input: unknown,\n): T | null {\n return dateRole.cast<T>(variant, input);\n}\n\n/**\n * Versão safe de castDate que retorna Result\n */\nexport function tryCastDate<T = unknown>(\n variant: string,\n input: unknown,\n): { ok: true; value: T } | { ok: false; error: string } {\n return dateRole.tryCast<T>(variant, input);\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Converte ISO para timestamp (milissegundos)\n */\nexport function isoToTimestamp(iso: string): number {\n return dateRole.convert<string, number>(\"iso\", \"timestamp\", iso);\n}\n\n/**\n * Converte timestamp (milissegundos) para ISO\n */\nexport function timestampToIso(timestamp: number): string {\n return dateRole.convert<number, string>(\"timestamp\", \"iso\", timestamp);\n}\n\n/**\n * Converte ISO para epoch (segundos)\n */\nexport function isoToEpoch(iso: string): number {\n return dateRole.convert<string, number>(\"iso\", \"epoch\", iso);\n}\n\n/**\n * Converte epoch (segundos) para ISO\n */\nexport function epochToIso(epoch: number): string {\n return dateRole.convert<number, string>(\"epoch\", \"iso\", epoch);\n}\n\n/**\n * Converte timestamp (milissegundos) para epoch (segundos)\n */\nexport function timestampToEpoch(timestamp: number): number {\n return dateRole.convert<number, number>(\"timestamp\", \"epoch\", timestamp);\n}\n\n/**\n * Converte epoch (segundos) para timestamp (milissegundos)\n */\nexport function epochToTimestamp(epoch: number): number {\n return dateRole.convert<number, number>(\"epoch\", \"timestamp\", epoch);\n}\n\n/**\n * Retorna o timestamp atual em milissegundos\n */\nexport function nowTimestamp(): number {\n return Date.now();\n}\n\n/**\n * Retorna o epoch atual em segundos\n */\nexport function nowEpoch(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Retorna a data/hora atual em ISO\n */\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n","/**\n * Volume Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de volume.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - NIST Handbook 44 (2024)\n * - SI Brochure, 9th Edition (2019)\n *\n * Notas:\n * - Base: liter (L) - unidade aceita para uso com o SI\n * - 1 L = 1 dm³ = 0.001 m³\n * - Galão US vs UK: ~20% diferença (UK é maior)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type VolumeUnit =\n // SI / Métrico\n | \"cubic_meter\"\n | \"cubic_decimeter\"\n | \"cubic_centimeter\"\n | \"cubic_millimeter\"\n | \"hectoliter\"\n | \"decaliter\"\n | \"liter\"\n | \"deciliter\"\n | \"centiliter\"\n | \"milliliter\"\n | \"microliter\"\n // US Customary\n | \"gallon_us\"\n | \"quart_us\"\n | \"pint_us\"\n | \"cup_us\"\n | \"fluid_ounce_us\"\n | \"tablespoon_us\"\n | \"teaspoon_us\"\n // Imperial (UK)\n | \"gallon_uk\"\n | \"quart_uk\"\n | \"pint_uk\"\n | \"fluid_ounce_uk\"\n // Other\n | \"barrel_oil\"\n | \"cubic_inch\"\n | \"cubic_foot\"\n | \"cubic_yard\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de volume.\n *\n * Base: liter (L)\n *\n * Fatores exatos:\n * - SI: derivados de potências de 10\n * - US: baseados em 1 gallon US = 231 in³ (exato)\n * - UK: 1 gallon UK = 4.54609 L (exato, definição 1985)\n */\nexport const VOLUME_UNITS: Record<VolumeUnit, SimpleUnitConfig> = {\n // SI / Métrico\n cubic_meter: {\n factor: 1000,\n symbol: \"m³\",\n singular: \"cubic meter\",\n plural: \"cubic meters\",\n },\n cubic_decimeter: {\n factor: 1,\n symbol: \"dm³\",\n singular: \"cubic decimeter\",\n plural: \"cubic decimeters\",\n },\n cubic_centimeter: {\n factor: 0.001,\n symbol: \"cm³\",\n singular: \"cubic centimeter\",\n plural: \"cubic centimeters\",\n },\n cubic_millimeter: {\n factor: 0.000001,\n symbol: \"mm³\",\n singular: \"cubic millimeter\",\n plural: \"cubic millimeters\",\n },\n hectoliter: {\n factor: 100,\n symbol: \"hL\",\n singular: \"hectoliter\",\n plural: \"hectoliters\",\n },\n decaliter: {\n factor: 10,\n symbol: \"daL\",\n singular: \"decaliter\",\n plural: \"decaliters\",\n },\n liter: {\n factor: 1,\n symbol: \"L\",\n singular: \"liter\",\n plural: \"liters\",\n },\n deciliter: {\n factor: 0.1,\n symbol: \"dL\",\n singular: \"deciliter\",\n plural: \"deciliters\",\n },\n centiliter: {\n factor: 0.01,\n symbol: \"cL\",\n singular: \"centiliter\",\n plural: \"centiliters\",\n },\n milliliter: {\n factor: 0.001,\n symbol: \"mL\",\n singular: \"milliliter\",\n plural: \"milliliters\",\n },\n microliter: {\n factor: 0.000001,\n symbol: \"μL\",\n singular: \"microliter\",\n plural: \"microliters\",\n },\n\n // US Customary (baseado em 1 gallon = 231 in³ = 3.785411784 L)\n gallon_us: {\n factor: 3.785411784,\n symbol: \"gal\",\n singular: \"gallon\",\n plural: \"gallons\",\n },\n quart_us: {\n factor: 0.946352946, // gallon/4\n symbol: \"qt\",\n singular: \"quart\",\n plural: \"quarts\",\n },\n pint_us: {\n factor: 0.473176473, // gallon/8\n symbol: \"pt\",\n singular: \"pint\",\n plural: \"pints\",\n },\n cup_us: {\n factor: 0.2365882365, // gallon/16\n symbol: \"cup\",\n singular: \"cup\",\n plural: \"cups\",\n },\n fluid_ounce_us: {\n factor: 0.0295735295625, // gallon/128\n symbol: \"fl oz\",\n singular: \"fluid ounce\",\n plural: \"fluid ounces\",\n },\n tablespoon_us: {\n factor: 0.01478676478125, // fl oz/2\n symbol: \"tbsp\",\n singular: \"tablespoon\",\n plural: \"tablespoons\",\n },\n teaspoon_us: {\n factor: 0.00492892159375, // tbsp/3\n symbol: \"tsp\",\n singular: \"teaspoon\",\n plural: \"teaspoons\",\n },\n\n // Imperial UK (1 gallon UK = 4.54609 L exato)\n gallon_uk: {\n factor: 4.54609,\n symbol: \"gal (UK)\",\n singular: \"gallon (UK)\",\n plural: \"gallons (UK)\",\n },\n quart_uk: {\n factor: 1.1365225, // gallon/4\n symbol: \"qt (UK)\",\n singular: \"quart (UK)\",\n plural: \"quarts (UK)\",\n },\n pint_uk: {\n factor: 0.56826125, // gallon/8\n symbol: \"pt (UK)\",\n singular: \"pint (UK)\",\n plural: \"pints (UK)\",\n },\n fluid_ounce_uk: {\n factor: 0.0284130625, // gallon/160\n symbol: \"fl oz (UK)\",\n singular: \"fluid ounce (UK)\",\n plural: \"fluid ounces (UK)\",\n },\n\n // Other\n barrel_oil: {\n factor: 158.987294928, // 42 US gallons (petroleum)\n symbol: \"bbl\",\n singular: \"barrel\",\n plural: \"barrels\",\n },\n cubic_inch: {\n factor: 0.016387064, // (0.0254)³ × 1000\n symbol: \"in³\",\n singular: \"cubic inch\",\n plural: \"cubic inches\",\n },\n cubic_foot: {\n factor: 28.316846592, // (0.3048)³ × 1000\n symbol: \"ft³\",\n singular: \"cubic foot\",\n plural: \"cubic feet\",\n },\n cubic_yard: {\n factor: 764.554857984, // (0.9144)³ × 1000\n symbol: \"yd³\",\n singular: \"cubic yard\",\n plural: \"cubic yards\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const VOLUME_ALIASES: UnitAliases = {\n // cubic_meter\n \"m³\": \"cubic_meter\",\n m3: \"cubic_meter\",\n \"cubic meter\": \"cubic_meter\",\n \"cubic meters\": \"cubic_meter\",\n \"metro cúbico\": \"cubic_meter\",\n \"metros cúbicos\": \"cubic_meter\",\n\n // cubic_decimeter\n \"dm³\": \"cubic_decimeter\",\n dm3: \"cubic_decimeter\",\n \"cubic decimeter\": \"cubic_decimeter\",\n \"cubic decimeters\": \"cubic_decimeter\",\n\n // cubic_centimeter\n \"cm³\": \"cubic_centimeter\",\n cm3: \"cubic_centimeter\",\n cc: \"cubic_centimeter\",\n \"cubic centimeter\": \"cubic_centimeter\",\n \"cubic centimeters\": \"cubic_centimeter\",\n\n // cubic_millimeter\n \"mm³\": \"cubic_millimeter\",\n mm3: \"cubic_millimeter\",\n \"cubic millimeter\": \"cubic_millimeter\",\n \"cubic millimeters\": \"cubic_millimeter\",\n\n // hectoliter\n hL: \"hectoliter\",\n hl: \"hectoliter\",\n hectoliter: \"hectoliter\",\n hectoliters: \"hectoliter\",\n hectolitre: \"hectoliter\",\n hectolitres: \"hectoliter\",\n\n // decaliter\n daL: \"decaliter\",\n dal: \"decaliter\",\n decaliter: \"decaliter\",\n decaliters: \"decaliter\",\n\n // liter\n L: \"liter\",\n l: \"liter\",\n liter: \"liter\",\n liters: \"liter\",\n litre: \"liter\",\n litres: \"liter\",\n litro: \"liter\",\n litros: \"liter\",\n\n // deciliter\n dL: \"deciliter\",\n dl: \"deciliter\",\n deciliter: \"deciliter\",\n deciliters: \"deciliter\",\n\n // centiliter\n cL: \"centiliter\",\n cl: \"centiliter\",\n centiliter: \"centiliter\",\n centiliters: \"centiliter\",\n\n // milliliter\n mL: \"milliliter\",\n ml: \"milliliter\",\n milliliter: \"milliliter\",\n milliliters: \"milliliter\",\n mililitro: \"milliliter\",\n mililitros: \"milliliter\",\n\n // microliter\n μL: \"microliter\",\n uL: \"microliter\",\n ul: \"microliter\",\n microliter: \"microliter\",\n microliters: \"microliter\",\n\n // gallon_us\n gal: \"gallon_us\",\n gallon: \"gallon_us\",\n gallons: \"gallon_us\",\n \"gallon us\": \"gallon_us\",\n \"gallons us\": \"gallon_us\",\n galão: \"gallon_us\",\n galões: \"gallon_us\",\n\n // quart_us\n qt: \"quart_us\",\n quart: \"quart_us\",\n quarts: \"quart_us\",\n\n // pint_us\n pt: \"pint_us\",\n pint: \"pint_us\",\n pints: \"pint_us\",\n\n // cup_us\n cup: \"cup_us\",\n cups: \"cup_us\",\n xícara: \"cup_us\",\n xícaras: \"cup_us\",\n\n // fluid_ounce_us\n \"fl oz\": \"fluid_ounce_us\",\n floz: \"fluid_ounce_us\",\n \"fluid ounce\": \"fluid_ounce_us\",\n \"fluid ounces\": \"fluid_ounce_us\",\n\n // tablespoon_us\n tbsp: \"tablespoon_us\",\n tablespoon: \"tablespoon_us\",\n tablespoons: \"tablespoon_us\",\n \"colher de sopa\": \"tablespoon_us\",\n \"colheres de sopa\": \"tablespoon_us\",\n\n // teaspoon_us\n tsp: \"teaspoon_us\",\n teaspoon: \"teaspoon_us\",\n teaspoons: \"teaspoon_us\",\n \"colher de chá\": \"teaspoon_us\",\n \"colheres de chá\": \"teaspoon_us\",\n\n // gallon_uk\n \"gal uk\": \"gallon_uk\",\n \"gallon uk\": \"gallon_uk\",\n \"gallons uk\": \"gallon_uk\",\n \"imperial gallon\": \"gallon_uk\",\n \"imperial gallons\": \"gallon_uk\",\n\n // quart_uk\n \"qt uk\": \"quart_uk\",\n \"quart uk\": \"quart_uk\",\n \"quarts uk\": \"quart_uk\",\n\n // pint_uk\n \"pt uk\": \"pint_uk\",\n \"pint uk\": \"pint_uk\",\n \"pints uk\": \"pint_uk\",\n \"imperial pint\": \"pint_uk\",\n \"imperial pints\": \"pint_uk\",\n\n // fluid_ounce_uk\n \"fl oz uk\": \"fluid_ounce_uk\",\n \"fluid ounce uk\": \"fluid_ounce_uk\",\n \"fluid ounces uk\": \"fluid_ounce_uk\",\n\n // barrel_oil\n bbl: \"barrel_oil\",\n barrel: \"barrel_oil\",\n barrels: \"barrel_oil\",\n \"oil barrel\": \"barrel_oil\",\n \"oil barrels\": \"barrel_oil\",\n barril: \"barrel_oil\",\n barris: \"barrel_oil\",\n\n // cubic_inch\n \"in³\": \"cubic_inch\",\n in3: \"cubic_inch\",\n \"cu in\": \"cubic_inch\",\n \"cubic inch\": \"cubic_inch\",\n \"cubic inches\": \"cubic_inch\",\n\n // cubic_foot\n \"ft³\": \"cubic_foot\",\n ft3: \"cubic_foot\",\n \"cu ft\": \"cubic_foot\",\n \"cubic foot\": \"cubic_foot\",\n \"cubic feet\": \"cubic_foot\",\n\n // cubic_yard\n \"yd³\": \"cubic_yard\",\n yd3: \"cubic_yard\",\n \"cu yd\": \"cubic_yard\",\n \"cubic yard\": \"cubic_yard\",\n \"cubic yards\": \"cubic_yard\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const VOLUME_UNIT_LIST = Object.keys(VOLUME_UNITS) as VolumeUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const VOLUME_FACTORS: Record<VolumeUnit, number> = Object.fromEntries(\n Object.entries(VOLUME_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<VolumeUnit, number>;\n","/**\n * VolumeRole - Role para conversão de unidades de volume\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const volume = new VolumeRole();\n * volume.convert('gallon_us', 'liter', 1) // 3.785411784\n * volume.cast('liter', '500 ml') // 0.5\n * volume.validate('liter', 100) // { valid: true, errors: [] }\n * volume.format('liter', 2.5) // \"2.5 L\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { VOLUME_UNITS, VOLUME_ALIASES, type VolumeUnit } from \"./constants\";\n\n// =============================================================================\n// VOLUME ROLE CLASS\n// =============================================================================\n\nexport class VolumeRole extends SimpleRole {\n readonly name = \"volume\";\n readonly base = \"liter\";\n readonly units = VOLUME_UNITS;\n readonly aliases = VOLUME_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Volume cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da VolumeRole */\nexport const volumeRole = new VolumeRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de volume\n *\n * @example\n * convertVolume(1, 'gallon_us', 'liter') // 3.785411784\n */\nexport function convertVolume(\n value: number,\n from: VolumeUnit,\n to: VolumeUnit,\n): number {\n return volumeRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de volume com unidade\n *\n * @example\n * formatVolume(2.5, 'liter') // \"2.5 L\"\n * formatVolume(2.5, 'liter', { verbose: true }) // \"2.5 liters\"\n */\nexport function formatVolume(\n value: number,\n unit: VolumeUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return volumeRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de volume\n *\n * @example\n * validateVolume(100) // { valid: true, errors: [] }\n * validateVolume(-5) // { valid: false, errors: ['Volume cannot be negative'] }\n */\nexport function validateVolume(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return volumeRole.validate(\"liter\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castVolume('500 ml') // 0.5 (converted to liter)\n * castVolume('100') // 100\n * castVolume('invalid') // null\n */\nexport function castVolume(\n input: unknown,\n targetUnit: VolumeUnit = \"liter\",\n): number | null {\n return volumeRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castVolume que retorna Result\n */\nexport function tryCastVolume(\n input: unknown,\n targetUnit: VolumeUnit = \"liter\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return volumeRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectVolumeUnit('500 ml') // 'milliliter'\n * detectVolumeUnit('2 gal') // 'gallon_us'\n * detectVolumeUnit('100') // null\n */\nexport function detectVolumeUnit(input: string): VolumeUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (volumeRole as any).detectUnit(unitStr) as VolumeUnit | null;\n}\n","/**\n * Time Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de tempo/duração.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - Gregorian calendar (365.2425 dias/ano)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type TimeUnit =\n // SI prefixes\n | \"nanosecond\"\n | \"microsecond\"\n | \"millisecond\"\n | \"second\"\n // Common\n | \"minute\"\n | \"hour\"\n | \"day\"\n | \"week\"\n // Calendar (approximate)\n | \"month\"\n | \"year\"\n | \"decade\"\n | \"century\"\n | \"millennium\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de tempo.\n *\n * Fatores exatos:\n * - SI: prefixos são exatos por definição\n * - day, hour, minute: exatos (86400s, 3600s, 60s)\n * - week: exato (7 dias = 604800s)\n *\n * Fatores aproximados (baseados no calendário Gregoriano):\n * - year: 365.2425 dias (média do ciclo de 400 anos)\n * - month: year/12\n */\nexport const TIME_UNITS: Record<TimeUnit, SimpleUnitConfig> = {\n // SI prefixes (exatos)\n nanosecond: {\n factor: 1e-9,\n symbol: \"ns\",\n singular: \"nanosecond\",\n plural: \"nanoseconds\",\n },\n microsecond: {\n factor: 1e-6,\n symbol: \"μs\",\n singular: \"microsecond\",\n plural: \"microseconds\",\n },\n millisecond: {\n factor: 0.001,\n symbol: \"ms\",\n singular: \"millisecond\",\n plural: \"milliseconds\",\n },\n second: {\n factor: 1,\n symbol: \"s\",\n singular: \"second\",\n plural: \"seconds\",\n },\n\n // Common (exatos)\n minute: {\n factor: 60,\n symbol: \"min\",\n singular: \"minute\",\n plural: \"minutes\",\n },\n hour: {\n factor: 3600,\n symbol: \"h\",\n singular: \"hour\",\n plural: \"hours\",\n },\n day: {\n factor: 86400,\n symbol: \"d\",\n singular: \"day\",\n plural: \"days\",\n },\n week: {\n factor: 604800,\n symbol: \"wk\",\n singular: \"week\",\n plural: \"weeks\",\n },\n\n // Calendar (aproximados - baseados no ano Gregoriano)\n month: {\n factor: 2629746, // 31556952 / 12\n symbol: \"mo\",\n singular: \"month\",\n plural: \"months\",\n },\n year: {\n factor: 31556952, // 365.2425 * 86400\n symbol: \"yr\",\n singular: \"year\",\n plural: \"years\",\n },\n decade: {\n factor: 315569520, // 10 * year\n symbol: \"dec\",\n singular: \"decade\",\n plural: \"decades\",\n },\n century: {\n factor: 3155695200, // 100 * year\n symbol: \"c\",\n singular: \"century\",\n plural: \"centuries\",\n },\n millennium: {\n factor: 31556952000, // 1000 * year\n symbol: \"ky\",\n singular: \"millennium\",\n plural: \"millennia\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const TIME_ALIASES: UnitAliases = {\n // nanosecond\n ns: \"nanosecond\",\n nanosecond: \"nanosecond\",\n nanoseconds: \"nanosecond\",\n nanoseg: \"nanosecond\",\n nanossegundo: \"nanosecond\",\n nanossegundos: \"nanosecond\",\n\n // microsecond\n μs: \"microsecond\",\n us: \"microsecond\",\n microsecond: \"microsecond\",\n microseconds: \"microsecond\",\n microseg: \"microsecond\",\n microssegundo: \"microsecond\",\n microssegundos: \"microsecond\",\n\n // millisecond\n ms: \"millisecond\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n milliseg: \"millisecond\",\n milissegundo: \"millisecond\",\n milissegundos: \"millisecond\",\n\n // second\n s: \"second\",\n sec: \"second\",\n second: \"second\",\n seconds: \"second\",\n seg: \"second\",\n segundo: \"second\",\n segundos: \"second\",\n\n // minute\n min: \"minute\",\n minute: \"minute\",\n minutes: \"minute\",\n minuto: \"minute\",\n minutos: \"minute\",\n\n // hour\n h: \"hour\",\n hr: \"hour\",\n hrs: \"hour\",\n hour: \"hour\",\n hours: \"hour\",\n hora: \"hour\",\n horas: \"hour\",\n\n // day\n d: \"day\",\n day: \"day\",\n days: \"day\",\n dia: \"day\",\n dias: \"day\",\n\n // week\n wk: \"week\",\n week: \"week\",\n weeks: \"week\",\n semana: \"week\",\n semanas: \"week\",\n\n // month\n mo: \"month\",\n month: \"month\",\n months: \"month\",\n mês: \"month\",\n mes: \"month\",\n meses: \"month\",\n\n // year\n yr: \"year\",\n y: \"year\",\n year: \"year\",\n years: \"year\",\n ano: \"year\",\n anos: \"year\",\n\n // decade\n dec: \"decade\",\n decade: \"decade\",\n decades: \"decade\",\n década: \"decade\",\n decada: \"decade\",\n décadas: \"decade\",\n decadas: \"decade\",\n\n // century\n c: \"century\",\n century: \"century\",\n centuries: \"century\",\n século: \"century\",\n seculo: \"century\",\n séculos: \"century\",\n seculos: \"century\",\n\n // millennium\n ky: \"millennium\",\n millennium: \"millennium\",\n millennia: \"millennium\",\n milênio: \"millennium\",\n milenio: \"millennium\",\n milênios: \"millennium\",\n milenios: \"millennium\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const TIME_UNIT_LIST = Object.keys(TIME_UNITS) as TimeUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const TIME_FACTORS: Record<TimeUnit, number> = Object.fromEntries(\n Object.entries(TIME_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<TimeUnit, number>;\n","/**\n * TimeRole - Role para conversão de unidades de tempo/duração\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const time = new TimeRole();\n * time.convert('hour', 'minute', 1) // 60\n * time.cast('second', '5 min') // 300\n * time.validate('second', 100) // { valid: true, errors: [] }\n * time.format('hour', 2.5) // \"2.5 h\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { TIME_UNITS, TIME_ALIASES, type TimeUnit } from \"./constants\";\n\n// =============================================================================\n// TIME ROLE CLASS\n// =============================================================================\n\nexport class TimeRole extends SimpleRole {\n readonly name = \"time\";\n readonly base = \"second\";\n readonly units = TIME_UNITS;\n readonly aliases = TIME_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Duration cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da TimeRole */\nexport const timeRole = new TimeRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de tempo\n *\n * @example\n * convertTime(1, 'hour', 'minute') // 60\n * convertTime(1, 'day', 'hour') // 24\n */\nexport function convertTime(\n value: number,\n from: TimeUnit,\n to: TimeUnit,\n): number {\n return timeRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de tempo com unidade\n *\n * @example\n * formatTime(2.5, 'hour') // \"2.5 h\"\n * formatTime(2.5, 'hour', { verbose: true }) // \"2.5 hours\"\n */\nexport function formatTime(\n value: number,\n unit: TimeUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return timeRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de tempo\n *\n * @example\n * validateTime(100) // { valid: true, errors: [] }\n * validateTime(-5) // { valid: false, errors: ['Duration cannot be negative'] }\n */\nexport function validateTime(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return timeRole.validate(\"second\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castTime('5 min') // 300\n * castTime('100') // 100\n * castTime('invalid') // null\n */\nexport function castTime(\n input: unknown,\n targetUnit: TimeUnit = \"second\",\n): number | null {\n return timeRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castTime que retorna Result\n */\nexport function tryCastTime(\n input: unknown,\n targetUnit: TimeUnit = \"second\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return timeRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectTimeUnit('5 min') // 'minute'\n * detectTimeUnit('100 hours') // 'hour'\n * detectTimeUnit('100') // null\n */\nexport function detectTimeUnit(input: string): TimeUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (timeRole as any).detectUnit(unitStr) as TimeUnit | null;\n}\n","/**\n * Digital Storage Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de armazenamento digital.\n *\n * Fontes:\n * - IEC 60027-2 (prefixos binários)\n * - SI Brochure, 9th Edition (2019)\n *\n * IMPORTANTE: Esta biblioteca suporta AMBOS os sistemas:\n * - SI (decimal): kB, MB, GB, TB (base 1000)\n * - IEC (binário): KiB, MiB, GiB, TiB (base 1024)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type DigitalUnit =\n // Fundamental\n | \"bit\"\n | \"byte\"\n // IEC Binary (base 1024)\n | \"kibibyte\"\n | \"mebibyte\"\n | \"gibibyte\"\n | \"tebibyte\"\n | \"pebibyte\"\n | \"exbibyte\"\n // SI Decimal (base 1000)\n | \"kilobyte\"\n | \"megabyte\"\n | \"gigabyte\"\n | \"terabyte\"\n | \"petabyte\"\n | \"exabyte\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de armazenamento digital.\n *\n * TODOS os fatores são EXATOS:\n * - IEC: potências de 2 (1024^n)\n * - SI: potências de 10 (1000^n)\n *\n * Convenção:\n * - byte é a BASE (fator = 1)\n * - bit = 1/8 byte (fator = 0.125)\n */\nexport const DIGITAL_UNITS: Record<DigitalUnit, SimpleUnitConfig> = {\n // Fundamental\n bit: {\n factor: 0.125, // 1/8 byte\n symbol: \"b\",\n singular: \"bit\",\n plural: \"bits\",\n },\n byte: {\n factor: 1,\n symbol: \"B\",\n singular: \"byte\",\n plural: \"bytes\",\n },\n\n // IEC Binary (base 1024) - RAM, cache, file systems\n kibibyte: {\n factor: 1024, // 2^10\n symbol: \"KiB\",\n singular: \"kibibyte\",\n plural: \"kibibytes\",\n },\n mebibyte: {\n factor: 1048576, // 2^20\n symbol: \"MiB\",\n singular: \"mebibyte\",\n plural: \"mebibytes\",\n },\n gibibyte: {\n factor: 1073741824, // 2^30\n symbol: \"GiB\",\n singular: \"gibibyte\",\n plural: \"gibibytes\",\n },\n tebibyte: {\n factor: 1099511627776, // 2^40\n symbol: \"TiB\",\n singular: \"tebibyte\",\n plural: \"tebibytes\",\n },\n pebibyte: {\n factor: 1125899906842624, // 2^50\n symbol: \"PiB\",\n singular: \"pebibyte\",\n plural: \"pebibytes\",\n },\n exbibyte: {\n factor: 1152921504606846976, // 2^60\n symbol: \"EiB\",\n singular: \"exbibyte\",\n plural: \"exbibytes\",\n },\n\n // SI Decimal (base 1000) - HD marketing, network speeds\n kilobyte: {\n factor: 1000, // 10^3\n symbol: \"kB\",\n singular: \"kilobyte\",\n plural: \"kilobytes\",\n },\n megabyte: {\n factor: 1000000, // 10^6\n symbol: \"MB\",\n singular: \"megabyte\",\n plural: \"megabytes\",\n },\n gigabyte: {\n factor: 1000000000, // 10^9\n symbol: \"GB\",\n singular: \"gigabyte\",\n plural: \"gigabytes\",\n },\n terabyte: {\n factor: 1000000000000, // 10^12\n symbol: \"TB\",\n singular: \"terabyte\",\n plural: \"terabytes\",\n },\n petabyte: {\n factor: 1000000000000000, // 10^15\n symbol: \"PB\",\n singular: \"petabyte\",\n plural: \"petabytes\",\n },\n exabyte: {\n factor: 1000000000000000000, // 10^18\n symbol: \"EB\",\n singular: \"exabyte\",\n plural: \"exabytes\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const DIGITAL_ALIASES: UnitAliases = {\n // bit\n b: \"bit\",\n bit: \"bit\",\n bits: \"bit\",\n\n // byte\n B: \"byte\",\n byte: \"byte\",\n bytes: \"byte\",\n octet: \"byte\",\n octets: \"byte\",\n\n // kibibyte (IEC)\n KiB: \"kibibyte\",\n kibibyte: \"kibibyte\",\n kibibytes: \"kibibyte\",\n\n // mebibyte (IEC)\n MiB: \"mebibyte\",\n mebibyte: \"mebibyte\",\n mebibytes: \"mebibyte\",\n\n // gibibyte (IEC)\n GiB: \"gibibyte\",\n gibibyte: \"gibibyte\",\n gibibytes: \"gibibyte\",\n\n // tebibyte (IEC)\n TiB: \"tebibyte\",\n tebibyte: \"tebibyte\",\n tebibytes: \"tebibyte\",\n\n // pebibyte (IEC)\n PiB: \"pebibyte\",\n pebibyte: \"pebibyte\",\n pebibytes: \"pebibyte\",\n\n // exbibyte (IEC)\n EiB: \"exbibyte\",\n exbibyte: \"exbibyte\",\n exbibytes: \"exbibyte\",\n\n // kilobyte (SI)\n kB: \"kilobyte\",\n kb: \"kilobyte\",\n kilobyte: \"kilobyte\",\n kilobytes: \"kilobyte\",\n\n // megabyte (SI)\n MB: \"megabyte\",\n megabyte: \"megabyte\",\n megabytes: \"megabyte\",\n\n // gigabyte (SI)\n GB: \"gigabyte\",\n gigabyte: \"gigabyte\",\n gigabytes: \"gigabyte\",\n\n // terabyte (SI)\n TB: \"terabyte\",\n terabyte: \"terabyte\",\n terabytes: \"terabyte\",\n\n // petabyte (SI)\n PB: \"petabyte\",\n petabyte: \"petabyte\",\n petabytes: \"petabyte\",\n\n // exabyte (SI)\n EB: \"exabyte\",\n exabyte: \"exabyte\",\n exabytes: \"exabyte\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const DIGITAL_UNIT_LIST = Object.keys(DIGITAL_UNITS) as DigitalUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const DIGITAL_FACTORS: Record<DigitalUnit, number> = Object.fromEntries(\n Object.entries(DIGITAL_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n) as Record<DigitalUnit, number>;\n","/**\n * DigitalRole - Role para conversão de unidades de armazenamento digital\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * Suporta AMBOS os sistemas:\n * - IEC (binário): KiB, MiB, GiB, TiB (base 1024)\n * - SI (decimal): kB, MB, GB, TB (base 1000)\n *\n * @example\n * const digital = new DigitalRole();\n * digital.convert('gibibyte', 'megabyte', 1) // 1073.741824\n * digital.cast('megabyte', '500 MB') // 500\n * digital.validate('megabyte', 100) // { valid: true, errors: [] }\n * digital.format('gibibyte', 1.5) // \"1.5 GiB\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { DIGITAL_UNITS, DIGITAL_ALIASES, type DigitalUnit } from \"./constants\";\n\n// =============================================================================\n// DIGITAL ROLE CLASS\n// =============================================================================\n\nexport class DigitalRole extends SimpleRole {\n readonly name = \"digital\";\n readonly base = \"byte\";\n readonly units = DIGITAL_UNITS;\n readonly aliases = DIGITAL_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Digital storage cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da DigitalRole */\nexport const digitalRole = new DigitalRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de armazenamento digital\n *\n * @example\n * convertDigital(1, 'gibibyte', 'mebibyte') // 1024\n * convertDigital(1, 'gigabyte', 'megabyte') // 1000\n */\nexport function convertDigital(\n value: number,\n from: DigitalUnit,\n to: DigitalUnit,\n): number {\n return digitalRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de armazenamento digital com unidade\n *\n * @example\n * formatDigital(1.5, 'gibibyte') // \"1.5 GiB\"\n * formatDigital(1.5, 'gibibyte', { verbose: true }) // \"1.5 gibibytes\"\n */\nexport function formatDigital(\n value: number,\n unit: DigitalUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return digitalRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de armazenamento digital\n *\n * @example\n * validateDigital(100) // { valid: true, errors: [] }\n * validateDigital(-5) // { valid: false, errors: ['Digital storage cannot be negative'] }\n */\nexport function validateDigital(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return digitalRole.validate(\"byte\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castDigital('500 MB') // 500\n * castDigital('500') // 500\n * castDigital('invalid') // null\n */\nexport function castDigital(\n input: unknown,\n targetUnit: DigitalUnit = \"byte\",\n): number | null {\n return digitalRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castDigital que retorna Result\n */\nexport function tryCastDigital(\n input: unknown,\n targetUnit: DigitalUnit = \"byte\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return digitalRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectDigitalUnit('500 MB') // 'megabyte'\n * detectDigitalUnit('500 GiB') // 'gibibyte'\n * detectDigitalUnit('500') // null\n */\nexport function detectDigitalUnit(input: string): DigitalUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (digitalRole as any).detectUnit(unitStr) as DigitalUnit | null;\n}\n","/**\n * Frequency Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de frequência.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type FrequencyUnit =\n // SI\n | \"terahertz\"\n | \"gigahertz\"\n | \"megahertz\"\n | \"kilohertz\"\n | \"hertz\"\n | \"millihertz\"\n | \"microhertz\"\n // Other\n | \"rpm\"\n | \"bpm\"\n | \"radians_per_second\"\n | \"cycles_per_minute\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de frequência.\n *\n * Base: hertz (Hz) = 1 ciclo por segundo\n *\n * Relações:\n * - 1 RPM = 1/60 Hz (rotações por minuto)\n * - 1 rad/s = 1/(2π) Hz\n */\nexport const FREQUENCY_UNITS: Record<FrequencyUnit, SimpleUnitConfig> = {\n // SI Units (todos exatos)\n terahertz: {\n factor: 1e12,\n symbol: \"THz\",\n singular: \"terahertz\",\n plural: \"terahertz\",\n },\n gigahertz: {\n factor: 1e9,\n symbol: \"GHz\",\n singular: \"gigahertz\",\n plural: \"gigahertz\",\n },\n megahertz: {\n factor: 1e6,\n symbol: \"MHz\",\n singular: \"megahertz\",\n plural: \"megahertz\",\n },\n kilohertz: {\n factor: 1000,\n symbol: \"kHz\",\n singular: \"kilohertz\",\n plural: \"kilohertz\",\n },\n hertz: {\n factor: 1,\n symbol: \"Hz\",\n singular: \"hertz\",\n plural: \"hertz\",\n },\n millihertz: {\n factor: 0.001,\n symbol: \"mHz\",\n singular: \"millihertz\",\n plural: \"millihertz\",\n },\n microhertz: {\n factor: 0.000001,\n symbol: \"μHz\",\n singular: \"microhertz\",\n plural: \"microhertz\",\n },\n\n // Other units\n rpm: {\n factor: 1 / 60, // 1 RPM = 1/60 Hz\n symbol: \"rpm\",\n singular: \"revolution per minute\",\n plural: \"revolutions per minute\",\n },\n bpm: {\n factor: 1 / 60, // 1 BPM = 1/60 Hz\n symbol: \"bpm\",\n singular: \"beat per minute\",\n plural: \"beats per minute\",\n },\n radians_per_second: {\n factor: 1 / (2 * Math.PI), // 1 rad/s = 1/(2π) Hz ≈ 0.159154943\n symbol: \"rad/s\",\n singular: \"radian per second\",\n plural: \"radians per second\",\n },\n cycles_per_minute: {\n factor: 1 / 60, // same as RPM\n symbol: \"cpm\",\n singular: \"cycle per minute\",\n plural: \"cycles per minute\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const FREQUENCY_ALIASES: UnitAliases = {\n // terahertz\n thz: \"terahertz\",\n terahertz: \"terahertz\",\n\n // gigahertz\n ghz: \"gigahertz\",\n gigahertz: \"gigahertz\",\n\n // megahertz\n mhz: \"megahertz\",\n megahertz: \"megahertz\",\n\n // kilohertz\n khz: \"kilohertz\",\n kilohertz: \"kilohertz\",\n\n // hertz\n hz: \"hertz\",\n hertz: \"hertz\",\n \"cycles per second\": \"hertz\",\n cps: \"hertz\",\n\n // millihertz\n // Note: \"mhz\" já é megahertz, usar \"milli hz\" ou similar\n millihertz: \"millihertz\",\n\n // microhertz\n μhz: \"microhertz\",\n uhz: \"microhertz\",\n microhertz: \"microhertz\",\n\n // rpm\n rpm: \"rpm\",\n \"r/min\": \"rpm\",\n \"rev/min\": \"rpm\",\n \"revolutions per minute\": \"rpm\",\n \"revolution per minute\": \"rpm\",\n rotações: \"rpm\",\n \"rotações por minuto\": \"rpm\",\n\n // bpm\n bpm: \"bpm\",\n \"beats per minute\": \"bpm\",\n \"beat per minute\": \"bpm\",\n batimentos: \"bpm\",\n \"batimentos por minuto\": \"bpm\",\n\n // radians_per_second\n \"rad/s\": \"radians_per_second\",\n \"radian per second\": \"radians_per_second\",\n \"radians per second\": \"radians_per_second\",\n\n // cycles_per_minute\n cpm: \"cycles_per_minute\",\n \"cycles per minute\": \"cycles_per_minute\",\n \"cycle per minute\": \"cycles_per_minute\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const FREQUENCY_UNIT_LIST = Object.keys(\n FREQUENCY_UNITS,\n) as FrequencyUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const FREQUENCY_FACTORS: Record<FrequencyUnit, number> =\n Object.fromEntries(\n Object.entries(FREQUENCY_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n ) as Record<FrequencyUnit, number>;\n","/**\n * FrequencyRole - Role para conversão de unidades de frequência\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const freq = new FrequencyRole();\n * freq.convert('megahertz', 'hertz', 1) // 1000000\n * freq.convert('rpm', 'hertz', 60) // 1\n * freq.cast('hertz', '100 Hz') // 100\n * freq.validate('hertz', 100) // { valid: true, errors: [] }\n * freq.format('megahertz', 2.4) // \"2.4 MHz\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport {\n FREQUENCY_UNITS,\n FREQUENCY_ALIASES,\n type FrequencyUnit,\n} from \"./constants\";\n\n// =============================================================================\n// FREQUENCY ROLE CLASS\n// =============================================================================\n\nexport class FrequencyRole extends SimpleRole {\n readonly name = \"frequency\";\n readonly base = \"hertz\";\n readonly units = FREQUENCY_UNITS;\n readonly aliases = FREQUENCY_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Frequency cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da FrequencyRole */\nexport const frequencyRole = new FrequencyRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de frequência\n *\n * @example\n * convertFrequency(1, 'megahertz', 'hertz') // 1000000\n * convertFrequency(60, 'rpm', 'hertz') // 1\n */\nexport function convertFrequency(\n value: number,\n from: FrequencyUnit,\n to: FrequencyUnit,\n): number {\n return frequencyRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de frequência com unidade\n *\n * @example\n * formatFrequency(2.4, 'gigahertz') // \"2.4 GHz\"\n * formatFrequency(2.4, 'gigahertz', { verbose: true }) // \"2.4 gigahertz\"\n */\nexport function formatFrequency(\n value: number,\n unit: FrequencyUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return frequencyRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de frequência\n *\n * @example\n * validateFrequency(100) // { valid: true, errors: [] }\n * validateFrequency(-5) // { valid: false, errors: ['Frequency cannot be negative'] }\n */\nexport function validateFrequency(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return frequencyRole.validate(\"hertz\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castFrequency('100 Hz') // 100\n * castFrequency('2.4 GHz') // 2400000000\n * castFrequency('invalid') // null\n */\nexport function castFrequency(\n input: unknown,\n targetUnit: FrequencyUnit = \"hertz\",\n): number | null {\n return frequencyRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castFrequency que retorna Result\n */\nexport function tryCastFrequency(\n input: unknown,\n targetUnit: FrequencyUnit = \"hertz\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return frequencyRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectFrequencyUnit('100 MHz') // 'megahertz'\n * detectFrequencyUnit('3600 rpm') // 'rpm'\n * detectFrequencyUnit('100') // null\n */\nexport function detectFrequencyUnit(input: string): FrequencyUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (frequencyRole as any).detectUnit(unitStr) as FrequencyUnit | null;\n}\n","/**\n * Pressure Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de pressão.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811\n * - 10th CGPM (1954) - definição da atmosfera padrão\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type PressureUnit =\n // SI\n | \"megapascal\"\n | \"kilopascal\"\n | \"hectopascal\"\n | \"pascal\"\n // Bar\n | \"bar\"\n | \"millibar\"\n // Atmosphere\n | \"atmosphere\"\n // Mercury\n | \"torr\"\n | \"mmhg\"\n | \"inhg\"\n // Imperial\n | \"psi\"\n | \"ksi\"\n // Water column\n | \"cmh2o\"\n | \"inh2o\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de pressão.\n *\n * Base: pascal (Pa) = 1 N/m² = 1 kg/(m·s²)\n *\n * Relações importantes:\n * - 1 atm = 101325 Pa (exato, CGPM 1954)\n * - 1 bar = 100000 Pa (exato por definição)\n * - 1 Torr = 101325/760 Pa (exato)\n * - 1 psi = 6894.757293168 Pa (derivado de lb/in²)\n */\nexport const PRESSURE_UNITS: Record<PressureUnit, SimpleUnitConfig> = {\n // SI Units (todos exatos)\n megapascal: {\n factor: 1e6,\n symbol: \"MPa\",\n singular: \"megapascal\",\n plural: \"megapascals\",\n },\n kilopascal: {\n factor: 1000,\n symbol: \"kPa\",\n singular: \"kilopascal\",\n plural: \"kilopascals\",\n },\n hectopascal: {\n factor: 100,\n symbol: \"hPa\",\n singular: \"hectopascal\",\n plural: \"hectopascals\",\n },\n pascal: {\n factor: 1,\n symbol: \"Pa\",\n singular: \"pascal\",\n plural: \"pascals\",\n },\n\n // Bar (exatos por definição)\n bar: {\n factor: 100000,\n symbol: \"bar\",\n singular: \"bar\",\n plural: \"bar\",\n },\n millibar: {\n factor: 100, // = 1 hPa\n symbol: \"mbar\",\n singular: \"millibar\",\n plural: \"millibar\",\n },\n\n // Atmosphere (exato, CGPM 1954)\n atmosphere: {\n factor: 101325,\n symbol: \"atm\",\n singular: \"atmosphere\",\n plural: \"atmospheres\",\n },\n\n // Mercury column\n torr: {\n factor: 101325 / 760, // ≈ 133.322368421\n symbol: \"Torr\",\n singular: \"torr\",\n plural: \"torr\",\n },\n mmhg: {\n factor: 133.322387415, // Convenção NIST\n symbol: \"mmHg\",\n singular: \"millimeter of mercury\",\n plural: \"millimeters of mercury\",\n },\n inhg: {\n factor: 3386.389, // Polegadas de mercúrio\n symbol: \"inHg\",\n singular: \"inch of mercury\",\n plural: \"inches of mercury\",\n },\n\n // Imperial (derivados de lb/in²)\n psi: {\n factor: 6894.757293168, // 1 lbf/in²\n symbol: \"psi\",\n singular: \"pound per square inch\",\n plural: \"pounds per square inch\",\n },\n ksi: {\n factor: 6894757.293168, // 1000 psi\n symbol: \"ksi\",\n singular: \"kilopound per square inch\",\n plural: \"kilopounds per square inch\",\n },\n\n // Water column\n cmh2o: {\n factor: 98.0665, // cm de água a 4°C\n symbol: \"cmH₂O\",\n singular: \"centimeter of water\",\n plural: \"centimeters of water\",\n },\n inh2o: {\n factor: 249.08891, // polegadas de água\n symbol: \"inH₂O\",\n singular: \"inch of water\",\n plural: \"inches of water\",\n },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const PRESSURE_ALIASES: UnitAliases = {\n // megapascal\n mpa: \"megapascal\",\n megapascal: \"megapascal\",\n megapascals: \"megapascal\",\n\n // kilopascal\n kpa: \"kilopascal\",\n kilopascal: \"kilopascal\",\n kilopascals: \"kilopascal\",\n\n // hectopascal\n hpa: \"hectopascal\",\n hectopascal: \"hectopascal\",\n hectopascals: \"hectopascal\",\n\n // pascal\n pa: \"pascal\",\n pascal: \"pascal\",\n pascals: \"pascal\",\n\n // bar\n bar: \"bar\",\n bars: \"bar\",\n\n // millibar\n mbar: \"millibar\",\n millibar: \"millibar\",\n millibars: \"millibar\",\n mb: \"millibar\",\n\n // atmosphere\n atm: \"atmosphere\",\n atmosphere: \"atmosphere\",\n atmospheres: \"atmosphere\",\n atmosfera: \"atmosphere\",\n atmosferas: \"atmosphere\",\n\n // torr\n torr: \"torr\",\n\n // mmhg\n mmhg: \"mmhg\",\n \"mm hg\": \"mmhg\",\n \"millimeter of mercury\": \"mmhg\",\n \"millimeters of mercury\": \"mmhg\",\n \"milímetro de mercúrio\": \"mmhg\",\n \"milímetros de mercúrio\": \"mmhg\",\n\n // inhg\n inhg: \"inhg\",\n \"in hg\": \"inhg\",\n \"inch of mercury\": \"inhg\",\n \"inches of mercury\": \"inhg\",\n\n // psi\n psi: \"psi\",\n \"lbf/in²\": \"psi\",\n \"lb/in²\": \"psi\",\n \"pound per square inch\": \"psi\",\n \"pounds per square inch\": \"psi\",\n\n // ksi\n ksi: \"ksi\",\n \"kilopound per square inch\": \"ksi\",\n\n // cmh2o\n cmh2o: \"cmh2o\",\n \"cmh₂o\": \"cmh2o\",\n \"cm h2o\": \"cmh2o\",\n \"centimeter of water\": \"cmh2o\",\n \"centimeters of water\": \"cmh2o\",\n\n // inh2o\n inh2o: \"inh2o\",\n \"inh₂o\": \"inh2o\",\n \"in h2o\": \"inh2o\",\n \"inch of water\": \"inh2o\",\n \"inches of water\": \"inh2o\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const PRESSURE_UNIT_LIST = Object.keys(PRESSURE_UNITS) as PressureUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const PRESSURE_FACTORS: Record<PressureUnit, number> =\n Object.fromEntries(\n Object.entries(PRESSURE_UNITS).map(([unit, config]) => [\n unit,\n config.factor ?? 1,\n ]),\n ) as Record<PressureUnit, number>;\n","/**\n * PressureRole - Role para conversão de unidades de pressão\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const pressure = new PressureRole();\n * pressure.convert('bar', 'pascal', 1) // 100000\n * pressure.convert('atmosphere', 'psi', 1) // 14.696\n * pressure.cast('pascal', '100 Pa') // 100\n * pressure.validate('pascal', 100) // { valid: true, errors: [] }\n * pressure.format('bar', 1.5) // \"1.5 bar\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport {\n PRESSURE_UNITS,\n PRESSURE_ALIASES,\n type PressureUnit,\n} from \"./constants\";\n\n// =============================================================================\n// PRESSURE ROLE CLASS\n// =============================================================================\n\nexport class PressureRole extends SimpleRole {\n readonly name = \"pressure\";\n readonly base = \"pascal\";\n readonly units = PRESSURE_UNITS;\n readonly aliases = PRESSURE_ALIASES;\n\n readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Pressure cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da PressureRole */\nexport const pressureRole = new PressureRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS (para compatibilidade com API anterior)\n// =============================================================================\n\n/**\n * Converte entre unidades de pressão\n *\n * @example\n * convertPressure(1, 'bar', 'pascal') // 100000\n * convertPressure(1, 'atmosphere', 'psi') // 14.696\n */\nexport function convertPressure(\n value: number,\n from: PressureUnit,\n to: PressureUnit,\n): number {\n return pressureRole.convert(from, to, value);\n}\n\n/**\n * Formata valor de pressão com unidade\n *\n * @example\n * formatPressure(1.5, 'bar') // \"1.5 bar\"\n * formatPressure(1013.25, 'hectopascal') // \"1013.25 hPa\"\n * formatPressure(1, 'atmosphere', { verbose: true }) // \"1 atmosphere\"\n */\nexport function formatPressure(\n value: number,\n unit: PressureUnit,\n options?: { decimals?: number; verbose?: boolean; locale?: string },\n): string {\n return pressureRole.format(unit, value, options);\n}\n\n/**\n * Valida valor de pressão\n *\n * @example\n * validatePressure(100) // { valid: true, errors: [] }\n * validatePressure(-5) // { valid: false, errors: ['Pressure cannot be negative'] }\n */\nexport function validatePressure(value: unknown): {\n valid: boolean;\n errors: string[];\n} {\n return pressureRole.validate(\"pascal\", value);\n}\n\n/**\n * Faz cast de input para número\n *\n * @example\n * castPressure('100 Pa') // 100\n * castPressure('1 bar') // 100000 (em pascal)\n * castPressure('invalid') // null\n */\nexport function castPressure(\n input: unknown,\n targetUnit: PressureUnit = \"pascal\",\n): number | null {\n return pressureRole.cast(targetUnit, input);\n}\n\n/**\n * Versão safe de castPressure que retorna Result\n */\nexport function tryCastPressure(\n input: unknown,\n targetUnit: PressureUnit = \"pascal\",\n): { ok: true; value: number } | { ok: false; error: string } {\n return pressureRole.tryCast(targetUnit, input);\n}\n\n/**\n * Detecta unidade de uma string\n *\n * @example\n * detectPressureUnit('100 bar') // 'bar'\n * detectPressureUnit('14.7 psi') // 'psi'\n * detectPressureUnit('100') // null\n */\nexport function detectPressureUnit(input: string): PressureUnit | null {\n const trimmed = input.trim().toLowerCase();\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n return (pressureRole as any).detectUnit(unitStr) as PressureUnit | null;\n}\n","/**\n * Color Role - Types\n *\n * Tipos para representação de cores nas diferentes variantes.\n */\n\n// =============================================================================\n// BASE TYPE\n// =============================================================================\n\n/**\n * Tipo base para Color: objeto RGBA com valores 0-255 e alpha 0-1\n *\n * @example\n * const red: RGBA = { r: 255, g: 0, b: 0, a: 1 };\n * const semiTransparent: RGBA = { r: 0, g: 0, b: 255, a: 0.5 };\n */\nexport interface RGBA {\n r: number; // 0-255\n g: number; // 0-255\n b: number; // 0-255\n a: number; // 0-1\n}\n\n// =============================================================================\n// VARIANT TYPES\n// =============================================================================\n\n/**\n * Variante Hex\n *\n * @example\n * \"#ff0000\" // RGB (6 chars)\n * \"#ff0000ff\" // RGBA (8 chars)\n * \"#f00\" // RGB shorthand (3 chars)\n * \"#f00f\" // RGBA shorthand (4 chars)\n */\nexport type ColorHex = string;\n\n/**\n * Variante RGB Object\n *\n * @example\n * { r: 255, g: 0, b: 0 }\n * { r: 255, g: 0, b: 0, a: 0.5 }\n */\nexport interface ColorRgbObject {\n r: number;\n g: number;\n b: number;\n a?: number;\n}\n\n/**\n * Variante RGB String\n *\n * @example\n * \"rgb(255, 0, 0)\"\n * \"rgba(255, 0, 0, 0.5)\"\n */\nexport type ColorRgbString = string;\n\n/**\n * Variante HSL Object\n *\n * @example\n * { h: 0, s: 100, l: 50 } // Red\n * { h: 0, s: 100, l: 50, a: 0.5 } // Semi-transparent red\n */\nexport interface ColorHslObject {\n h: number; // 0-360\n s: number; // 0-100\n l: number; // 0-100\n a?: number; // 0-1\n}\n\n/**\n * Variante HSL String\n *\n * @example\n * \"hsl(0, 100%, 50%)\"\n * \"hsla(0, 100%, 50%, 0.5)\"\n */\nexport type ColorHslString = string;\n\n// =============================================================================\n// VARIANT NAMES\n// =============================================================================\n\nexport type ColorVariant =\n | \"hex\"\n | \"rgb_object\"\n | \"rgb_string\"\n | \"hsl_object\"\n | \"hsl_string\";\n\n// =============================================================================\n// FORMAT OPTIONS\n// =============================================================================\n\nimport type { BaseFormatOptions } from \"../../types\";\n\nexport interface ColorFormatOptions extends BaseFormatOptions {\n /** Se true, usa letras maiúsculas para hex */\n uppercase?: boolean;\n\n /** Se true, inclui alpha mesmo quando é 1 */\n includeAlpha?: boolean;\n\n /** Se true, usa formato compacto (shorthand hex, sem espaços em rgb) */\n compact?: boolean;\n}\n\n// =============================================================================\n// NAMED COLORS\n// =============================================================================\n\n/**\n * CSS Named Colors mais comuns\n */\nexport const NAMED_COLORS: Record<string, RGBA> = {\n // Basic colors\n black: { r: 0, g: 0, b: 0, a: 1 },\n white: { r: 255, g: 255, b: 255, a: 1 },\n red: { r: 255, g: 0, b: 0, a: 1 },\n green: { r: 0, g: 128, b: 0, a: 1 },\n blue: { r: 0, g: 0, b: 255, a: 1 },\n yellow: { r: 255, g: 255, b: 0, a: 1 },\n cyan: { r: 0, g: 255, b: 255, a: 1 },\n magenta: { r: 255, g: 0, b: 255, a: 1 },\n\n // Extended colors\n orange: { r: 255, g: 165, b: 0, a: 1 },\n purple: { r: 128, g: 0, b: 128, a: 1 },\n pink: { r: 255, g: 192, b: 203, a: 1 },\n brown: { r: 165, g: 42, b: 42, a: 1 },\n gray: { r: 128, g: 128, b: 128, a: 1 },\n grey: { r: 128, g: 128, b: 128, a: 1 },\n\n // Web colors\n lime: { r: 0, g: 255, b: 0, a: 1 },\n aqua: { r: 0, g: 255, b: 255, a: 1 },\n fuchsia: { r: 255, g: 0, b: 255, a: 1 },\n silver: { r: 192, g: 192, b: 192, a: 1 },\n maroon: { r: 128, g: 0, b: 0, a: 1 },\n olive: { r: 128, g: 128, b: 0, a: 1 },\n navy: { r: 0, g: 0, b: 128, a: 1 },\n teal: { r: 0, g: 128, b: 128, a: 1 },\n\n // Transparent\n transparent: { r: 0, g: 0, b: 0, a: 0 },\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Clamp um valor entre min e max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Normaliza um canal RGB para 0-255\n */\nexport function normalizeRgbChannel(value: number): number {\n return clamp(Math.round(value), 0, 255);\n}\n\n/**\n * Normaliza alpha para 0-1\n */\nexport function normalizeAlpha(value: number | undefined): number {\n if (value === undefined) return 1;\n return clamp(value, 0, 1);\n}\n\n/**\n * Converte RGB para HSL\n */\nexport function rgbToHsl(\n r: number,\n g: number,\n b: number,\n): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n\n if (max === min) {\n return { h: 0, s: 0, l: l * 100 };\n }\n\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n let h: number;\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n default:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\n/**\n * Converte HSL para RGB\n */\nexport function hslToRgb(\n h: number,\n s: number,\n l: number,\n): { r: number; g: number; b: number } {\n h /= 360;\n s /= 100;\n l /= 100;\n\n if (s === 0) {\n const gray = Math.round(l * 255);\n return { r: gray, g: gray, b: gray };\n }\n\n const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n return {\n r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, h) * 255),\n b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n };\n}\n","/**\n * HexVariant - Variante Hexadecimal para Color\n *\n * Representa cor como string hexadecimal.\n *\n * @example\n * \"#ff0000\" // RGB (6 chars)\n * \"#ff0000ff\" // RGBA (8 chars)\n * \"#f00\" // RGB shorthand (3 chars)\n * \"#f00f\" // RGBA shorthand (4 chars)\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorHex, ColorFormatOptions } from \"../types\";\nimport {\n NAMED_COLORS,\n normalizeRgbChannel,\n normalizeAlpha,\n hslToRgb,\n} from \"../types\";\n\n// Regex patterns\nconst HEX_REGEX_3 = /^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i;\nconst HEX_REGEX_4 = /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])$/i;\nconst HEX_REGEX_6 = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\nconst HEX_REGEX_8 = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\n\nexport class HexVariant extends BaseVariant<ColorHex, RGBA> {\n readonly name = \"hex\";\n readonly type = \"string\" as const;\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n toBase(value: ColorHex): RGBA {\n const hex = value.trim();\n\n // Try 8-char hex (#rrggbbaa)\n let match = hex.match(HEX_REGEX_8);\n if (match) {\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n a: parseInt(match[4], 16) / 255,\n };\n }\n\n // Try 6-char hex (#rrggbb)\n match = hex.match(HEX_REGEX_6);\n if (match) {\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n a: 1,\n };\n }\n\n // Try 4-char hex (#rgba)\n match = hex.match(HEX_REGEX_4);\n if (match) {\n return {\n r: parseInt(match[1] + match[1], 16),\n g: parseInt(match[2] + match[2], 16),\n b: parseInt(match[3] + match[3], 16),\n a: parseInt(match[4] + match[4], 16) / 255,\n };\n }\n\n // Try 3-char hex (#rgb)\n match = hex.match(HEX_REGEX_3);\n if (match) {\n return {\n r: parseInt(match[1] + match[1], 16),\n g: parseInt(match[2] + match[2], 16),\n b: parseInt(match[3] + match[3], 16),\n a: 1,\n };\n }\n\n throw new Error(`Invalid hex color: ${value}`);\n }\n\n fromBase(base: RGBA): ColorHex {\n const r = normalizeRgbChannel(base.r).toString(16).padStart(2, \"0\");\n const g = normalizeRgbChannel(base.g).toString(16).padStart(2, \"0\");\n const b = normalizeRgbChannel(base.b).toString(16).padStart(2, \"0\");\n\n const alpha = normalizeAlpha(base.a);\n\n // Include alpha only if not fully opaque\n if (alpha < 1) {\n const a = Math.round(alpha * 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${r}${g}${b}${a}`;\n }\n\n return `#${r}${g}${b}`;\n }\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n cast(input: unknown): ColorHex | null {\n // Already a string\n if (typeof input === \"string\") {\n const trimmed = input.trim().toLowerCase();\n\n // Named color\n if (NAMED_COLORS[trimmed]) {\n return this.fromBase(NAMED_COLORS[trimmed]);\n }\n\n // Hex format (with or without #)\n if (\n HEX_REGEX_8.test(trimmed) ||\n HEX_REGEX_6.test(trimmed) ||\n HEX_REGEX_4.test(trimmed) ||\n HEX_REGEX_3.test(trimmed)\n ) {\n // Normalize to #rrggbb or #rrggbbaa\n try {\n const rgba = this.toBase(trimmed);\n return this.fromBase(rgba);\n } catch {\n return null;\n }\n }\n\n // Try rgb()/rgba() string\n const rgbMatch = trimmed.match(\n /^rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (rgbMatch) {\n const rgba: RGBA = {\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n a: rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1,\n };\n return this.fromBase(rgba);\n }\n\n // Try hsl()/hsla() string\n const hslMatch = trimmed.match(\n /^hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (hslMatch) {\n const rgb = hslToRgb(\n parseInt(hslMatch[1], 10),\n parseInt(hslMatch[2], 10),\n parseInt(hslMatch[3], 10),\n );\n const rgba: RGBA = {\n ...rgb,\n a: hslMatch[4] ? parseFloat(hslMatch[4]) : 1,\n };\n return this.fromBase(rgba);\n }\n\n return null;\n }\n\n // Object with r, g, b properties\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"r\" in input &&\n \"g\" in input &&\n \"b\" in input\n ) {\n const obj = input as { r: number; g: number; b: number; a?: number };\n const rgba: RGBA = {\n r: obj.r,\n g: obj.g,\n b: obj.b,\n a: obj.a ?? 1,\n };\n return this.fromBase(rgba);\n }\n\n // Object with h, s, l properties\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"h\" in input &&\n \"s\" in input &&\n \"l\" in input\n ) {\n const obj = input as { h: number; s: number; l: number; a?: number };\n const rgb = hslToRgb(obj.h, obj.s, obj.l);\n const rgba: RGBA = {\n ...rgb,\n a: obj.a ?? 1,\n };\n return this.fromBase(rgba);\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n validate(value: ColorHex): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"string\") {\n errors.push(\"Hex color must be a string\");\n return { valid: false, errors };\n }\n\n const hex = value.trim();\n\n if (\n !HEX_REGEX_8.test(hex) &&\n !HEX_REGEX_6.test(hex) &&\n !HEX_REGEX_4.test(hex) &&\n !HEX_REGEX_3.test(hex)\n ) {\n errors.push(\"Invalid hex format. Use #rgb, #rgba, #rrggbb, or #rrggbbaa\");\n return { valid: false, errors };\n }\n\n return { valid: true, errors: [] };\n }\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n format(value: ColorHex, options?: FormatOptions): string {\n const opts = options as ColorFormatOptions | undefined;\n\n try {\n const rgba = this.toBase(value);\n let hex = this.fromBase(rgba);\n\n // Uppercase\n if (opts?.uppercase) {\n hex = hex.toUpperCase();\n }\n\n // Include alpha even if 1\n if (opts?.includeAlpha && rgba.a === 1) {\n const a = \"ff\";\n hex = hex.length === 7 ? `${hex}${opts.uppercase ? \"FF\" : \"ff\"}` : hex;\n }\n\n // Compact (shorthand if possible)\n if (opts?.compact && hex.length === 7) {\n const canShorten =\n hex[1] === hex[2] && hex[3] === hex[4] && hex[5] === hex[6];\n if (canShorten) {\n hex = `#${hex[1]}${hex[3]}${hex[5]}`;\n if (opts.uppercase) hex = hex.toUpperCase();\n }\n }\n\n return hex;\n } catch {\n return value;\n }\n }\n}\n","/**\n * RgbObjectVariant - Variante RGB Object para Color\n *\n * Representa cor como objeto { r, g, b, a? }\n *\n * @example\n * { r: 255, g: 0, b: 0 }\n * { r: 255, g: 0, b: 0, a: 0.5 }\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorRgbObject, ColorFormatOptions } from \"../types\";\nimport {\n NAMED_COLORS,\n normalizeRgbChannel,\n normalizeAlpha,\n hslToRgb,\n} from \"../types\";\n\nexport class RgbObjectVariant extends BaseVariant<ColorRgbObject, RGBA> {\n readonly name = \"rgb_object\";\n readonly type = \"object\" as const;\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n toBase(value: ColorRgbObject): RGBA {\n return {\n r: normalizeRgbChannel(value.r),\n g: normalizeRgbChannel(value.g),\n b: normalizeRgbChannel(value.b),\n a: normalizeAlpha(value.a),\n };\n }\n\n fromBase(base: RGBA): ColorRgbObject {\n const result: ColorRgbObject = {\n r: normalizeRgbChannel(base.r),\n g: normalizeRgbChannel(base.g),\n b: normalizeRgbChannel(base.b),\n };\n\n // Only include alpha if not 1\n if (base.a !== undefined && base.a < 1) {\n result.a = normalizeAlpha(base.a);\n }\n\n return result;\n }\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n cast(input: unknown): ColorRgbObject | null {\n // Already an RGB object\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"r\" in input &&\n \"g\" in input &&\n \"b\" in input\n ) {\n const obj = input as { r: unknown; g: unknown; b: unknown; a?: unknown };\n\n if (\n typeof obj.r !== \"number\" ||\n typeof obj.g !== \"number\" ||\n typeof obj.b !== \"number\"\n ) {\n return null;\n }\n\n return this.fromBase({\n r: obj.r,\n g: obj.g,\n b: obj.b,\n a: typeof obj.a === \"number\" ? obj.a : 1,\n });\n }\n\n // HSL object\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"h\" in input &&\n \"s\" in input &&\n \"l\" in input\n ) {\n const obj = input as { h: number; s: number; l: number; a?: number };\n const rgb = hslToRgb(obj.h, obj.s, obj.l);\n return this.fromBase({\n ...rgb,\n a: obj.a ?? 1,\n });\n }\n\n // String formats\n if (typeof input === \"string\") {\n const trimmed = input.trim().toLowerCase();\n\n // Named color\n if (NAMED_COLORS[trimmed]) {\n return this.fromBase(NAMED_COLORS[trimmed]);\n }\n\n // Hex format\n const hexMatch = trimmed.match(\n /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,\n );\n if (hexMatch) {\n return this.fromBase({\n r: parseInt(hexMatch[1], 16),\n g: parseInt(hexMatch[2], 16),\n b: parseInt(hexMatch[3], 16),\n a: hexMatch[4] ? parseInt(hexMatch[4], 16) / 255 : 1,\n });\n }\n\n // Shorthand hex\n const hexShortMatch = trimmed.match(\n /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,\n );\n if (hexShortMatch) {\n return this.fromBase({\n r: parseInt(hexShortMatch[1] + hexShortMatch[1], 16),\n g: parseInt(hexShortMatch[2] + hexShortMatch[2], 16),\n b: parseInt(hexShortMatch[3] + hexShortMatch[3], 16),\n a: hexShortMatch[4]\n ? parseInt(hexShortMatch[4] + hexShortMatch[4], 16) / 255\n : 1,\n });\n }\n\n // rgb()/rgba() string\n const rgbMatch = trimmed.match(\n /^rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (rgbMatch) {\n return this.fromBase({\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n a: rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1,\n });\n }\n\n // hsl()/hsla() string\n const hslMatch = trimmed.match(\n /^hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (hslMatch) {\n const rgb = hslToRgb(\n parseInt(hslMatch[1], 10),\n parseInt(hslMatch[2], 10),\n parseInt(hslMatch[3], 10),\n );\n return this.fromBase({\n ...rgb,\n a: hslMatch[4] ? parseFloat(hslMatch[4]) : 1,\n });\n }\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n validate(value: ColorRgbObject): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"object\" || value === null) {\n errors.push(\"RGB color must be an object\");\n return { valid: false, errors };\n }\n\n if (!(\"r\" in value) || !(\"g\" in value) || !(\"b\" in value)) {\n errors.push(\"RGB color must have r, g, b properties\");\n return { valid: false, errors };\n }\n\n if (\n typeof value.r !== \"number\" ||\n typeof value.g !== \"number\" ||\n typeof value.b !== \"number\"\n ) {\n errors.push(\"r, g, b must be numbers\");\n return { valid: false, errors };\n }\n\n if (value.r < 0 || value.r > 255) {\n errors.push(\"r must be between 0 and 255\");\n }\n if (value.g < 0 || value.g > 255) {\n errors.push(\"g must be between 0 and 255\");\n }\n if (value.b < 0 || value.b > 255) {\n errors.push(\"b must be between 0 and 255\");\n }\n\n if (value.a !== undefined) {\n if (typeof value.a !== \"number\") {\n errors.push(\"a must be a number\");\n } else if (value.a < 0 || value.a > 1) {\n errors.push(\"a must be between 0 and 1\");\n }\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n format(value: ColorRgbObject, options?: FormatOptions): string {\n const opts = options as ColorFormatOptions | undefined;\n const rgba = this.toBase(value);\n\n const r = rgba.r;\n const g = rgba.g;\n const b = rgba.b;\n const a = rgba.a;\n\n if (opts?.includeAlpha || a < 1) {\n if (opts?.compact) {\n return `rgba(${r},${g},${b},${a})`;\n }\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n\n if (opts?.compact) {\n return `rgb(${r},${g},${b})`;\n }\n return `rgb(${r}, ${g}, ${b})`;\n }\n}\n","/**\n * RgbStringVariant - Variante RGB String para Color\n *\n * Representa cor como string rgb()/rgba()\n *\n * @example\n * \"rgb(255, 0, 0)\"\n * \"rgba(255, 0, 0, 0.5)\"\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorRgbString, ColorFormatOptions } from \"../types\";\nimport {\n NAMED_COLORS,\n normalizeRgbChannel,\n normalizeAlpha,\n hslToRgb,\n} from \"../types\";\n\n// Regex patterns\nconst RGB_REGEX = /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i;\nconst RGBA_REGEX =\n /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d.]+)\\s*\\)$/i;\n\nexport class RgbStringVariant extends BaseVariant<ColorRgbString, RGBA> {\n readonly name = \"rgb_string\";\n readonly type = \"string\" as const;\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n toBase(value: ColorRgbString): RGBA {\n const str = value.trim();\n\n // Try rgba() first\n let match = str.match(RGBA_REGEX);\n if (match) {\n return {\n r: normalizeRgbChannel(parseInt(match[1], 10)),\n g: normalizeRgbChannel(parseInt(match[2], 10)),\n b: normalizeRgbChannel(parseInt(match[3], 10)),\n a: normalizeAlpha(parseFloat(match[4])),\n };\n }\n\n // Try rgb()\n match = str.match(RGB_REGEX);\n if (match) {\n return {\n r: normalizeRgbChannel(parseInt(match[1], 10)),\n g: normalizeRgbChannel(parseInt(match[2], 10)),\n b: normalizeRgbChannel(parseInt(match[3], 10)),\n a: 1,\n };\n }\n\n throw new Error(`Invalid rgb string: ${value}`);\n }\n\n fromBase(base: RGBA): ColorRgbString {\n const r = normalizeRgbChannel(base.r);\n const g = normalizeRgbChannel(base.g);\n const b = normalizeRgbChannel(base.b);\n const a = normalizeAlpha(base.a);\n\n if (a < 1) {\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n\n return `rgb(${r}, ${g}, ${b})`;\n }\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n cast(input: unknown): ColorRgbString | null {\n // Already a string\n if (typeof input === \"string\") {\n const trimmed = input.trim().toLowerCase();\n\n // Named color\n if (NAMED_COLORS[trimmed]) {\n return this.fromBase(NAMED_COLORS[trimmed]);\n }\n\n // Already rgb/rgba format\n if (RGB_REGEX.test(trimmed) || RGBA_REGEX.test(trimmed)) {\n try {\n const rgba = this.toBase(trimmed);\n return this.fromBase(rgba);\n } catch {\n return null;\n }\n }\n\n // Hex format\n const hexMatch = trimmed.match(\n /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,\n );\n if (hexMatch) {\n return this.fromBase({\n r: parseInt(hexMatch[1], 16),\n g: parseInt(hexMatch[2], 16),\n b: parseInt(hexMatch[3], 16),\n a: hexMatch[4] ? parseInt(hexMatch[4], 16) / 255 : 1,\n });\n }\n\n // Shorthand hex\n const hexShortMatch = trimmed.match(\n /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,\n );\n if (hexShortMatch) {\n return this.fromBase({\n r: parseInt(hexShortMatch[1] + hexShortMatch[1], 16),\n g: parseInt(hexShortMatch[2] + hexShortMatch[2], 16),\n b: parseInt(hexShortMatch[3] + hexShortMatch[3], 16),\n a: hexShortMatch[4]\n ? parseInt(hexShortMatch[4] + hexShortMatch[4], 16) / 255\n : 1,\n });\n }\n\n // hsl()/hsla() string\n const hslMatch = trimmed.match(\n /^hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (hslMatch) {\n const rgb = hslToRgb(\n parseInt(hslMatch[1], 10),\n parseInt(hslMatch[2], 10),\n parseInt(hslMatch[3], 10),\n );\n return this.fromBase({\n ...rgb,\n a: hslMatch[4] ? parseFloat(hslMatch[4]) : 1,\n });\n }\n\n return null;\n }\n\n // RGB object\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"r\" in input &&\n \"g\" in input &&\n \"b\" in input\n ) {\n const obj = input as { r: number; g: number; b: number; a?: number };\n return this.fromBase({\n r: obj.r,\n g: obj.g,\n b: obj.b,\n a: obj.a ?? 1,\n });\n }\n\n // HSL object\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"h\" in input &&\n \"s\" in input &&\n \"l\" in input\n ) {\n const obj = input as { h: number; s: number; l: number; a?: number };\n const rgb = hslToRgb(obj.h, obj.s, obj.l);\n return this.fromBase({\n ...rgb,\n a: obj.a ?? 1,\n });\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n validate(value: ColorRgbString): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"string\") {\n errors.push(\"RGB string must be a string\");\n return { valid: false, errors };\n }\n\n const str = value.trim();\n\n if (!RGB_REGEX.test(str) && !RGBA_REGEX.test(str)) {\n errors.push('Invalid format. Use \"rgb(r, g, b)\" or \"rgba(r, g, b, a)\"');\n return { valid: false, errors };\n }\n\n // Parse and validate values\n try {\n const rgba = this.toBase(value);\n\n if (rgba.r < 0 || rgba.r > 255) {\n errors.push(\"Red value must be between 0 and 255\");\n }\n if (rgba.g < 0 || rgba.g > 255) {\n errors.push(\"Green value must be between 0 and 255\");\n }\n if (rgba.b < 0 || rgba.b > 255) {\n errors.push(\"Blue value must be between 0 and 255\");\n }\n if (rgba.a < 0 || rgba.a > 1) {\n errors.push(\"Alpha value must be between 0 and 1\");\n }\n } catch {\n errors.push(\"Invalid RGB string format\");\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n format(value: ColorRgbString, options?: FormatOptions): string {\n const opts = options as ColorFormatOptions | undefined;\n\n try {\n const rgba = this.toBase(value);\n const r = rgba.r;\n const g = rgba.g;\n const b = rgba.b;\n const a = rgba.a;\n\n if (opts?.includeAlpha || a < 1) {\n if (opts?.compact) {\n return `rgba(${r},${g},${b},${a})`;\n }\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n\n if (opts?.compact) {\n return `rgb(${r},${g},${b})`;\n }\n return `rgb(${r}, ${g}, ${b})`;\n } catch {\n return value;\n }\n }\n}\n","/**\n * HslObjectVariant - Variante HSL Object para Color\n *\n * Representa cor como objeto { h, s, l, a? }\n *\n * @example\n * { h: 0, s: 100, l: 50 } // Red\n * { h: 0, s: 100, l: 50, a: 0.5 } // Semi-transparent red\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorHslObject, ColorFormatOptions } from \"../types\";\nimport {\n NAMED_COLORS,\n normalizeAlpha,\n rgbToHsl,\n hslToRgb,\n clamp,\n} from \"../types\";\n\nexport class HslObjectVariant extends BaseVariant<ColorHslObject, RGBA> {\n readonly name = \"hsl_object\";\n readonly type = \"object\" as const;\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n toBase(value: ColorHslObject): RGBA {\n const h = clamp(value.h, 0, 360);\n const s = clamp(value.s, 0, 100);\n const l = clamp(value.l, 0, 100);\n const a = normalizeAlpha(value.a);\n\n const rgb = hslToRgb(h, s, l);\n\n return {\n r: rgb.r,\n g: rgb.g,\n b: rgb.b,\n a,\n };\n }\n\n fromBase(base: RGBA): ColorHslObject {\n const hsl = rgbToHsl(base.r, base.g, base.b);\n\n const result: ColorHslObject = {\n h: hsl.h,\n s: hsl.s,\n l: hsl.l,\n };\n\n // Only include alpha if not 1\n if (base.a !== undefined && base.a < 1) {\n result.a = normalizeAlpha(base.a);\n }\n\n return result;\n }\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n cast(input: unknown): ColorHslObject | null {\n // Already an HSL object\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"h\" in input &&\n \"s\" in input &&\n \"l\" in input\n ) {\n const obj = input as { h: unknown; s: unknown; l: unknown; a?: unknown };\n\n if (\n typeof obj.h !== \"number\" ||\n typeof obj.s !== \"number\" ||\n typeof obj.l !== \"number\"\n ) {\n return null;\n }\n\n const result: ColorHslObject = {\n h: clamp(Math.round(obj.h), 0, 360),\n s: clamp(Math.round(obj.s), 0, 100),\n l: clamp(Math.round(obj.l), 0, 100),\n };\n\n if (typeof obj.a === \"number\") {\n result.a = normalizeAlpha(obj.a);\n }\n\n return result;\n }\n\n // RGB object\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"r\" in input &&\n \"g\" in input &&\n \"b\" in input\n ) {\n const obj = input as { r: number; g: number; b: number; a?: number };\n return this.fromBase({\n r: obj.r,\n g: obj.g,\n b: obj.b,\n a: obj.a ?? 1,\n });\n }\n\n // String formats\n if (typeof input === \"string\") {\n const trimmed = input.trim().toLowerCase();\n\n // Named color\n if (NAMED_COLORS[trimmed]) {\n return this.fromBase(NAMED_COLORS[trimmed]);\n }\n\n // Hex format\n const hexMatch = trimmed.match(\n /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,\n );\n if (hexMatch) {\n return this.fromBase({\n r: parseInt(hexMatch[1], 16),\n g: parseInt(hexMatch[2], 16),\n b: parseInt(hexMatch[3], 16),\n a: hexMatch[4] ? parseInt(hexMatch[4], 16) / 255 : 1,\n });\n }\n\n // Shorthand hex\n const hexShortMatch = trimmed.match(\n /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,\n );\n if (hexShortMatch) {\n return this.fromBase({\n r: parseInt(hexShortMatch[1] + hexShortMatch[1], 16),\n g: parseInt(hexShortMatch[2] + hexShortMatch[2], 16),\n b: parseInt(hexShortMatch[3] + hexShortMatch[3], 16),\n a: hexShortMatch[4]\n ? parseInt(hexShortMatch[4] + hexShortMatch[4], 16) / 255\n : 1,\n });\n }\n\n // rgb()/rgba() string\n const rgbMatch = trimmed.match(\n /^rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (rgbMatch) {\n return this.fromBase({\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n a: rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1,\n });\n }\n\n // hsl()/hsla() string\n const hslMatch = trimmed.match(\n /^hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (hslMatch) {\n const result: ColorHslObject = {\n h: clamp(parseInt(hslMatch[1], 10), 0, 360),\n s: clamp(parseInt(hslMatch[2], 10), 0, 100),\n l: clamp(parseInt(hslMatch[3], 10), 0, 100),\n };\n if (hslMatch[4]) {\n result.a = normalizeAlpha(parseFloat(hslMatch[4]));\n }\n return result;\n }\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n validate(value: ColorHslObject): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"object\" || value === null) {\n errors.push(\"HSL color must be an object\");\n return { valid: false, errors };\n }\n\n if (!(\"h\" in value) || !(\"s\" in value) || !(\"l\" in value)) {\n errors.push(\"HSL color must have h, s, l properties\");\n return { valid: false, errors };\n }\n\n if (\n typeof value.h !== \"number\" ||\n typeof value.s !== \"number\" ||\n typeof value.l !== \"number\"\n ) {\n errors.push(\"h, s, l must be numbers\");\n return { valid: false, errors };\n }\n\n if (value.h < 0 || value.h > 360) {\n errors.push(\"h (hue) must be between 0 and 360\");\n }\n if (value.s < 0 || value.s > 100) {\n errors.push(\"s (saturation) must be between 0 and 100\");\n }\n if (value.l < 0 || value.l > 100) {\n errors.push(\"l (lightness) must be between 0 and 100\");\n }\n\n if (value.a !== undefined) {\n if (typeof value.a !== \"number\") {\n errors.push(\"a must be a number\");\n } else if (value.a < 0 || value.a > 1) {\n errors.push(\"a must be between 0 and 1\");\n }\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n format(value: ColorHslObject, options?: FormatOptions): string {\n const opts = options as ColorFormatOptions | undefined;\n\n const h = clamp(Math.round(value.h), 0, 360);\n const s = clamp(Math.round(value.s), 0, 100);\n const l = clamp(Math.round(value.l), 0, 100);\n const a = value.a !== undefined ? normalizeAlpha(value.a) : 1;\n\n if (opts?.includeAlpha || a < 1) {\n if (opts?.compact) {\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n }\n\n if (opts?.compact) {\n return `hsl(${h},${s}%,${l}%)`;\n }\n return `hsl(${h}, ${s}%, ${l}%)`;\n }\n}\n","/**\n * HslStringVariant - Variante HSL String para Color\n *\n * Representa cor como string hsl()/hsla()\n *\n * @example\n * \"hsl(0, 100%, 50%)\"\n * \"hsla(0, 100%, 50%, 0.5)\"\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorHslString, ColorFormatOptions } from \"../types\";\nimport {\n NAMED_COLORS,\n normalizeAlpha,\n rgbToHsl,\n hslToRgb,\n clamp,\n} from \"../types\";\n\n// Regex patterns\nconst HSL_REGEX = /^hsl\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*\\)$/i;\nconst HSLA_REGEX =\n /^hsla\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*,\\s*([\\d.]+)\\s*\\)$/i;\n\nexport class HslStringVariant extends BaseVariant<ColorHslString, RGBA> {\n readonly name = \"hsl_string\";\n readonly type = \"string\" as const;\n\n // ===========================================================================\n // CONVERT\n // ===========================================================================\n\n toBase(value: ColorHslString): RGBA {\n const str = value.trim();\n\n // Try hsla() first\n let match = str.match(HSLA_REGEX);\n if (match) {\n const h = clamp(parseInt(match[1], 10), 0, 360);\n const s = clamp(parseInt(match[2], 10), 0, 100);\n const l = clamp(parseInt(match[3], 10), 0, 100);\n const a = normalizeAlpha(parseFloat(match[4]));\n\n const rgb = hslToRgb(h, s, l);\n return { ...rgb, a };\n }\n\n // Try hsl()\n match = str.match(HSL_REGEX);\n if (match) {\n const h = clamp(parseInt(match[1], 10), 0, 360);\n const s = clamp(parseInt(match[2], 10), 0, 100);\n const l = clamp(parseInt(match[3], 10), 0, 100);\n\n const rgb = hslToRgb(h, s, l);\n return { ...rgb, a: 1 };\n }\n\n throw new Error(`Invalid hsl string: ${value}`);\n }\n\n fromBase(base: RGBA): ColorHslString {\n const hsl = rgbToHsl(base.r, base.g, base.b);\n const a = normalizeAlpha(base.a);\n\n if (a < 1) {\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${a})`;\n }\n\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n\n // ===========================================================================\n // CAST\n // ===========================================================================\n\n cast(input: unknown): ColorHslString | null {\n // Already a string\n if (typeof input === \"string\") {\n const trimmed = input.trim().toLowerCase();\n\n // Named color\n if (NAMED_COLORS[trimmed]) {\n return this.fromBase(NAMED_COLORS[trimmed]);\n }\n\n // Already hsl/hsla format\n if (HSL_REGEX.test(trimmed) || HSLA_REGEX.test(trimmed)) {\n try {\n const rgba = this.toBase(trimmed);\n return this.fromBase(rgba);\n } catch {\n return null;\n }\n }\n\n // Hex format\n const hexMatch = trimmed.match(\n /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,\n );\n if (hexMatch) {\n return this.fromBase({\n r: parseInt(hexMatch[1], 16),\n g: parseInt(hexMatch[2], 16),\n b: parseInt(hexMatch[3], 16),\n a: hexMatch[4] ? parseInt(hexMatch[4], 16) / 255 : 1,\n });\n }\n\n // Shorthand hex\n const hexShortMatch = trimmed.match(\n /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,\n );\n if (hexShortMatch) {\n return this.fromBase({\n r: parseInt(hexShortMatch[1] + hexShortMatch[1], 16),\n g: parseInt(hexShortMatch[2] + hexShortMatch[2], 16),\n b: parseInt(hexShortMatch[3] + hexShortMatch[3], 16),\n a: hexShortMatch[4]\n ? parseInt(hexShortMatch[4] + hexShortMatch[4], 16) / 255\n : 1,\n });\n }\n\n // rgb()/rgba() string\n const rgbMatch = trimmed.match(\n /^rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (rgbMatch) {\n return this.fromBase({\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n a: rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1,\n });\n }\n\n return null;\n }\n\n // RGB object\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"r\" in input &&\n \"g\" in input &&\n \"b\" in input\n ) {\n const obj = input as { r: number; g: number; b: number; a?: number };\n return this.fromBase({\n r: obj.r,\n g: obj.g,\n b: obj.b,\n a: obj.a ?? 1,\n });\n }\n\n // HSL object\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"h\" in input &&\n \"s\" in input &&\n \"l\" in input\n ) {\n const obj = input as { h: number; s: number; l: number; a?: number };\n const rgb = hslToRgb(obj.h, obj.s, obj.l);\n return this.fromBase({\n ...rgb,\n a: obj.a ?? 1,\n });\n }\n\n return null;\n }\n\n // ===========================================================================\n // VALIDATE\n // ===========================================================================\n\n validate(value: ColorHslString): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"string\") {\n errors.push(\"HSL string must be a string\");\n return { valid: false, errors };\n }\n\n const str = value.trim();\n\n if (!HSL_REGEX.test(str) && !HSLA_REGEX.test(str)) {\n errors.push(\n 'Invalid format. Use \"hsl(h, s%, l%)\" or \"hsla(h, s%, l%, a)\"',\n );\n return { valid: false, errors };\n }\n\n // Parse and validate values\n try {\n const rgba = this.toBase(value);\n\n // Values are already clamped in toBase, but we can add warnings\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n if (hsl.h < 0 || hsl.h > 360) {\n errors.push(\"Hue must be between 0 and 360\");\n }\n if (hsl.s < 0 || hsl.s > 100) {\n errors.push(\"Saturation must be between 0 and 100\");\n }\n if (hsl.l < 0 || hsl.l > 100) {\n errors.push(\"Lightness must be between 0 and 100\");\n }\n if (rgba.a < 0 || rgba.a > 1) {\n errors.push(\"Alpha must be between 0 and 1\");\n }\n } catch {\n errors.push(\"Invalid HSL string format\");\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ===========================================================================\n // FORMAT\n // ===========================================================================\n\n format(value: ColorHslString, options?: FormatOptions): string {\n const opts = options as ColorFormatOptions | undefined;\n\n try {\n const rgba = this.toBase(value);\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n const a = rgba.a;\n\n if (opts?.includeAlpha || a < 1) {\n if (opts?.compact) {\n return `hsla(${hsl.h},${hsl.s}%,${hsl.l}%,${a})`;\n }\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${a})`;\n }\n\n if (opts?.compact) {\n return `hsl(${hsl.h},${hsl.s}%,${hsl.l}%)`;\n }\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n } catch {\n return value;\n }\n }\n}\n","/**\n * ColorRole - Role para conversão e manipulação de cores\n *\n * ComplexRole com 5 variantes:\n * - hex: string hexadecimal (\"#ff0000\", \"#ff0000ff\")\n * - rgb_object: objeto { r, g, b, a? }\n * - rgb_string: string \"rgb(255, 0, 0)\" ou \"rgba(255, 0, 0, 0.5)\"\n * - hsl_object: objeto { h, s, l, a? }\n * - hsl_string: string \"hsl(0, 100%, 50%)\" ou \"hsla(0, 100%, 50%, 0.5)\"\n *\n * @example\n * const color = new ColorRole();\n * color.convert('hex', 'rgb_object', '#ff0000') // { r: 255, g: 0, b: 0 }\n * color.convert('rgb_object', 'hsl_string', { r: 255, g: 0, b: 0 }) // \"hsl(0, 100%, 50%)\"\n * color.cast('hex', 'red') // '#ff0000'\n * color.format('hex', '#ff0000', { uppercase: true }) // '#FF0000'\n */\n\nimport { ComplexRole } from \"../../contracts\";\nimport type { IVariant } from \"../../contracts\";\nimport type { RGBA, ColorFormatOptions } from \"./types\";\nimport { NAMED_COLORS } from \"./types\";\nimport {\n HexVariant,\n RgbObjectVariant,\n RgbStringVariant,\n HslObjectVariant,\n HslStringVariant,\n} from \"./variants\";\n\n// =============================================================================\n// COLOR ROLE CLASS\n// =============================================================================\n\nexport class ColorRole extends ComplexRole<RGBA> {\n readonly name = \"color\";\n readonly base = \"rgb_object\";\n\n protected createVariants(): Record<string, IVariant<unknown, RGBA>> {\n return {\n hex: new HexVariant(),\n rgb_object: new RgbObjectVariant(),\n rgb_string: new RgbStringVariant(),\n hsl_object: new HslObjectVariant(),\n hsl_string: new HslStringVariant(),\n };\n }\n\n /**\n * Override format to accept ColorFormatOptions\n */\n format(variant: string, value: unknown, options?: ColorFormatOptions): string {\n return super.format(variant, value, options);\n }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da ColorRole */\nexport const colorRole = new ColorRole();\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\n/**\n * Converte entre variantes de cor\n *\n * @example\n * convertColor('hex', 'rgb_object', '#ff0000') // { r: 255, g: 0, b: 0 }\n */\nexport function convertColor<TFrom = unknown, TTo = unknown>(\n from: string,\n to: string,\n value: TFrom,\n): TTo {\n return colorRole.convert<TFrom, TTo>(from, to, value);\n}\n\n/**\n * Formata uma cor para apresentação\n *\n * @example\n * formatColor('hex', '#ff0000', { uppercase: true }) // '#FF0000'\n */\nexport function formatColor(\n variant: string,\n value: unknown,\n options?: ColorFormatOptions,\n): string {\n return colorRole.format(variant, value, options);\n}\n\n/**\n * Valida um valor de cor\n *\n * @example\n * validateColor('hex', '#ff0000') // { valid: true, errors: [] }\n * validateColor('hex', 'invalid') // { valid: false, errors: [...] }\n */\nexport function validateColor(\n variant: string,\n value: unknown,\n): { valid: boolean; errors: string[] } {\n return colorRole.validate(variant, value);\n}\n\n/**\n * Faz cast de input para uma variante de cor\n *\n * @example\n * castColor('hex', 'red') // '#ff0000'\n * castColor('rgb_object', '#ff0000') // { r: 255, g: 0, b: 0 }\n * castColor('hsl_string', { r: 255, g: 0, b: 0 }) // 'hsl(0, 100%, 50%)'\n */\nexport function castColor<T = unknown>(\n variant: string,\n input: unknown,\n): T | null {\n return colorRole.cast<T>(variant, input);\n}\n\n/**\n * Versão safe de castColor que retorna Result\n */\nexport function tryCastColor<T = unknown>(\n variant: string,\n input: unknown,\n): { ok: true; value: T } | { ok: false; error: string } {\n return colorRole.tryCast<T>(variant, input);\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Converte hex para RGB object\n */\nexport function hexToRgb(\n hex: string,\n): { r: number; g: number; b: number; a?: number } | null {\n return colorRole.cast<{ r: number; g: number; b: number; a?: number }>(\n \"rgb_object\",\n hex,\n );\n}\n\n/**\n * Converte RGB object para hex\n */\nexport function rgbToHex(rgb: {\n r: number;\n g: number;\n b: number;\n a?: number;\n}): string | null {\n return colorRole.cast<string>(\"hex\", rgb);\n}\n\n/**\n * Converte hex para HSL object\n */\nexport function hexToHsl(\n hex: string,\n): { h: number; s: number; l: number; a?: number } | null {\n return colorRole.cast<{ h: number; s: number; l: number; a?: number }>(\n \"hsl_object\",\n hex,\n );\n}\n\n/**\n * Converte HSL object para hex\n */\nexport function hslToHex(hsl: {\n h: number;\n s: number;\n l: number;\n a?: number;\n}): string | null {\n return colorRole.cast<string>(\"hex\", hsl);\n}\n\n/**\n * Converte RGB string para hex\n */\nexport function rgbStringToHex(rgb: string): string | null {\n return colorRole.cast<string>(\"hex\", rgb);\n}\n\n/**\n * Converte hex para RGB string\n */\nexport function hexToRgbString(hex: string): string | null {\n return colorRole.cast<string>(\"rgb_string\", hex);\n}\n\n/**\n * Converte HSL string para hex\n */\nexport function hslStringToHex(hsl: string): string | null {\n return colorRole.cast<string>(\"hex\", hsl);\n}\n\n/**\n * Converte hex para HSL string\n */\nexport function hexToHslString(hex: string): string | null {\n return colorRole.cast<string>(\"hsl_string\", hex);\n}\n\n/**\n * Verifica se uma string é uma cor válida (qualquer formato)\n */\nexport function isValidColor(value: string): boolean {\n // Try each variant\n const variants = [\"hex\", \"rgb_string\", \"hsl_string\"];\n for (const variant of variants) {\n const result = colorRole.cast(variant, value);\n if (result !== null) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Detecta o formato de uma cor\n */\nexport function detectColorFormat(\n value: string,\n): \"hex\" | \"rgb_string\" | \"hsl_string\" | \"named\" | null {\n const trimmed = value.trim().toLowerCase();\n\n // Named color\n if (NAMED_COLORS[trimmed]) {\n return \"named\";\n }\n\n // Hex\n if (/^#?[0-9a-f]{3,8}$/i.test(trimmed)) {\n return \"hex\";\n }\n\n // RGB string\n if (/^rgba?\\s*\\(/.test(trimmed)) {\n return \"rgb_string\";\n }\n\n // HSL string\n if (/^hsla?\\s*\\(/.test(trimmed)) {\n return \"hsl_string\";\n }\n\n return null;\n}\n"]}