@attrx/role-morphic 0.1.0 → 0.2.1
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.
- package/README.md +151 -84
- package/dist/cast.d.mts +678 -0
- package/dist/cast.d.ts +678 -0
- package/dist/cast.js +3569 -0
- package/dist/cast.js.map +1 -0
- package/dist/cast.mjs +3536 -0
- package/dist/cast.mjs.map +1 -0
- package/dist/constants-BZdBwuvJ.d.mts +168 -0
- package/dist/constants-BZdBwuvJ.d.ts +168 -0
- package/dist/convert.d.mts +1157 -0
- package/dist/convert.d.ts +1157 -0
- package/dist/convert.js +2244 -0
- package/dist/convert.js.map +1 -0
- package/dist/convert.mjs +2148 -0
- package/dist/convert.mjs.map +1 -0
- package/dist/format-Be15LzfS.d.ts +668 -0
- package/dist/format-o4Y3jPH-.d.mts +668 -0
- package/dist/format.d.mts +3 -0
- package/dist/format.d.ts +3 -0
- package/dist/format.js +2303 -0
- package/dist/format.js.map +1 -0
- package/dist/format.mjs +2286 -0
- package/dist/format.mjs.map +1 -0
- package/dist/index.d.mts +200 -601
- package/dist/index.d.ts +200 -601
- package/dist/index.js +5536 -2493
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5349 -2494
- package/dist/index.mjs.map +1 -1
- package/dist/types-mbeS1e-k.d.mts +312 -0
- package/dist/types-mbeS1e-k.d.ts +312 -0
- package/dist/validate.d.mts +884 -0
- package/dist/validate.d.ts +884 -0
- package/dist/validate.js +713 -0
- package/dist/validate.js.map +1 -0
- package/dist/validate.mjs +669 -0
- package/dist/validate.mjs.map +1 -0
- package/package.json +21 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../src/RoleMorphic.ts","../src/roles/area/validate.ts","../src/roles/length/validate.ts","../src/roles/mass/validate.ts","../src/roles/temperature/constants.ts","../src/roles/temperature/validate.ts","../src/roles/volume/validate.ts","../src/roles/speed/validate.ts","../src/roles/energy/validate.ts","../src/roles/power/validate.ts","../src/roles/pressure/validate.ts","../src/roles/frequency/validate.ts","../src/roles/angle/validate.ts","../src/roles/time/validate.ts","../src/roles/digital/validate.ts","../src/roles/color/validate.ts","../src/roles/date/validate.ts","../src/roles/currency/validate.ts","../src/roles/area/constants.ts","../src/roles/area/convert.ts","../src/roles/length/constants.ts","../src/roles/length/convert.ts","../src/roles/mass/constants.ts","../src/roles/mass/convert.ts","../src/roles/temperature/convert.ts","../src/roles/volume/constants.ts","../src/roles/volume/convert.ts","../src/roles/speed/constants.ts","../src/roles/speed/convert.ts","../src/roles/energy/constants.ts","../src/roles/energy/convert.ts","../src/roles/power/constants.ts","../src/roles/power/convert.ts","../src/roles/pressure/constants.ts","../src/roles/pressure/convert.ts","../src/roles/frequency/constants.ts","../src/roles/frequency/convert.ts","../src/roles/angle/constants.ts","../src/roles/angle/convert.ts","../src/roles/time/constants.ts","../src/roles/time/convert.ts","../src/roles/digital/constants.ts","../src/roles/digital/convert.ts","../src/roles/color/types.ts","../src/roles/color/convert.ts","../src/roles/date/convert.ts","../src/roles/area/cast.ts","../src/roles/length/cast.ts","../src/roles/mass/cast.ts","../src/roles/temperature/cast.ts","../src/roles/volume/cast.ts","../src/roles/speed/cast.ts","../src/roles/energy/cast.ts","../src/roles/power/cast.ts","../src/roles/pressure/cast.ts","../src/roles/frequency/cast.ts","../src/roles/angle/cast.ts","../src/roles/time/cast.ts","../src/roles/digital/cast.ts","../src/roles/color/cast.ts","../src/roles/date/cast.ts","../src/roles/currency/cast.ts","../src/roles/area/format.ts","../src/roles/length/format.ts","../src/roles/mass/format.ts","../src/roles/temperature/format.ts","../src/roles/volume/format.ts","../src/roles/speed/format.ts","../src/roles/energy/format.ts","../src/roles/power/format.ts","../src/roles/pressure/format.ts","../src/roles/frequency/format.ts","../src/roles/angle/format.ts","../src/roles/time/format.ts","../src/roles/digital/format.ts","../src/roles/color/format.ts","../src/roles/date/format.ts","../src/roles/currency/constants.ts","../src/roles/currency/format.ts","../src/contracts/IVariant.ts","../src/contracts/SimpleRole.ts","../src/contracts/ComplexRole.ts","../src/roles/area/AreaRole.ts","../src/roles/length/LengthRole.ts","../src/roles/mass/MassRole.ts","../src/roles/temperature/TemperatureRole.ts","../src/roles/angle/AngleRole.ts","../src/roles/energy/EnergyRole.ts","../src/roles/power/PowerRole.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/VolumeRole.ts","../src/roles/time/TimeRole.ts","../src/roles/digital/DigitalRole.ts","../src/roles/frequency/FrequencyRole.ts","../src/roles/pressure/PressureRole.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","../src/roles/currency/CurrencyRole.ts"],"names":["p","q","parseNumber","detectUnit","numStr","value","formatWithIntl","ISO_DATE_ONLY_REGEX","ISO_DATE_TIME_REGEX"],"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 * Area Role - Validate Pillar\n *\n * Validação semântica de valores de área.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateArea, isValidArea } from '@attrx/role-morphic/area/validate';\n *\n * validateArea(100); // { valid: true, errors: [] }\n * validateArea(-5); // { valid: false, errors: ['Area cannot be negative'] }\n * isValidArea(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface AreaValidationConfig {\n min?: number;\n max?: number;\n integer?: boolean;\n minError?: string;\n maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para área\n */\nexport const AREA_VALIDATION_CONFIG: AreaValidationConfig = {\n min: 0,\n minError: \"Area cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de área\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateArea(100); // { valid: true, errors: [] }\n * validateArea(-5); // { valid: false, errors: ['Area cannot be negative'] }\n * validateArea(150, { max: 100 }) // { valid: false, errors: ['Value must be at most 100'] }\n */\nexport function validateArea(\n value: unknown,\n config: AreaValidationConfig = AREA_VALIDATION_CONFIG\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finite check\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Min check\n if (config.min !== undefined && value < config.min) {\n const msg = config.minError ?? `Value must be at least ${config.min}`;\n errors.push(msg);\n }\n\n // Max check\n if (config.max !== undefined && value > config.max) {\n const msg = config.maxError ?? `Value must be at most ${config.max}`;\n errors.push(msg);\n }\n\n // Integer check\n if (config.integer && !Number.isInteger(value)) {\n errors.push(\"Value must be an integer\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de área é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidArea(100); // true\n * isValidArea(-5); // false\n */\nexport function isValidArea(\n value: unknown,\n config: AreaValidationConfig = AREA_VALIDATION_CONFIG\n): boolean {\n return validateArea(value, config).valid;\n}\n","/**\n * Length Role - Validate Pillar\n *\n * Validação semântica de valores de comprimento.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateLength, isValidLength } from '@attrx/role-morphic/length/validate';\n *\n * validateLength(100); // { valid: true, errors: [] }\n * validateLength(-5); // { valid: false, errors: ['Length cannot be negative'] }\n * isValidLength(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface LengthValidationConfig {\n min?: number;\n max?: number;\n integer?: boolean;\n minError?: string;\n maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para comprimento\n * Length é magnitude escalar, portanto não-negativo por padrão\n */\nexport const LENGTH_VALIDATION_CONFIG: LengthValidationConfig = {\n min: 0,\n minError: \"Length cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de comprimento\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateLength(100); // { valid: true, errors: [] }\n * validateLength(-5); // { valid: false, errors: ['Length cannot be negative'] }\n * validateLength(-5, { min: undefined }); // { valid: true, errors: [] } - permite negativo\n */\nexport function validateLength(\n value: unknown,\n config: LengthValidationConfig = LENGTH_VALIDATION_CONFIG\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finite check\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Min check\n if (config.min !== undefined && value < config.min) {\n const msg = config.minError ?? `Value must be at least ${config.min}`;\n errors.push(msg);\n }\n\n // Max check\n if (config.max !== undefined && value > config.max) {\n const msg = config.maxError ?? `Value must be at most ${config.max}`;\n errors.push(msg);\n }\n\n // Integer check\n if (config.integer && !Number.isInteger(value)) {\n errors.push(\"Value must be an integer\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de comprimento é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidLength(100); // true\n * isValidLength(-5); // false\n */\nexport function isValidLength(\n value: unknown,\n config: LengthValidationConfig = LENGTH_VALIDATION_CONFIG\n): boolean {\n return validateLength(value, config).valid;\n}\n","/**\n * Mass Role - Validate Pillar\n *\n * Validação semântica de valores de massa.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateMass, isValidMass } from '@attrx/role-morphic/mass/validate';\n *\n * validateMass(100); // { valid: true, errors: [] }\n * validateMass(-5); // { valid: false, errors: ['Mass cannot be negative'] }\n * isValidMass(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface MassValidationConfig {\n min?: number;\n max?: number;\n integer?: boolean;\n minError?: string;\n maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para massa\n */\nexport const MASS_VALIDATION_CONFIG: MassValidationConfig = {\n min: 0,\n minError: \"Mass cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de massa\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateMass(100); // { valid: true, errors: [] }\n * validateMass(-5); // { valid: false, errors: ['Mass cannot be negative'] }\n * validateMass(150, { max: 100 }) // { valid: false, errors: ['Value must be at most 100'] }\n */\nexport function validateMass(\n value: unknown,\n config: MassValidationConfig = MASS_VALIDATION_CONFIG\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finite check\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Min check\n if (config.min !== undefined && value < config.min) {\n const msg = config.minError ?? `Value must be at least ${config.min}`;\n errors.push(msg);\n }\n\n // Max check\n if (config.max !== undefined && value > config.max) {\n const msg = config.maxError ?? `Value must be at most ${config.max}`;\n errors.push(msg);\n }\n\n // Integer check\n if (config.integer && !Number.isInteger(value)) {\n errors.push(\"Value must be an integer\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de massa é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidMass(100); // true\n * isValidMass(-5); // false\n */\nexport function isValidMass(\n value: unknown,\n config: MassValidationConfig = MASS_VALIDATION_CONFIG\n): boolean {\n return validateMass(value, config).valid;\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 // fahrenheit\n f: \"fahrenheit\",\n \"°f\": \"fahrenheit\",\n // kelvin\n k: \"kelvin\",\n // rankine\n r: \"rankine\",\n \"°r\": \"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 * Temperature Role - Validate Pillar\n *\n * Validação semântica de valores de temperatura.\n * Zero dependências externas - pode ser usado standalone.\n *\n * IMPORTANTE: Temperatura não pode ser abaixo do zero absoluto.\n * O zero absoluto varia por escala:\n * - Celsius: -273.15°C\n * - Fahrenheit: -459.67°F\n * - Kelvin: 0K\n * - Rankine: 0°R\n *\n * @example\n * import { validateTemperature, isValidTemperature } from '@attrx/role-morphic/temperature/validate';\n *\n * validateTemperature(100, 'celsius'); // { valid: true, errors: [] }\n * validateTemperature(-300, 'celsius'); // { valid: false, errors: ['...below absolute zero...'] }\n * validateTemperature(-10, 'kelvin'); // { valid: false, errors: ['...below absolute zero...'] }\n * isValidTemperature(100, 'celsius'); // true\n */\n\nimport { type TemperatureUnit, TEMPERATURE_CONSTANTS } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface TemperatureValidationConfig {\n /** Permite temperaturas abaixo do zero absoluto (default: false) */\n allowBelowAbsoluteZero?: boolean;\n /** Valor máximo permitido */\n max?: number;\n /** Mensagem de erro para max */\n maxError?: string;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/**\n * Zero absoluto em cada escala\n */\nexport const ABSOLUTE_ZERO: Record<TemperatureUnit, number> = {\n celsius: TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_CELSIUS,\n fahrenheit: TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_FAHRENHEIT,\n kelvin: 0,\n rankine: 0,\n};\n\n/**\n * Símbolos para mensagens de erro\n */\nconst UNIT_SYMBOLS: Record<TemperatureUnit, string> = {\n celsius: \"°C\",\n fahrenheit: \"°F\",\n kelvin: \"K\",\n rankine: \"°R\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de temperatura\n *\n * @param value - Valor a ser validado\n * @param unit - Unidade do valor (default: celsius)\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateTemperature(100, 'celsius'); // { valid: true, errors: [] }\n * validateTemperature(-300, 'celsius'); // { valid: false, errors: ['...below absolute zero...'] }\n * validateTemperature(-10, 'kelvin'); // { valid: false, errors: ['...below absolute zero...'] }\n * validateTemperature(0, 'kelvin'); // { valid: true, errors: [] } (0K = zero absoluto)\n * validateTemperature(-459.67, 'fahrenheit'); // { valid: true, errors: [] } (zero absoluto em °F)\n */\nexport function validateTemperature(\n value: unknown,\n unit: TemperatureUnit = \"celsius\",\n config: TemperatureValidationConfig = {}\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finite check\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Absolute zero check (unless explicitly allowed)\n if (!config.allowBelowAbsoluteZero) {\n const absoluteZero = ABSOLUTE_ZERO[unit];\n if (value < absoluteZero) {\n const symbol = UNIT_SYMBOLS[unit];\n errors.push(\n `Temperature cannot be below absolute zero (${absoluteZero}${symbol})`\n );\n }\n }\n\n // Max check\n if (config.max !== undefined && value > config.max) {\n const msg = config.maxError ?? `Value must be at most ${config.max}`;\n errors.push(msg);\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de temperatura é válido\n *\n * @param value - Valor a ser validado\n * @param unit - Unidade do valor (default: celsius)\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidTemperature(100, 'celsius'); // true\n * isValidTemperature(-300, 'celsius'); // false\n * isValidTemperature(-10, 'kelvin'); // false\n */\nexport function isValidTemperature(\n value: unknown,\n unit: TemperatureUnit = \"celsius\",\n config: TemperatureValidationConfig = {}\n): boolean {\n return validateTemperature(value, unit, config).valid;\n}\n\n/**\n * Retorna o zero absoluto na escala especificada\n *\n * @example\n * getAbsoluteZero('celsius'); // -273.15\n * getAbsoluteZero('fahrenheit'); // -459.67\n * getAbsoluteZero('kelvin'); // 0\n */\nexport function getAbsoluteZero(unit: TemperatureUnit): number {\n return ABSOLUTE_ZERO[unit];\n}\n","/**\n * Volume Role - Validate Pillar\n *\n * Validação semântica de valores de volume.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateVolume, isValidVolume } from '@attrx/role-morphic/volume/validate';\n *\n * validateVolume(100); // { valid: true, errors: [] }\n * validateVolume(-5); // { valid: false, errors: ['Volume cannot be negative'] }\n * isValidVolume(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface VolumeValidationConfig {\n min?: number;\n max?: number;\n integer?: boolean;\n minError?: string;\n maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para volume\n */\nexport const VOLUME_VALIDATION_CONFIG: VolumeValidationConfig = {\n min: 0,\n minError: \"Volume cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de volume\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateVolume(100); // { valid: true, errors: [] }\n * validateVolume(-5); // { valid: false, errors: ['Volume cannot be negative'] }\n * validateVolume(150, { max: 100 }) // { valid: false, errors: ['Value must be at most 100'] }\n */\nexport function validateVolume(\n value: unknown,\n config: VolumeValidationConfig = VOLUME_VALIDATION_CONFIG\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finite check\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Min check\n if (config.min !== undefined && value < config.min) {\n const msg = config.minError ?? `Value must be at least ${config.min}`;\n errors.push(msg);\n }\n\n // Max check\n if (config.max !== undefined && value > config.max) {\n const msg = config.maxError ?? `Value must be at most ${config.max}`;\n errors.push(msg);\n }\n\n // Integer check\n if (config.integer && !Number.isInteger(value)) {\n errors.push(\"Value must be an integer\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de volume é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidVolume(100); // true\n * isValidVolume(-5); // false\n */\nexport function isValidVolume(\n value: unknown,\n config: VolumeValidationConfig = VOLUME_VALIDATION_CONFIG\n): boolean {\n return validateVolume(value, config).valid;\n}\n","/**\n * Speed Role - Validate Pillar\n *\n * Validação semântica de valores de velocidade.\n * Zero dependências externas - pode ser usado standalone.\n *\n * Nota: Velocidade pode ser negativa (movimento em direção oposta).\n *\n * @example\n * import { validateSpeed, isValidSpeed } from '@attrx/role-morphic/speed/validate';\n *\n * validateSpeed(100); // { valid: true, errors: [] }\n * validateSpeed(-50); // { valid: true, errors: [] } (negativo é válido)\n * isValidSpeed(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface SpeedValidationConfig {\n min?: number;\n max?: number;\n integer?: boolean;\n minError?: string;\n maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para velocidade\n * Nota: sem min/max por padrão - velocidade pode ser qualquer valor finito\n */\nexport const SPEED_VALIDATION_CONFIG: SpeedValidationConfig = {};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de velocidade\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateSpeed(100); // { valid: true, errors: [] }\n * validateSpeed(-50); // { valid: true, errors: [] }\n * validateSpeed(150, { max: 120 }) // { valid: false, errors: ['Value must be at most 120'] }\n */\nexport function validateSpeed(\n value: unknown,\n config: SpeedValidationConfig = SPEED_VALIDATION_CONFIG\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finite check\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Min check\n if (config.min !== undefined && value < config.min) {\n const msg = config.minError ?? `Value must be at least ${config.min}`;\n errors.push(msg);\n }\n\n // Max check\n if (config.max !== undefined && value > config.max) {\n const msg = config.maxError ?? `Value must be at most ${config.max}`;\n errors.push(msg);\n }\n\n // Integer check\n if (config.integer && !Number.isInteger(value)) {\n errors.push(\"Value must be an integer\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de velocidade é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidSpeed(100); // true\n * isValidSpeed(-50); // true (negativo é válido)\n */\nexport function isValidSpeed(\n value: unknown,\n config: SpeedValidationConfig = SPEED_VALIDATION_CONFIG\n): boolean {\n return validateSpeed(value, config).valid;\n}\n","/**\n * Energy Role - Validate Pillar\n *\n * Validação semântica de valores de energia.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateEnergy, isValidEnergy } from '@attrx/role-morphic/energy/validate';\n *\n * validateEnergy(100); // { valid: true, errors: [] }\n * validateEnergy(-5); // { valid: false, errors: ['Energy cannot be negative'] }\n * isValidEnergy(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface EnergyValidationConfig {\n min?: number;\n max?: number;\n integer?: boolean;\n minError?: string;\n maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para energia\n */\nexport const ENERGY_VALIDATION_CONFIG: EnergyValidationConfig = {\n min: 0,\n minError: \"Energy cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de energia\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateEnergy(100); // { valid: true, errors: [] }\n * validateEnergy(-5); // { valid: false, errors: ['Energy cannot be negative'] }\n * validateEnergy(150, { max: 100 }) // { valid: false, errors: ['Value must be at most 100'] }\n */\nexport function validateEnergy(\n value: unknown,\n config: EnergyValidationConfig = ENERGY_VALIDATION_CONFIG\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finite check\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Min check\n if (config.min !== undefined && value < config.min) {\n const msg = config.minError ?? `Value must be at least ${config.min}`;\n errors.push(msg);\n }\n\n // Max check\n if (config.max !== undefined && value > config.max) {\n const msg = config.maxError ?? `Value must be at most ${config.max}`;\n errors.push(msg);\n }\n\n // Integer check\n if (config.integer && !Number.isInteger(value)) {\n errors.push(\"Value must be an integer\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de energia é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidEnergy(100); // true\n * isValidEnergy(-5); // false\n */\nexport function isValidEnergy(\n value: unknown,\n config: EnergyValidationConfig = ENERGY_VALIDATION_CONFIG\n): boolean {\n return validateEnergy(value, config).valid;\n}\n","/**\n * Power Role - Validate Pillar\n *\n * Validação de valores de potência.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validatePower, isValidPower } from '@attrx/role-morphic/power/validate';\n *\n * validatePower(100); // { valid: true, errors: [] }\n * validatePower(-5); // { valid: false, errors: ['Power cannot be negative'] }\n * isValidPower(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PowerValidationConfig {\n /** Valor mínimo permitido (default: 0) */\n min?: number;\n /** Valor máximo permitido */\n max?: number;\n /** Mensagem de erro para valor abaixo do mínimo */\n minError?: string;\n /** Mensagem de erro para valor acima do máximo */\n maxError?: string;\n /** Permitir valores negativos (default: false) */\n allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const POWER_VALIDATION_CONFIG: PowerValidationConfig = {\n min: 0,\n minError: \"Power cannot be negative\",\n allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de potência\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validatePower(100); // { valid: true, errors: [] }\n * validatePower(-5); // { valid: false, errors: ['Power cannot be negative'] }\n * validatePower(-5, { allowNegative: true }); // { valid: true, errors: [] }\n * validatePower(1000, { max: 500 }); // { valid: false, errors: ['Value must be at most 500'] }\n */\nexport function validatePower(\n value: unknown,\n config: PowerValidationConfig = POWER_VALIDATION_CONFIG,\n): ValidationResult {\n const errors: string[] = [];\n\n // Must be a number\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return {\n valid: false,\n errors: [\"Value must be a finite number\"],\n };\n }\n\n // Merge with defaults\n const effectiveConfig = { ...POWER_VALIDATION_CONFIG, ...config };\n\n // Check negative\n if (!effectiveConfig.allowNegative && value < 0) {\n errors.push(effectiveConfig.minError || \"Power cannot be negative\");\n }\n\n // Check min (if allowNegative is true and min is set)\n if (\n effectiveConfig.allowNegative &&\n effectiveConfig.min !== undefined &&\n value < effectiveConfig.min\n ) {\n errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n }\n\n // Check max\n if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Verifica se valor de potência é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidPower(100); // true\n * isValidPower(-5); // false\n */\nexport function isValidPower(\n value: unknown,\n config?: PowerValidationConfig,\n): boolean {\n return validatePower(value, config).valid;\n}\n","/**\n * Pressure Role - Validate Pillar\n *\n * Validação de valores de pressão.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validatePressure, isValidPressure } from '@attrx/role-morphic/pressure/validate';\n *\n * validatePressure(100); // { valid: true, errors: [] }\n * validatePressure(-5); // { valid: false, errors: ['Pressure cannot be negative'] }\n * isValidPressure(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PressureValidationConfig {\n /** Valor mínimo permitido (default: 0) */\n min?: number;\n /** Valor máximo permitido */\n max?: number;\n /** Mensagem de erro para valor abaixo do mínimo */\n minError?: string;\n /** Mensagem de erro para valor acima do máximo */\n maxError?: string;\n /** Permitir valores negativos (default: false) */\n allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const PRESSURE_VALIDATION_CONFIG: PressureValidationConfig = {\n min: 0,\n minError: \"Pressure cannot be negative\",\n allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de pressão\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validatePressure(100); // { valid: true, errors: [] }\n * validatePressure(-5); // { valid: false, errors: ['Pressure cannot be negative'] }\n * validatePressure(-5, { allowNegative: true }); // { valid: true, errors: [] }\n * validatePressure(1000, { max: 500 }); // { valid: false, errors: ['Value must be at most 500'] }\n */\nexport function validatePressure(\n value: unknown,\n config: PressureValidationConfig = PRESSURE_VALIDATION_CONFIG,\n): ValidationResult {\n const errors: string[] = [];\n\n // Must be a number\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return {\n valid: false,\n errors: [\"Value must be a finite number\"],\n };\n }\n\n // Merge with defaults\n const effectiveConfig = { ...PRESSURE_VALIDATION_CONFIG, ...config };\n\n // Check negative\n if (!effectiveConfig.allowNegative && value < 0) {\n errors.push(effectiveConfig.minError || \"Pressure cannot be negative\");\n }\n\n // Check min (if allowNegative is true and min is set)\n if (\n effectiveConfig.allowNegative &&\n effectiveConfig.min !== undefined &&\n value < effectiveConfig.min\n ) {\n errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n }\n\n // Check max\n if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Verifica se valor de pressão é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidPressure(100); // true\n * isValidPressure(-5); // false\n */\nexport function isValidPressure(\n value: unknown,\n config?: PressureValidationConfig,\n): boolean {\n return validatePressure(value, config).valid;\n}\n","/**\n * Frequency Role - Validate Pillar\n *\n * Validação de valores de frequência.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateFrequency, isValidFrequency } from '@attrx/role-morphic/frequency/validate';\n *\n * validateFrequency(100); // { valid: true, errors: [] }\n * validateFrequency(-5); // { valid: false, errors: ['Frequency cannot be negative'] }\n * isValidFrequency(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FrequencyValidationConfig {\n /** Valor mínimo permitido (default: 0) */\n min?: number;\n /** Valor máximo permitido */\n max?: number;\n /** Mensagem de erro para valor abaixo do mínimo */\n minError?: string;\n /** Mensagem de erro para valor acima do máximo */\n maxError?: string;\n /** Permitir valores negativos (default: false) */\n allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const FREQUENCY_VALIDATION_CONFIG: FrequencyValidationConfig = {\n min: 0,\n minError: \"Frequency cannot be negative\",\n allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de frequência\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validateFrequency(100); // { valid: true, errors: [] }\n * validateFrequency(-5); // { valid: false, errors: ['Frequency cannot be negative'] }\n * validateFrequency(-5, { allowNegative: true }); // { valid: true, errors: [] }\n * validateFrequency(1000, { max: 500 }); // { valid: false, errors: ['Value must be at most 500'] }\n */\nexport function validateFrequency(\n value: unknown,\n config: FrequencyValidationConfig = FREQUENCY_VALIDATION_CONFIG,\n): ValidationResult {\n const errors: string[] = [];\n\n // Must be a number\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return {\n valid: false,\n errors: [\"Value must be a finite number\"],\n };\n }\n\n // Merge with defaults\n const effectiveConfig = { ...FREQUENCY_VALIDATION_CONFIG, ...config };\n\n // Check negative\n if (!effectiveConfig.allowNegative && value < 0) {\n errors.push(effectiveConfig.minError || \"Frequency cannot be negative\");\n }\n\n // Check min (if allowNegative is true and min is set)\n if (\n effectiveConfig.allowNegative &&\n effectiveConfig.min !== undefined &&\n value < effectiveConfig.min\n ) {\n errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n }\n\n // Check max\n if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Verifica se valor de frequência é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidFrequency(100); // true\n * isValidFrequency(-5); // false\n */\nexport function isValidFrequency(\n value: unknown,\n config?: FrequencyValidationConfig,\n): boolean {\n return validateFrequency(value, config).valid;\n}\n","/**\n * Angle Role - Validate Pillar\n *\n * Validação de valores de ângulo.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * Nota: Ângulos podem ser negativos (rotação anti-horária) e maiores que 360° (múltiplas voltas).\n *\n * @example\n * import { validateAngle, isValidAngle } from '@attrx/role-morphic/angle/validate';\n *\n * validateAngle(90); // { valid: true, errors: [] }\n * validateAngle(-45); // { valid: true, errors: [] }\n * validateAngle(720); // { valid: true, errors: [] }\n * isValidAngle(90); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AngleValidationConfig {\n /** Valor mínimo permitido */\n min?: number;\n /** Valor máximo permitido */\n max?: number;\n /** Mensagem de erro para valor abaixo do mínimo */\n minError?: string;\n /** Mensagem de erro para valor acima do máximo */\n maxError?: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\n/** Ângulos não têm restrições por padrão - podem ser negativos e > 360° */\nexport const ANGLE_VALIDATION_CONFIG: AngleValidationConfig = {};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de ângulo\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validateAngle(90); // { valid: true, errors: [] }\n * validateAngle(-45); // { valid: true, errors: [] }\n * validateAngle(90, { max: 180 }); // { valid: true, errors: [] }\n * validateAngle(270, { max: 180 }); // { valid: false, errors: ['...'] }\n */\nexport function validateAngle(\n value: unknown,\n config: AngleValidationConfig = ANGLE_VALIDATION_CONFIG,\n): ValidationResult {\n const errors: string[] = [];\n\n // Must be a number\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return {\n valid: false,\n errors: [\"Value must be a finite number\"],\n };\n }\n\n // Check min\n if (config.min !== undefined && value < config.min) {\n errors.push(config.minError || `Value must be at least ${config.min}`);\n }\n\n // Check max\n if (config.max !== undefined && value > config.max) {\n errors.push(config.maxError || `Value must be at most ${config.max}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Verifica se valor de ângulo é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidAngle(90); // true\n * isValidAngle(-45); // true\n * isValidAngle(NaN); // false\n */\nexport function isValidAngle(\n value: unknown,\n config?: AngleValidationConfig,\n): boolean {\n return validateAngle(value, config).valid;\n}\n","/**\n * Time Role - Validate Pillar\n *\n * Validação de valores de tempo/duração.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateTime, isValidTime } from '@attrx/role-morphic/time/validate';\n *\n * validateTime(100); // { valid: true, errors: [] }\n * validateTime(-5); // { valid: false, errors: ['Time cannot be negative'] }\n * isValidTime(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TimeValidationConfig {\n /** Valor mínimo permitido (default: 0) */\n min?: number;\n /** Valor máximo permitido */\n max?: number;\n /** Mensagem de erro para valor abaixo do mínimo */\n minError?: string;\n /** Mensagem de erro para valor acima do máximo */\n maxError?: string;\n /** Permitir valores negativos (default: false) */\n allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const TIME_VALIDATION_CONFIG: TimeValidationConfig = {\n min: 0,\n minError: \"Time cannot be negative\",\n allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de tempo\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validateTime(100); // { valid: true, errors: [] }\n * validateTime(-5); // { valid: false, errors: ['Time cannot be negative'] }\n * validateTime(-5, { allowNegative: true }); // { valid: true, errors: [] }\n */\nexport function validateTime(\n value: unknown,\n config: TimeValidationConfig = TIME_VALIDATION_CONFIG,\n): ValidationResult {\n const errors: string[] = [];\n\n // Must be a number\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return {\n valid: false,\n errors: [\"Value must be a finite number\"],\n };\n }\n\n // Merge with defaults\n const effectiveConfig = { ...TIME_VALIDATION_CONFIG, ...config };\n\n // Check negative\n if (!effectiveConfig.allowNegative && value < 0) {\n errors.push(effectiveConfig.minError || \"Time cannot be negative\");\n }\n\n // Check min (if allowNegative is true and min is set)\n if (\n effectiveConfig.allowNegative &&\n effectiveConfig.min !== undefined &&\n value < effectiveConfig.min\n ) {\n errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n }\n\n // Check max\n if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Verifica se valor de tempo é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidTime(100); // true\n * isValidTime(-5); // false\n */\nexport function isValidTime(\n value: unknown,\n config?: TimeValidationConfig,\n): boolean {\n return validateTime(value, config).valid;\n}\n","/**\n * Digital Role - Validate Pillar\n *\n * Validação de valores de armazenamento digital.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateDigital, isValidDigital } from '@attrx/role-morphic/digital/validate';\n *\n * validateDigital(100); // { valid: true, errors: [] }\n * validateDigital(-5); // { valid: false, errors: ['Digital storage cannot be negative'] }\n * isValidDigital(100); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DigitalValidationConfig {\n /** Valor mínimo permitido (default: 0) */\n min?: number;\n /** Valor máximo permitido */\n max?: number;\n /** Mensagem de erro para valor abaixo do mínimo */\n minError?: string;\n /** Mensagem de erro para valor acima do máximo */\n maxError?: string;\n /** Permitir valores negativos (default: false) */\n allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const DIGITAL_VALIDATION_CONFIG: DigitalValidationConfig = {\n min: 0,\n minError: \"Digital storage cannot be negative\",\n allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de armazenamento digital\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validateDigital(100); // { valid: true, errors: [] }\n * validateDigital(-5); // { valid: false, errors: ['Digital storage cannot be negative'] }\n * validateDigital(-5, { allowNegative: true }); // { valid: true, errors: [] }\n */\nexport function validateDigital(\n value: unknown,\n config: DigitalValidationConfig = DIGITAL_VALIDATION_CONFIG,\n): ValidationResult {\n const errors: string[] = [];\n\n // Must be a number\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return {\n valid: false,\n errors: [\"Value must be a finite number\"],\n };\n }\n\n // Merge with defaults\n const effectiveConfig = { ...DIGITAL_VALIDATION_CONFIG, ...config };\n\n // Check negative\n if (!effectiveConfig.allowNegative && value < 0) {\n errors.push(effectiveConfig.minError || \"Digital storage cannot be negative\");\n }\n\n // Check min (if allowNegative is true and min is set)\n if (\n effectiveConfig.allowNegative &&\n effectiveConfig.min !== undefined &&\n value < effectiveConfig.min\n ) {\n errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n }\n\n // Check max\n if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Verifica se valor de armazenamento digital é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidDigital(100); // true\n * isValidDigital(-5); // false\n */\nexport function isValidDigital(\n value: unknown,\n config?: DigitalValidationConfig,\n): boolean {\n return validateDigital(value, config).valid;\n}\n","/**\n * Color Role - Validate Pillar\n *\n * Validação de valores de cor.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateColor, isValidColor } from '@attrx/role-morphic/color/validate';\n *\n * validateColor('hex', '#ff0000'); // { valid: true, errors: [] }\n * validateColor('rgb_object', { r: 255, g: 0, b: 0 }); // { valid: true, errors: [] }\n * validateColor('hex', 'invalid'); // { valid: false, errors: [...] }\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type ValidationResult = { valid: boolean; errors: string[] };\n\n// =============================================================================\n// REGEX PATTERNS\n// =============================================================================\n\nconst HEX_3_REGEX = /^#?[0-9a-f]{3}$/i;\nconst HEX_4_REGEX = /^#?[0-9a-f]{4}$/i;\nconst HEX_6_REGEX = /^#?[0-9a-f]{6}$/i;\nconst HEX_8_REGEX = /^#?[0-9a-f]{8}$/i;\nconst RGB_STRING_REGEX = /^rgba?\\s*\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(,\\s*[\\d.]+\\s*)?\\)$/i;\nconst HSL_STRING_REGEX = /^hsla?\\s*\\(\\s*[\\d.]+\\s*,\\s*[\\d.]+%?\\s*,\\s*[\\d.]+%?\\s*(,\\s*[\\d.]+\\s*)?\\)$/i;\n\n// =============================================================================\n// VALIDATE BY VARIANT\n// =============================================================================\n\n/**\n * Valida valor hex\n */\nexport function validateHex(value: unknown): 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 trimmed = value.trim();\n\n if (\n !HEX_3_REGEX.test(trimmed) &&\n !HEX_4_REGEX.test(trimmed) &&\n !HEX_6_REGEX.test(trimmed) &&\n !HEX_8_REGEX.test(trimmed)\n ) {\n errors.push(\"Invalid hex color format\");\n return { valid: false, errors };\n }\n\n return { valid: true, errors: [] };\n}\n\n/**\n * Valida valor RGB object\n */\nexport function validateRgbObject(value: unknown): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"object\" || value === null) {\n errors.push(\"RGB object must be an object\");\n return { valid: false, errors };\n }\n\n const obj = value as Record<string, unknown>;\n\n // Verifica propriedades obrigatórias\n if (typeof obj.r !== \"number\") {\n errors.push(\"RGB object must have numeric 'r' property\");\n }\n if (typeof obj.g !== \"number\") {\n errors.push(\"RGB object must have numeric 'g' property\");\n }\n if (typeof obj.b !== \"number\") {\n errors.push(\"RGB object must have numeric 'b' property\");\n }\n\n if (errors.length > 0) {\n return { valid: false, errors };\n }\n\n const { r, g, b, a } = obj as unknown as ColorRgbObject;\n\n // Valida ranges\n if (r < 0 || r > 255) {\n errors.push(\"RGB 'r' must be between 0 and 255\");\n }\n if (g < 0 || g > 255) {\n errors.push(\"RGB 'g' must be between 0 and 255\");\n }\n if (b < 0 || b > 255) {\n errors.push(\"RGB 'b' must be between 0 and 255\");\n }\n if (a !== undefined && (typeof a !== \"number\" || a < 0 || a > 1)) {\n errors.push(\"RGB 'a' must be a number between 0 and 1\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Valida valor RGB string\n */\nexport function validateRgbString(value: unknown): 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 trimmed = value.trim();\n\n if (!RGB_STRING_REGEX.test(trimmed)) {\n errors.push(\"Invalid RGB string format\");\n return { valid: false, errors };\n }\n\n return { valid: true, errors: [] };\n}\n\n/**\n * Valida valor HSL object\n */\nexport function validateHslObject(value: unknown): ValidationResult {\n const errors: string[] = [];\n\n if (typeof value !== \"object\" || value === null) {\n errors.push(\"HSL object must be an object\");\n return { valid: false, errors };\n }\n\n const obj = value as Record<string, unknown>;\n\n // Verifica propriedades obrigatórias\n if (typeof obj.h !== \"number\") {\n errors.push(\"HSL object must have numeric 'h' property\");\n }\n if (typeof obj.s !== \"number\") {\n errors.push(\"HSL object must have numeric 's' property\");\n }\n if (typeof obj.l !== \"number\") {\n errors.push(\"HSL object must have numeric 'l' property\");\n }\n\n if (errors.length > 0) {\n return { valid: false, errors };\n }\n\n const { h, s, l, a } = obj as unknown as ColorHslObject;\n\n // Valida ranges\n if (h < 0 || h > 360) {\n errors.push(\"HSL 'h' must be between 0 and 360\");\n }\n if (s < 0 || s > 100) {\n errors.push(\"HSL 's' must be between 0 and 100\");\n }\n if (l < 0 || l > 100) {\n errors.push(\"HSL 'l' must be between 0 and 100\");\n }\n if (a !== undefined && (typeof a !== \"number\" || a < 0 || a > 1)) {\n errors.push(\"HSL 'a' must be a number between 0 and 1\");\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Valida valor HSL string\n */\nexport function validateHslString(value: unknown): 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 trimmed = value.trim();\n\n if (!HSL_STRING_REGEX.test(trimmed)) {\n errors.push(\"Invalid HSL string format\");\n return { valid: false, errors };\n }\n\n return { valid: true, errors: [] };\n}\n\n// =============================================================================\n// MAIN VALIDATE\n// =============================================================================\n\n/**\n * Valida valor de cor para uma variante específica\n *\n * @param variant - Variante a validar\n * @param value - Valor a validar\n * @returns Resultado da validação\n *\n * @example\n * validateColor('hex', '#ff0000');\n * // { valid: true, errors: [] }\n *\n * validateColor('hex', 'invalid');\n * // { valid: false, errors: ['Invalid hex color format'] }\n */\nexport function validateColor(variant: ColorVariant, value: unknown): ValidationResult {\n switch (variant) {\n case \"hex\":\n return validateHex(value);\n case \"rgb_object\":\n return validateRgbObject(value);\n case \"rgb_string\":\n return validateRgbString(value);\n case \"hsl_object\":\n return validateHslObject(value);\n case \"hsl_string\":\n return validateHslString(value);\n default:\n return { valid: false, errors: [`Unknown color variant: ${variant}`] };\n }\n}\n\n/**\n * Verifica se valor é válido para uma variante específica (retorna boolean)\n *\n * @example\n * isValidColorVariant('hex', '#ff0000'); // true\n * isValidColorVariant('hex', 'invalid'); // false\n */\nexport function isValidColorVariant(variant: ColorVariant, value: unknown): boolean {\n return validateColor(variant, value).valid;\n}\n\n/**\n * Verifica se variante existe\n */\nexport function hasColorVariant(variant: string): variant is ColorVariant {\n return (\n variant === \"hex\" ||\n variant === \"rgb_object\" ||\n variant === \"rgb_string\" ||\n variant === \"hsl_object\" ||\n variant === \"hsl_string\"\n );\n}\n\n/**\n * Lista de variantes disponíveis\n */\nexport const COLOR_VARIANTS: ColorVariant[] = [\n \"hex\",\n \"rgb_object\",\n \"rgb_string\",\n \"hsl_object\",\n \"hsl_string\",\n];\n","/**\n * Date Role - Validate Pillar\n *\n * Validação de valores de data.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateDate, isValidDate } from '@attrx/role-morphic/date/validate';\n *\n * validateDate('iso', '2024-12-05T19:30:00.000Z'); // { valid: true, errors: [] }\n * validateDate('timestamp', 1733425800000); // { valid: true, errors: [] }\n * validateDate('epoch', 1733425800); // { valid: true, errors: [] }\n */\n\nimport type { DateVariant } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type ValidationResult = { valid: boolean; errors: string[] };\n\n// =============================================================================\n// REGEX PATTERNS\n// =============================================================================\n\nconst ISO_DATE_TIME_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\nconst ISO_DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n// =============================================================================\n// VALIDATE BY VARIANT\n// =============================================================================\n\n/**\n * Valida valor ISO 8601\n */\nexport function validateIso(value: unknown): 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 (!ISO_DATE_TIME_REGEX.test(trimmed) && !ISO_DATE_ONLY_REGEX.test(trimmed)) {\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 * Valida valor timestamp (milissegundos)\n */\nexport function validateTimestamp(value: unknown): 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 * Valida valor epoch (segundos)\n */\nexport function validateEpoch(value: unknown): 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// MAIN VALIDATE\n// =============================================================================\n\n/**\n * Valida valor de data para uma variante específica\n *\n * @param variant - Variante a validar (\"iso\", \"timestamp\", \"epoch\")\n * @param value - Valor a validar\n * @returns Resultado da validação\n *\n * @example\n * validateDate('iso', '2024-12-05T19:30:00.000Z');\n * // { valid: true, errors: [] }\n *\n * validateDate('iso', 'invalid');\n * // { valid: false, errors: ['Invalid ISO 8601 format'] }\n */\nexport function validateDate(variant: DateVariant, value: unknown): ValidationResult {\n switch (variant) {\n case \"iso\":\n return validateIso(value);\n case \"timestamp\":\n return validateTimestamp(value);\n case \"epoch\":\n return validateEpoch(value);\n default:\n return { valid: false, errors: [`Unknown date variant: ${variant}`] };\n }\n}\n\n/**\n * Verifica se valor é válido (retorna boolean)\n *\n * @example\n * isValidDate('iso', '2024-12-05T19:30:00.000Z'); // true\n * isValidDate('iso', 'invalid'); // false\n */\nexport function isValidDate(variant: DateVariant, value: unknown): boolean {\n return validateDate(variant, value).valid;\n}\n\n/**\n * Verifica se variante existe\n */\nexport function hasDateVariant(variant: string): variant is DateVariant {\n return variant === \"iso\" || variant === \"timestamp\" || variant === \"epoch\";\n}\n","/**\n * Currency Role - Validate Pillar\n *\n * Validação semântica de valores monetários.\n * Zero dependências externas - pode ser usado standalone.\n *\n * Currency valida o VALOR NUMÉRICO, não o tipo de moeda.\n * O código da moeda é metadata, usado apenas para formatação.\n *\n * @example\n * import { validateCurrency, isValidCurrency } from '@attrx/role-morphic/currency/validate';\n *\n * validateCurrency(100.50); // { valid: true, errors: [] }\n * validateCurrency(-50); // { valid: false, errors: ['Currency value cannot be negative'] }\n * validateCurrency(100.999, { decimals: 2 }); // { valid: false, errors: ['...too many decimal places'] }\n * isValidCurrency(100.50); // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface CurrencyValidationConfig {\n /** Valor mínimo permitido (default: 0) */\n min?: number;\n /** Valor máximo permitido */\n max?: number;\n /** Máximo de casas decimais (default: sem limite) */\n decimals?: number;\n /** Permite valores negativos? (default: false) */\n allowNegative?: boolean;\n /** Mensagem de erro para min */\n minError?: string;\n /** Mensagem de erro para max */\n maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para currency\n */\nexport const CURRENCY_VALIDATION_CONFIG: CurrencyValidationConfig = {\n min: 0,\n allowNegative: false,\n minError: \"Currency value cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor monetário\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateCurrency(100.50); // { valid: true, errors: [] }\n * validateCurrency(-50); // { valid: false, errors: ['Currency value cannot be negative'] }\n * validateCurrency(100.999, { decimals: 2 }); // { valid: false, errors: ['Value has too many decimal places (max: 2)'] }\n * validateCurrency(1000000, { max: 10000 }); // { valid: false, errors: ['Value must be at most 10000'] }\n * validateCurrency(-50, { allowNegative: true }); // { valid: true, errors: [] }\n */\nexport function validateCurrency(\n value: unknown,\n config: CurrencyValidationConfig = CURRENCY_VALIDATION_CONFIG\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof value !== \"number\") {\n return { valid: false, errors: [\"Value must be a number\"] };\n }\n\n // Finite check\n if (!Number.isFinite(value)) {\n return { valid: false, errors: [\"Value must be finite\"] };\n }\n\n // Negative check (se não permitido)\n if (!config.allowNegative && value < 0) {\n const msg = config.minError ?? \"Currency value cannot be negative\";\n errors.push(msg);\n }\n\n // Min check (se allowNegative, pode ter min customizado)\n if (config.allowNegative && config.min !== undefined && value < config.min) {\n const msg = config.minError ?? `Value must be at least ${config.min}`;\n errors.push(msg);\n }\n\n // Max check\n if (config.max !== undefined && value > config.max) {\n const msg = config.maxError ?? `Value must be at most ${config.max}`;\n errors.push(msg);\n }\n\n // Decimals check\n if (config.decimals !== undefined) {\n const decimalPlaces = countDecimalPlaces(value);\n if (decimalPlaces > config.decimals) {\n errors.push(\n `Value has too many decimal places (max: ${config.decimals})`\n );\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor monetário é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidCurrency(100.50); // true\n * isValidCurrency(-50); // false\n */\nexport function isValidCurrency(\n value: unknown,\n config: CurrencyValidationConfig = CURRENCY_VALIDATION_CONFIG\n): boolean {\n return validateCurrency(value, config).valid;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Conta casas decimais de um número\n */\nfunction countDecimalPlaces(value: number): number {\n if (Number.isInteger(value)) {\n return 0;\n }\n\n const str = String(value);\n const decimalIndex = str.indexOf(\".\");\n\n if (decimalIndex === -1) {\n return 0;\n }\n\n return str.length - decimalIndex - 1;\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 // hectare\n ha: \"hectare\",\n // are\n a: \"are\",\n // square_meter\n \"m²\": \"square_meter\",\n m2: \"square_meter\",\n // square_decimeter\n \"dm²\": \"square_decimeter\",\n dm2: \"square_decimeter\",\n // square_centimeter\n \"cm²\": \"square_centimeter\",\n cm2: \"square_centimeter\",\n // square_millimeter\n \"mm²\": \"square_millimeter\",\n mm2: \"square_millimeter\",\n // square_mile\n \"mi²\": \"square_mile\",\n mi2: \"square_mile\",\n // acre\n ac: \"acre\",\n // square_yard\n \"yd²\": \"square_yard\",\n yd2: \"square_yard\",\n // square_foot\n \"ft²\": \"square_foot\",\n ft2: \"square_foot\",\n // square_inch\n \"in²\": \"square_inch\",\n in2: \"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 * Area Role - Convert Pillar\n *\n * Conversão entre unidades de área usando arquitetura hub-and-spoke.\n * Base: square_meter (m²)\n *\n * @example\n * import { convertArea, toBaseArea, fromBaseArea } from '@attrx/role-morphic/area/convert';\n *\n * convertArea('hectare', 'acre', 1); // 2.47105...\n * toBaseArea('hectare', 1); // 10000\n * fromBaseArea('acre', 10000); // 2.47105...\n */\n\nimport { AREA_UNITS, type AreaUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const AREA_BASE: AreaUnit = \"square_meter\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (square_meter)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em square_meter\n *\n * @example\n * toBaseArea('hectare', 1); // 10000\n * toBaseArea('acre', 1); // 4046.8564224\n */\nexport function toBaseArea(variant: AreaUnit, value: number): number {\n const unit = AREA_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown area variant: ${variant}`);\n }\n\n return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (square_meter) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em square_meter\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseArea('hectare', 10000); // 1\n * fromBaseArea('acre', 4046.86); // ~1\n */\nexport function fromBaseArea(variant: AreaUnit, baseValue: number): number {\n const unit = AREA_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown area variant: ${variant}`);\n }\n\n return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de área\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertArea('hectare', 'acre', 1); // 2.47105...\n * convertArea('square_meter', 'hectare', 10000); // 1\n */\nexport function convertArea(\n from: AreaUnit,\n to: AreaUnit,\n value: number\n): number {\n // Otimização: mesma unidade\n if (from === to) {\n return value;\n }\n\n // Hub-and-spoke: from → base → to\n const baseValue = toBaseArea(from, value);\n return fromBaseArea(to, baseValue);\n}\n\n/**\n * Versão safe de convertArea que retorna Result\n *\n * @example\n * tryConvertArea('hectare', 'acre', 1);\n * // { ok: true, value: 2.47105... }\n *\n * tryConvertArea('invalid', 'acre', 1);\n * // { ok: false, error: 'Unknown area variant: invalid' }\n */\nexport function tryConvertArea(\n from: AreaUnit,\n to: AreaUnit,\n value: number\n): Result<number> {\n try {\n const result = convertArea(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasAreaVariant(variant: string): variant is AreaUnit {\n return variant in AREA_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getAreaVariants(): AreaUnit[] {\n return Object.keys(AREA_UNITS) as AreaUnit[];\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 // hectometer\n hm: \"hectometer\",\n // decameter\n dam: \"decameter\",\n // meter\n m: \"meter\",\n // decimeter\n dm: \"decimeter\",\n // centimeter\n cm: \"centimeter\",\n // millimeter\n mm: \"millimeter\",\n // micrometer\n \"μm\": \"micrometer\",\n um: \"micrometer\",\n // nanometer\n nm: \"nanometer\",\n // inch\n in: \"inch\",\n '\"': \"inch\",\n // foot\n ft: \"foot\",\n \"'\": \"foot\",\n // yard\n yd: \"yard\",\n // mile\n mi: \"mile\",\n // nautical_mile\n nmi: \"nautical_mile\",\n // fathom\n ftm: \"fathom\",\n // furlong\n fur: \"furlong\",\n // league\n lea: \"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 * Length Role - Convert Pillar\n *\n * Conversão entre unidades de comprimento usando arquitetura hub-and-spoke.\n * Base: meter (m)\n *\n * @example\n * import { convertLength, toBaseLength, fromBaseLength } from '@attrx/role-morphic/length/convert';\n *\n * convertLength('kilometer', 'mile', 1); // 0.621371...\n * toBaseLength('kilometer', 1); // 1000\n * fromBaseLength('mile', 1000); // 0.621371...\n */\n\nimport { LENGTH_UNITS, type LengthUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const LENGTH_BASE: LengthUnit = \"meter\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (meter)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em meters\n *\n * @example\n * toBaseLength('kilometer', 1); // 1000\n * toBaseLength('mile', 1); // 1609.344\n */\nexport function toBaseLength(variant: LengthUnit, value: number): number {\n const unit = LENGTH_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown length variant: ${variant}`);\n }\n\n return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (meter) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em meters\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseLength('kilometer', 1000); // 1\n * fromBaseLength('mile', 1609.344); // 1\n */\nexport function fromBaseLength(variant: LengthUnit, baseValue: number): number {\n const unit = LENGTH_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown length variant: ${variant}`);\n }\n\n return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de comprimento\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertLength('kilometer', 'mile', 1); // 0.621371...\n * convertLength('foot', 'meter', 1); // 0.3048\n */\nexport function convertLength(\n from: LengthUnit,\n to: LengthUnit,\n value: number\n): number {\n // Otimização: mesma unidade\n if (from === to) {\n return value;\n }\n\n // Hub-and-spoke: from → base → to\n const baseValue = toBaseLength(from, value);\n return fromBaseLength(to, baseValue);\n}\n\n/**\n * Versão safe de convertLength que retorna Result\n *\n * @example\n * tryConvertLength('kilometer', 'mile', 1);\n * // { ok: true, value: 0.621371... }\n *\n * tryConvertLength('invalid', 'mile', 1);\n * // { ok: false, error: 'Unknown length variant: invalid' }\n */\nexport function tryConvertLength(\n from: LengthUnit,\n to: LengthUnit,\n value: number\n): Result<number> {\n try {\n const result = convertLength(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasLengthVariant(variant: string): variant is LengthUnit {\n return variant in LENGTH_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getLengthVariants(): LengthUnit[] {\n return Object.keys(LENGTH_UNITS) as LengthUnit[];\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 // kilogram\n kg: \"kilogram\",\n // hectogram\n hg: \"hectogram\",\n // decagram\n dag: \"decagram\",\n // gram\n g: \"gram\",\n // decigram\n dg: \"decigram\",\n // centigram\n cg: \"centigram\",\n // milligram\n mg: \"milligram\",\n // microgram\n \"μg\": \"microgram\",\n ug: \"microgram\",\n mcg: \"microgram\",\n // long_ton\n \"long tn\": \"long_ton\",\n // short_ton\n \"sh tn\": \"short_ton\",\n // stone\n st: \"stone\",\n // pound\n lb: \"pound\",\n lbs: \"pound\",\n \"#\": \"pound\",\n // ounce\n oz: \"ounce\",\n // dram\n dr: \"dram\",\n // grain\n gr: \"grain\",\n // troy_pound\n \"lb t\": \"troy_pound\",\n // troy_ounce\n \"oz t\": \"troy_ounce\",\n ozt: \"troy_ounce\",\n // pennyweight\n dwt: \"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 * Mass Role - Convert Pillar\n *\n * Conversão entre unidades de massa usando arquitetura hub-and-spoke.\n * Base: kilogram (kg)\n *\n * @example\n * import { convertMass, toBaseMass, fromBaseMass } from '@attrx/role-morphic/mass/convert';\n *\n * convertMass('kilogram', 'pound', 1); // 2.20462...\n * toBaseMass('pound', 1); // 0.45359237\n * fromBaseMass('pound', 0.45359237); // 1\n */\n\nimport { MASS_UNITS, type MassUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const MASS_BASE: MassUnit = \"kilogram\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (kilogram)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em kilogram\n *\n * @example\n * toBaseMass('pound', 1); // 0.45359237\n * toBaseMass('gram', 1000); // 1\n */\nexport function toBaseMass(variant: MassUnit, value: number): number {\n const unit = MASS_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown mass variant: ${variant}`);\n }\n\n return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (kilogram) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em kilogram\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseMass('pound', 1); // 2.20462...\n * fromBaseMass('gram', 1); // 1000\n */\nexport function fromBaseMass(variant: MassUnit, baseValue: number): number {\n const unit = MASS_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown mass variant: ${variant}`);\n }\n\n return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de massa\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertMass('kilogram', 'pound', 1); // 2.20462...\n * convertMass('pound', 'kilogram', 2.2); // ~1\n * convertMass('gram', 'milligram', 1); // 1000\n */\nexport function convertMass(\n from: MassUnit,\n to: MassUnit,\n value: number\n): number {\n // Otimização: mesma unidade\n if (from === to) {\n return value;\n }\n\n // Hub-and-spoke: from → base → to\n const baseValue = toBaseMass(from, value);\n return fromBaseMass(to, baseValue);\n}\n\n/**\n * Versão safe de convertMass que retorna Result\n *\n * @example\n * tryConvertMass('kilogram', 'pound', 1);\n * // { ok: true, value: 2.20462... }\n *\n * tryConvertMass('invalid', 'pound', 1);\n * // { ok: false, error: 'Unknown mass variant: invalid' }\n */\nexport function tryConvertMass(\n from: MassUnit,\n to: MassUnit,\n value: number\n): Result<number> {\n try {\n const result = convertMass(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasMassVariant(variant: string): variant is MassUnit {\n return variant in MASS_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getMassVariants(): MassUnit[] {\n return Object.keys(MASS_UNITS) as MassUnit[];\n}\n","/**\n * Temperature Role - Convert Pillar\n *\n * Conversão entre unidades de temperatura usando arquitetura hub-and-spoke.\n * Base: celsius (°C)\n *\n * IMPORTANTE: Diferente de outras roles, temperatura usa FÓRMULAS\n * ao invés de fatores multiplicativos (escalas têm offsets diferentes).\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 * @example\n * import { convertTemperature, toBaseTemperature, fromBaseTemperature } from '@attrx/role-morphic/temperature/convert';\n *\n * convertTemperature('celsius', 'fahrenheit', 0); // 32\n * convertTemperature('celsius', 'kelvin', 0); // 273.15\n * toBaseTemperature('fahrenheit', 32); // 0\n * fromBaseTemperature('kelvin', 0); // 273.15\n */\n\nimport { TEMPERATURE_UNITS, type TemperatureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const TEMPERATURE_BASE: TemperatureUnit = \"celsius\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (celsius)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em celsius\n *\n * @example\n * toBaseTemperature('fahrenheit', 32); // 0\n * toBaseTemperature('kelvin', 273.15); // 0\n * toBaseTemperature('rankine', 491.67); // 0\n */\nexport function toBaseTemperature(variant: TemperatureUnit, value: number): number {\n const unit = TEMPERATURE_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown temperature variant: ${variant}`);\n }\n\n // Temperatura usa fórmulas (toBase/fromBase), não factor\n if (unit.toBase) {\n return unit.toBase(value);\n }\n\n // Fallback (não deveria acontecer para temperature)\n return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (celsius) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em celsius\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseTemperature('fahrenheit', 0); // 32\n * fromBaseTemperature('kelvin', 0); // 273.15\n * fromBaseTemperature('rankine', 0); // 491.67\n */\nexport function fromBaseTemperature(variant: TemperatureUnit, baseValue: number): number {\n const unit = TEMPERATURE_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown temperature variant: ${variant}`);\n }\n\n // Temperatura usa fórmulas (toBase/fromBase), não factor\n if (unit.fromBase) {\n return unit.fromBase(baseValue);\n }\n\n // Fallback (não deveria acontecer para temperature)\n return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de temperatura\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertTemperature('celsius', 'fahrenheit', 0); // 32\n * convertTemperature('celsius', 'fahrenheit', 100); // 212\n * convertTemperature('fahrenheit', 'celsius', 32); // 0\n * convertTemperature('celsius', 'kelvin', 0); // 273.15\n * convertTemperature('kelvin', 'rankine', 0); // 0\n */\nexport function convertTemperature(\n from: TemperatureUnit,\n to: TemperatureUnit,\n value: number\n): number {\n // Otimização: mesma unidade\n if (from === to) {\n return value;\n }\n\n // Hub-and-spoke: from → base (celsius) → to\n const baseValue = toBaseTemperature(from, value);\n return fromBaseTemperature(to, baseValue);\n}\n\n/**\n * Versão safe de convertTemperature que retorna Result\n *\n * @example\n * tryConvertTemperature('celsius', 'fahrenheit', 0);\n * // { ok: true, value: 32 }\n *\n * tryConvertTemperature('invalid', 'fahrenheit', 0);\n * // { ok: false, error: 'Unknown temperature variant: invalid' }\n */\nexport function tryConvertTemperature(\n from: TemperatureUnit,\n to: TemperatureUnit,\n value: number\n): Result<number> {\n try {\n const result = convertTemperature(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasTemperatureVariant(variant: string): variant is TemperatureUnit {\n return variant in TEMPERATURE_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getTemperatureVariants(): TemperatureUnit[] {\n return Object.keys(TEMPERATURE_UNITS) as TemperatureUnit[];\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_decimeter\n \"dm³\": \"cubic_decimeter\",\n dm3: \"cubic_decimeter\",\n // cubic_centimeter\n \"cm³\": \"cubic_centimeter\",\n cm3: \"cubic_centimeter\",\n cc: \"cubic_centimeter\",\n // cubic_millimeter\n \"mm³\": \"cubic_millimeter\",\n mm3: \"cubic_millimeter\",\n // hectoliter\n hL: \"hectoliter\",\n hl: \"hectoliter\",\n // decaliter\n daL: \"decaliter\",\n dal: \"decaliter\",\n // liter\n L: \"liter\",\n l: \"liter\",\n // deciliter\n dL: \"deciliter\",\n dl: \"deciliter\",\n // centiliter\n cL: \"centiliter\",\n cl: \"centiliter\",\n // milliliter\n mL: \"milliliter\",\n ml: \"milliliter\",\n // microliter\n \"μL\": \"microliter\",\n uL: \"microliter\",\n ul: \"microliter\",\n // gallon_us\n gal: \"gallon_us\",\n // quart_us\n qt: \"quart_us\",\n // pint_us\n pt: \"pint_us\",\n // cup_us\n cup: \"cup_us\",\n // fluid_ounce_us\n \"fl oz\": \"fluid_ounce_us\",\n floz: \"fluid_ounce_us\",\n // tablespoon_us\n tbsp: \"tablespoon_us\",\n // teaspoon_us\n tsp: \"teaspoon_us\",\n // gallon_uk\n \"gal uk\": \"gallon_uk\",\n // quart_uk\n \"qt uk\": \"quart_uk\",\n // pint_uk\n \"pt uk\": \"pint_uk\",\n // fluid_ounce_uk\n \"fl oz uk\": \"fluid_ounce_uk\",\n // barrel_oil\n bbl: \"barrel_oil\",\n // cubic_inch\n \"in³\": \"cubic_inch\",\n in3: \"cubic_inch\",\n // cubic_foot\n \"ft³\": \"cubic_foot\",\n ft3: \"cubic_foot\",\n // cubic_yard\n \"yd³\": \"cubic_yard\",\n yd3: \"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 * Volume Role - Convert Pillar\n *\n * Conversão entre unidades de volume usando arquitetura hub-and-spoke.\n * Base: liter (L)\n *\n * @example\n * import { convertVolume, toBaseVolume, fromBaseVolume } from '@attrx/role-morphic/volume/convert';\n *\n * convertVolume('gallon_us', 'liter', 1); // 3.785411784\n * toBaseVolume('milliliter', 500); // 0.5\n * fromBaseVolume('gallon_us', 3.785411784); // 1\n */\n\nimport { VOLUME_UNITS, type VolumeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const VOLUME_BASE: VolumeUnit = \"liter\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (liter)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em liter\n *\n * @example\n * toBaseVolume('milliliter', 500); // 0.5\n * toBaseVolume('gallon_us', 1); // 3.785411784\n */\nexport function toBaseVolume(variant: VolumeUnit, value: number): number {\n const unit = VOLUME_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown volume variant: ${variant}`);\n }\n\n return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (liter) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em liter\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseVolume('milliliter', 0.5); // 500\n * fromBaseVolume('gallon_us', 3.785411784); // 1\n */\nexport function fromBaseVolume(variant: VolumeUnit, baseValue: number): number {\n const unit = VOLUME_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown volume variant: ${variant}`);\n }\n\n return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de volume\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertVolume('gallon_us', 'liter', 1); // 3.785411784\n * convertVolume('milliliter', 'liter', 500); // 0.5\n * convertVolume('cup_us', 'tablespoon_us', 1); // 16\n */\nexport function convertVolume(\n from: VolumeUnit,\n to: VolumeUnit,\n value: number\n): number {\n // Otimização: mesma unidade\n if (from === to) {\n return value;\n }\n\n // Hub-and-spoke: from → base → to\n const baseValue = toBaseVolume(from, value);\n return fromBaseVolume(to, baseValue);\n}\n\n/**\n * Versão safe de convertVolume que retorna Result\n *\n * @example\n * tryConvertVolume('gallon_us', 'liter', 1);\n * // { ok: true, value: 3.785411784 }\n *\n * tryConvertVolume('invalid', 'liter', 1);\n * // { ok: false, error: 'Unknown volume variant: invalid' }\n */\nexport function tryConvertVolume(\n from: VolumeUnit,\n to: VolumeUnit,\n value: number\n): Result<number> {\n try {\n const result = convertVolume(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasVolumeVariant(variant: string): variant is VolumeUnit {\n return variant in VOLUME_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getVolumeVariants(): VolumeUnit[] {\n return Object.keys(VOLUME_UNITS) as VolumeUnit[];\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 // kilometer_per_hour\n \"km/h\": \"kilometer_per_hour\",\n kmh: \"kilometer_per_hour\",\n kph: \"kilometer_per_hour\",\n // mile_per_hour\n mph: \"mile_per_hour\",\n \"mi/h\": \"mile_per_hour\",\n // foot_per_second\n \"ft/s\": \"foot_per_second\",\n fps: \"foot_per_second\",\n // knot\n kn: \"knot\",\n kt: \"knot\",\n kts: \"knot\",\n // mach\n ma: \"mach\",\n // speed_of_light\n c: \"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 * Speed Role - Convert Pillar\n *\n * Conversão entre unidades de velocidade usando arquitetura hub-and-spoke.\n * Base: meter_per_second (m/s)\n *\n * @example\n * import { convertSpeed, toBaseSpeed, fromBaseSpeed } from '@attrx/role-morphic/speed/convert';\n *\n * convertSpeed('kilometer_per_hour', 'mile_per_hour', 100); // 62.1371...\n * toBaseSpeed('kilometer_per_hour', 100); // 27.7778...\n * fromBaseSpeed('mile_per_hour', 27.7778); // ~62.14\n */\n\nimport { SPEED_UNITS, type SpeedUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const SPEED_BASE: SpeedUnit = \"meter_per_second\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (meter_per_second)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em meter_per_second\n *\n * @example\n * toBaseSpeed('kilometer_per_hour', 100); // 27.7778...\n * toBaseSpeed('mile_per_hour', 60); // 26.8224\n */\nexport function toBaseSpeed(variant: SpeedUnit, value: number): number {\n const unit = SPEED_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown speed variant: ${variant}`);\n }\n\n return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (meter_per_second) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em meter_per_second\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseSpeed('kilometer_per_hour', 27.7778); // ~100\n * fromBaseSpeed('mile_per_hour', 26.8224); // ~60\n */\nexport function fromBaseSpeed(variant: SpeedUnit, baseValue: number): number {\n const unit = SPEED_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown speed variant: ${variant}`);\n }\n\n return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de velocidade\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertSpeed('kilometer_per_hour', 'mile_per_hour', 100); // 62.1371...\n * convertSpeed('knot', 'kilometer_per_hour', 1); // 1.852\n * convertSpeed('mach', 'kilometer_per_hour', 1); // 1225.044\n */\nexport function convertSpeed(\n from: SpeedUnit,\n to: SpeedUnit,\n value: number\n): number {\n // Otimização: mesma unidade\n if (from === to) {\n return value;\n }\n\n // Hub-and-spoke: from → base → to\n const baseValue = toBaseSpeed(from, value);\n return fromBaseSpeed(to, baseValue);\n}\n\n/**\n * Versão safe de convertSpeed que retorna Result\n *\n * @example\n * tryConvertSpeed('kilometer_per_hour', 'mile_per_hour', 100);\n * // { ok: true, value: 62.1371... }\n *\n * tryConvertSpeed('invalid', 'mile_per_hour', 100);\n * // { ok: false, error: 'Unknown speed variant: invalid' }\n */\nexport function tryConvertSpeed(\n from: SpeedUnit,\n to: SpeedUnit,\n value: number\n): Result<number> {\n try {\n const result = convertSpeed(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasSpeedVariant(variant: string): variant is SpeedUnit {\n return variant in SPEED_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getSpeedVariants(): SpeedUnit[] {\n return Object.keys(SPEED_UNITS) as SpeedUnit[];\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 // megajoule\n mj: \"megajoule\",\n // kilojoule\n kj: \"kilojoule\",\n // joule\n j: \"joule\",\n // calorie\n cal: \"calorie\",\n // kilocalorie\n kcal: \"kilocalorie\",\n Cal: \"kilocalorie\",\n // watt_hour\n wh: \"watt_hour\",\n // kilowatt_hour\n kwh: \"kilowatt_hour\",\n // megawatt_hour\n mwh: \"megawatt_hour\",\n // gigawatt_hour\n gwh: \"gigawatt_hour\",\n // btu\n btu: \"btu\",\n // therm\n thm: \"therm\",\n // electronvolt\n ev: \"electronvolt\",\n // kiloelectronvolt\n kev: \"kiloelectronvolt\",\n // megaelectronvolt\n mev: \"megaelectronvolt\",\n // erg\n erg: \"erg\",\n // foot_pound\n \"ft-lb\": \"foot_pound\",\n \"ft-lbf\": \"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 * Energy Role - Convert Pillar\n *\n * Conversão entre unidades de energia usando arquitetura hub-and-spoke.\n * Base: joule (J)\n *\n * @example\n * import { convertEnergy, toBaseEnergy, fromBaseEnergy } from '@attrx/role-morphic/energy/convert';\n *\n * convertEnergy('kilocalorie', 'kilojoule', 1); // 4.1868\n * toBaseEnergy('kilowatt_hour', 1); // 3600000\n * fromBaseEnergy('btu', 1055.06); // ~1\n */\n\nimport { ENERGY_UNITS, type EnergyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const ENERGY_BASE: EnergyUnit = \"joule\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (joule)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em joule\n *\n * @example\n * toBaseEnergy('kilowatt_hour', 1); // 3600000\n * toBaseEnergy('kilocalorie', 1); // 4186.8\n */\nexport function toBaseEnergy(variant: EnergyUnit, value: number): number {\n const unit = ENERGY_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown energy variant: ${variant}`);\n }\n\n return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (joule) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em joule\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseEnergy('kilowatt_hour', 3600000); // 1\n * fromBaseEnergy('kilocalorie', 4186.8); // 1\n */\nexport function fromBaseEnergy(variant: EnergyUnit, baseValue: number): number {\n const unit = ENERGY_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown energy variant: ${variant}`);\n }\n\n return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de energia\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertEnergy('kilocalorie', 'kilojoule', 1); // 4.1868\n * convertEnergy('kilowatt_hour', 'megajoule', 1); // 3.6\n * convertEnergy('btu', 'joule', 1); // 1055.056...\n */\nexport function convertEnergy(\n from: EnergyUnit,\n to: EnergyUnit,\n value: number\n): number {\n // Otimização: mesma unidade\n if (from === to) {\n return value;\n }\n\n // Hub-and-spoke: from → base → to\n const baseValue = toBaseEnergy(from, value);\n return fromBaseEnergy(to, baseValue);\n}\n\n/**\n * Versão safe de convertEnergy que retorna Result\n *\n * @example\n * tryConvertEnergy('kilocalorie', 'kilojoule', 1);\n * // { ok: true, value: 4.1868 }\n *\n * tryConvertEnergy('invalid', 'joule', 1);\n * // { ok: false, error: 'Unknown energy variant: invalid' }\n */\nexport function tryConvertEnergy(\n from: EnergyUnit,\n to: EnergyUnit,\n value: number\n): Result<number> {\n try {\n const result = convertEnergy(from, to, value);\n return { ok: true, value: result };\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasEnergyVariant(variant: string): variant is EnergyUnit {\n return variant in ENERGY_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getEnergyVariants(): EnergyUnit[] {\n return Object.keys(ENERGY_UNITS) as EnergyUnit[];\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 // megawatt\n mw: \"megawatt\",\n // kilowatt\n kw: \"kilowatt\",\n // watt\n w: \"watt\",\n // microwatt\n \"μw\": \"microwatt\",\n uw: \"microwatt\",\n // horsepower_mechanical\n hp: \"horsepower_mechanical\",\n // horsepower_metric\n ps: \"horsepower_metric\",\n cv: \"horsepower_metric\",\n // horsepower_electric\n \"hp(e)\": \"horsepower_electric\",\n // horsepower_boiler\n \"hp(s)\": \"horsepower_boiler\",\n bhp: \"horsepower_boiler\",\n // btu_per_hour\n \"btu/h\": \"btu_per_hour\",\n \"btu/hr\": \"btu_per_hour\",\n // btu_per_second\n \"btu/s\": \"btu_per_second\",\n // ton_of_refrigeration\n tr: \"ton_of_refrigeration\",\n rt: \"ton_of_refrigeration\",\n // foot_pound_per_second\n \"ft-lb/s\": \"foot_pound_per_second\",\n \"ft-lbf/s\": \"foot_pound_per_second\",\n // calorie_per_second\n \"cal/s\": \"calorie_per_second\",\n // kilocalorie_per_hour\n \"kcal/h\": \"kilocalorie_per_hour\",\n \"kcal/hr\": \"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 * Power Role - Convert Pillar\n *\n * Conversão entre unidades de potência usando hub-and-spoke (via watt).\n *\n * @example\n * import { convertPower, toBasePower, fromBasePower } from '@attrx/role-morphic/power/convert';\n *\n * convertPower('horsepower_mechanical', 'kilowatt', 1); // 0.7457\n * toBasePower('kilowatt', 2.5); // 2500 (watts)\n * fromBasePower('kilowatt', 2500); // 2.5\n */\n\nimport { POWER_UNITS, type PowerUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const POWER_BASE: PowerUnit = \"watt\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (watt)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em watts\n *\n * @example\n * toBasePower('kilowatt', 2.5); // 2500\n * toBasePower('horsepower_mechanical', 1); // 745.7\n */\nexport function toBasePower(variant: PowerUnit, value: number): number {\n const config = POWER_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown power unit: ${variant}`);\n }\n return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (watt) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em watts\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBasePower('kilowatt', 2500); // 2.5\n * fromBasePower('watt', 100); // 100\n */\nexport function fromBasePower(variant: PowerUnit, baseValue: number): number {\n const config = POWER_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown power unit: ${variant}`);\n }\n return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de potência\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertPower('horsepower_mechanical', 'kilowatt', 1); // 0.7457\n * convertPower('kilowatt', 'watt', 2.5); // 2500\n */\nexport function convertPower(\n from: PowerUnit,\n to: PowerUnit,\n value: number,\n): number {\n if (from === to) {\n return value;\n }\n const baseValue = toBasePower(from, value);\n return fromBasePower(to, baseValue);\n}\n\n/**\n * Versão safe de convertPower que retorna Result\n *\n * @example\n * tryConvertPower('kilowatt', 'watt', 1); // { ok: true, value: 1000 }\n * tryConvertPower('invalid', 'watt', 1); // { ok: false, error: '...' }\n */\nexport function tryConvertPower(\n from: PowerUnit,\n to: PowerUnit,\n value: number,\n): Result<number> {\n try {\n return { ok: true, value: convertPower(from, to, value) };\n } catch (e) {\n return { ok: false, error: (e as Error).message };\n }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasPowerVariant('kilowatt'); // true\n * hasPowerVariant('invalid'); // false\n */\nexport function hasPowerVariant(variant: string): variant is PowerUnit {\n return variant in POWER_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getPowerVariants(); // ['gigawatt', 'megawatt', 'kilowatt', ...]\n */\nexport function getPowerVariants(): PowerUnit[] {\n return Object.keys(POWER_UNITS) as PowerUnit[];\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 // kilopascal\n kpa: \"kilopascal\",\n // hectopascal\n hpa: \"hectopascal\",\n // pascal\n pa: \"pascal\",\n // bar\n bar: \"bar\",\n // millibar\n mbar: \"millibar\",\n mb: \"millibar\",\n // atmosphere\n atm: \"atmosphere\",\n // torr\n torr: \"torr\",\n // mmhg\n mmhg: \"mmhg\",\n // inhg\n inhg: \"inhg\",\n // psi\n psi: \"psi\",\n // ksi\n ksi: \"ksi\",\n // cmh2o\n cmh2o: \"cmh2o\",\n // inh2o\n inh2o: \"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 * Pressure Role - Convert Pillar\n *\n * Conversão entre unidades de pressão usando hub-and-spoke (via pascal).\n *\n * @example\n * import { convertPressure, toBasePressure, fromBasePressure } from '@attrx/role-morphic/pressure/convert';\n *\n * convertPressure('bar', 'pascal', 1); // 100000\n * toBasePressure('bar', 2.5); // 250000 (pascals)\n * fromBasePressure('bar', 250000); // 2.5\n */\n\nimport { PRESSURE_UNITS, type PressureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const PRESSURE_BASE: PressureUnit = \"pascal\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (pascal)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em pascals\n *\n * @example\n * toBasePressure('bar', 2.5); // 250000\n * toBasePressure('atmosphere', 1); // 101325\n */\nexport function toBasePressure(variant: PressureUnit, value: number): number {\n const config = PRESSURE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown pressure unit: ${variant}`);\n }\n return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (pascal) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em pascals\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBasePressure('bar', 250000); // 2.5\n * fromBasePressure('atmosphere', 101325); // 1\n */\nexport function fromBasePressure(variant: PressureUnit, baseValue: number): number {\n const config = PRESSURE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown pressure unit: ${variant}`);\n }\n return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de pressão\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertPressure('bar', 'pascal', 1); // 100000\n * convertPressure('atmosphere', 'psi', 1); // 14.696\n */\nexport function convertPressure(\n from: PressureUnit,\n to: PressureUnit,\n value: number,\n): number {\n if (from === to) {\n return value;\n }\n const baseValue = toBasePressure(from, value);\n return fromBasePressure(to, baseValue);\n}\n\n/**\n * Versão safe de convertPressure que retorna Result\n *\n * @example\n * tryConvertPressure('bar', 'pascal', 1); // { ok: true, value: 100000 }\n * tryConvertPressure('invalid', 'pascal', 1); // { ok: false, error: '...' }\n */\nexport function tryConvertPressure(\n from: PressureUnit,\n to: PressureUnit,\n value: number,\n): Result<number> {\n try {\n return { ok: true, value: convertPressure(from, to, value) };\n } catch (e) {\n return { ok: false, error: (e as Error).message };\n }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasPressureVariant('bar'); // true\n * hasPressureVariant('invalid'); // false\n */\nexport function hasPressureVariant(variant: string): variant is PressureUnit {\n return variant in PRESSURE_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getPressureVariants(); // ['megapascal', 'kilopascal', 'hectopascal', ...]\n */\nexport function getPressureVariants(): PressureUnit[] {\n return Object.keys(PRESSURE_UNITS) as PressureUnit[];\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 // gigahertz\n ghz: \"gigahertz\",\n // megahertz\n mhz: \"megahertz\",\n // kilohertz\n khz: \"kilohertz\",\n // hertz\n hz: \"hertz\",\n cps: \"hertz\",\n // microhertz\n \"μhz\": \"microhertz\",\n uhz: \"microhertz\",\n // rpm\n rpm: \"rpm\",\n // bpm\n bpm: \"bpm\",\n // radians_per_second\n \"rad/s\": \"radians_per_second\",\n // cycles_per_minute\n cpm: \"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 * Frequency Role - Convert Pillar\n *\n * Conversão entre unidades de frequência usando hub-and-spoke (via hertz).\n *\n * @example\n * import { convertFrequency, toBaseFrequency, fromBaseFrequency } from '@attrx/role-morphic/frequency/convert';\n *\n * convertFrequency('megahertz', 'hertz', 1); // 1000000\n * toBaseFrequency('megahertz', 2.4); // 2400000 (hertz)\n * fromBaseFrequency('megahertz', 2400000); // 2.4\n */\n\nimport { FREQUENCY_UNITS, type FrequencyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const FREQUENCY_BASE: FrequencyUnit = \"hertz\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (hertz)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em hertz\n *\n * @example\n * toBaseFrequency('megahertz', 2.4); // 2400000\n * toBaseFrequency('rpm', 60); // 1\n */\nexport function toBaseFrequency(variant: FrequencyUnit, value: number): number {\n const config = FREQUENCY_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown frequency unit: ${variant}`);\n }\n return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (hertz) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em hertz\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseFrequency('megahertz', 2400000); // 2.4\n * fromBaseFrequency('rpm', 1); // 60\n */\nexport function fromBaseFrequency(variant: FrequencyUnit, baseValue: number): number {\n const config = FREQUENCY_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown frequency unit: ${variant}`);\n }\n return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de frequência\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertFrequency('megahertz', 'hertz', 1); // 1000000\n * convertFrequency('rpm', 'hertz', 60); // 1\n */\nexport function convertFrequency(\n from: FrequencyUnit,\n to: FrequencyUnit,\n value: number,\n): number {\n if (from === to) {\n return value;\n }\n const baseValue = toBaseFrequency(from, value);\n return fromBaseFrequency(to, baseValue);\n}\n\n/**\n * Versão safe de convertFrequency que retorna Result\n *\n * @example\n * tryConvertFrequency('megahertz', 'hertz', 1); // { ok: true, value: 1000000 }\n * tryConvertFrequency('invalid', 'hertz', 1); // { ok: false, error: '...' }\n */\nexport function tryConvertFrequency(\n from: FrequencyUnit,\n to: FrequencyUnit,\n value: number,\n): Result<number> {\n try {\n return { ok: true, value: convertFrequency(from, to, value) };\n } catch (e) {\n return { ok: false, error: (e as Error).message };\n }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasFrequencyVariant('hertz'); // true\n * hasFrequencyVariant('invalid'); // false\n */\nexport function hasFrequencyVariant(variant: string): variant is FrequencyUnit {\n return variant in FREQUENCY_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getFrequencyVariants(); // ['terahertz', 'gigahertz', 'megahertz', ...]\n */\nexport function getFrequencyVariants(): FrequencyUnit[] {\n return Object.keys(FREQUENCY_UNITS) as FrequencyUnit[];\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 rev: \"turn\",\n // degree\n \"°\": \"degree\",\n deg: \"degree\",\n // arcminute\n \"′\": \"arcminute\",\n \"'\": \"arcminute\",\n arcmin: \"arcminute\",\n // arcsecond\n \"″\": \"arcsecond\",\n '\"': \"arcsecond\",\n arcsec: \"arcsecond\",\n // milliarcsecond\n mas: \"milliarcsecond\",\n // radian\n rad: \"radian\",\n // milliradian\n mrad: \"milliradian\",\n // gradian\n gon: \"gradian\",\n grad: \"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 * Angle Role - Convert Pillar\n *\n * Conversão entre unidades de ângulo usando hub-and-spoke (via degree).\n *\n * @example\n * import { convertAngle, toBaseAngle, fromBaseAngle } from '@attrx/role-morphic/angle/convert';\n *\n * convertAngle('degree', 'radian', 180); // π ≈ 3.14159\n * toBaseAngle('turn', 1); // 360 (degrees)\n * fromBaseAngle('radian', 180); // π ≈ 3.14159\n */\n\nimport { ANGLE_UNITS, type AngleUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const ANGLE_BASE: AngleUnit = \"degree\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (degree)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em degrees\n *\n * @example\n * toBaseAngle('turn', 1); // 360\n * toBaseAngle('radian', Math.PI); // 180\n */\nexport function toBaseAngle(variant: AngleUnit, value: number): number {\n const config = ANGLE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown angle unit: ${variant}`);\n }\n return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (degree) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em degrees\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseAngle('radian', 180); // π ≈ 3.14159\n * fromBaseAngle('turn', 360); // 1\n */\nexport function fromBaseAngle(variant: AngleUnit, baseValue: number): number {\n const config = ANGLE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown angle unit: ${variant}`);\n }\n return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de ângulo\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertAngle('degree', 'radian', 180); // π ≈ 3.14159\n * convertAngle('turn', 'degree', 1); // 360\n */\nexport function convertAngle(\n from: AngleUnit,\n to: AngleUnit,\n value: number,\n): number {\n if (from === to) {\n return value;\n }\n const baseValue = toBaseAngle(from, value);\n return fromBaseAngle(to, baseValue);\n}\n\n/**\n * Versão safe de convertAngle que retorna Result\n *\n * @example\n * tryConvertAngle('degree', 'radian', 180); // { ok: true, value: π }\n * tryConvertAngle('invalid', 'radian', 180); // { ok: false, error: '...' }\n */\nexport function tryConvertAngle(\n from: AngleUnit,\n to: AngleUnit,\n value: number,\n): Result<number> {\n try {\n return { ok: true, value: convertAngle(from, to, value) };\n } catch (e) {\n return { ok: false, error: (e as Error).message };\n }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasAngleVariant('degree'); // true\n * hasAngleVariant('invalid'); // false\n */\nexport function hasAngleVariant(variant: string): variant is AngleUnit {\n return variant in ANGLE_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getAngleVariants(); // ['turn', 'degree', 'arcminute', ...]\n */\nexport function getAngleVariants(): AngleUnit[] {\n return Object.keys(ANGLE_UNITS) as AngleUnit[];\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 convertAngle(\"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 convertAngle(\"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 * 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 // microsecond\n \"μs\": \"microsecond\",\n us: \"microsecond\",\n // millisecond\n ms: \"millisecond\",\n // second\n s: \"second\",\n sec: \"second\",\n // minute\n min: \"minute\",\n // hour\n h: \"hour\",\n hr: \"hour\",\n hrs: \"hour\",\n // day\n d: \"day\",\n // week\n wk: \"week\",\n // month\n mo: \"month\",\n // year\n yr: \"year\",\n y: \"year\",\n // decade\n dec: \"decade\",\n // century\n c: \"century\",\n // millennium\n ky: \"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 * Time Role - Convert Pillar\n *\n * Conversão entre unidades de tempo usando hub-and-spoke (via second).\n *\n * @example\n * import { convertTime, toBaseTime, fromBaseTime } from '@attrx/role-morphic/time/convert';\n *\n * convertTime('hour', 'minute', 1); // 60\n * toBaseTime('minute', 5); // 300 (seconds)\n * fromBaseTime('hour', 3600); // 1\n */\n\nimport { TIME_UNITS, type TimeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const TIME_BASE: TimeUnit = \"second\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (second)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em seconds\n *\n * @example\n * toBaseTime('minute', 5); // 300\n * toBaseTime('hour', 1); // 3600\n */\nexport function toBaseTime(variant: TimeUnit, value: number): number {\n const config = TIME_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown time unit: ${variant}`);\n }\n return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (second) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em seconds\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseTime('minute', 300); // 5\n * fromBaseTime('hour', 3600); // 1\n */\nexport function fromBaseTime(variant: TimeUnit, baseValue: number): number {\n const config = TIME_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown time unit: ${variant}`);\n }\n return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de tempo\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertTime('hour', 'minute', 1); // 60\n * convertTime('day', 'hour', 1); // 24\n */\nexport function convertTime(\n from: TimeUnit,\n to: TimeUnit,\n value: number,\n): number {\n if (from === to) {\n return value;\n }\n const baseValue = toBaseTime(from, value);\n return fromBaseTime(to, baseValue);\n}\n\n/**\n * Versão safe de convertTime que retorna Result\n *\n * @example\n * tryConvertTime('hour', 'minute', 1); // { ok: true, value: 60 }\n * tryConvertTime('invalid', 'minute', 1); // { ok: false, error: '...' }\n */\nexport function tryConvertTime(\n from: TimeUnit,\n to: TimeUnit,\n value: number,\n): Result<number> {\n try {\n return { ok: true, value: convertTime(from, to, value) };\n } catch (e) {\n return { ok: false, error: (e as Error).message };\n }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasTimeVariant('second'); // true\n * hasTimeVariant('invalid'); // false\n */\nexport function hasTimeVariant(variant: string): variant is TimeUnit {\n return variant in TIME_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getTimeVariants(); // ['nanosecond', 'microsecond', 'millisecond', ...]\n */\nexport function getTimeVariants(): TimeUnit[] {\n return Object.keys(TIME_UNITS) as TimeUnit[];\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 // byte\n B: \"byte\",\n // kibibyte (IEC)\n KiB: \"kibibyte\",\n // mebibyte (IEC)\n MiB: \"mebibyte\",\n // gibibyte (IEC)\n GiB: \"gibibyte\",\n // tebibyte (IEC)\n TiB: \"tebibyte\",\n // pebibyte (IEC)\n PiB: \"pebibyte\",\n // exbibyte (IEC)\n EiB: \"exbibyte\",\n // kilobyte (SI)\n kB: \"kilobyte\",\n kb: \"kilobyte\",\n // megabyte (SI)\n MB: \"megabyte\",\n // gigabyte (SI)\n GB: \"gigabyte\",\n // terabyte (SI)\n TB: \"terabyte\",\n // petabyte (SI)\n PB: \"petabyte\",\n // exabyte (SI)\n EB: \"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 * Digital Role - Convert Pillar\n *\n * Conversão entre unidades de armazenamento digital usando hub-and-spoke (via byte).\n *\n * @example\n * import { convertDigital, toBaseDigital, fromBaseDigital } from '@attrx/role-morphic/digital/convert';\n *\n * convertDigital('kilobyte', 'byte', 1); // 1000\n * convertDigital('kibibyte', 'byte', 1); // 1024\n * toBaseDigital('megabyte', 1); // 1000000 (bytes)\n * fromBaseDigital('mebibyte', 1048576); // 1\n */\n\nimport { DIGITAL_UNITS, type DigitalUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const DIGITAL_BASE: DigitalUnit = \"byte\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (byte)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em bytes\n *\n * @example\n * toBaseDigital('kilobyte', 1); // 1000\n * toBaseDigital('kibibyte', 1); // 1024\n */\nexport function toBaseDigital(variant: DigitalUnit, value: number): number {\n const config = DIGITAL_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown digital unit: ${variant}`);\n }\n return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (byte) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em bytes\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseDigital('kilobyte', 1000); // 1\n * fromBaseDigital('kibibyte', 1024); // 1\n */\nexport function fromBaseDigital(variant: DigitalUnit, baseValue: number): number {\n const config = DIGITAL_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown digital unit: ${variant}`);\n }\n return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de armazenamento digital\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertDigital('kilobyte', 'byte', 1); // 1000\n * convertDigital('kibibyte', 'byte', 1); // 1024\n * convertDigital('gigabyte', 'gibibyte', 1); // ~0.931\n */\nexport function convertDigital(\n from: DigitalUnit,\n to: DigitalUnit,\n value: number,\n): number {\n if (from === to) {\n return value;\n }\n const baseValue = toBaseDigital(from, value);\n return fromBaseDigital(to, baseValue);\n}\n\n/**\n * Versão safe de convertDigital que retorna Result\n *\n * @example\n * tryConvertDigital('kilobyte', 'byte', 1); // { ok: true, value: 1000 }\n * tryConvertDigital('invalid', 'byte', 1); // { ok: false, error: '...' }\n */\nexport function tryConvertDigital(\n from: DigitalUnit,\n to: DigitalUnit,\n value: number,\n): Result<number> {\n try {\n return { ok: true, value: convertDigital(from, to, value) };\n } catch (e) {\n return { ok: false, error: (e as Error).message };\n }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasDigitalVariant('byte'); // true\n * hasDigitalVariant('invalid'); // false\n */\nexport function hasDigitalVariant(variant: string): variant is DigitalUnit {\n return variant in DIGITAL_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getDigitalVariants(); // ['bit', 'byte', 'kibibyte', ...]\n */\nexport function getDigitalVariants(): DigitalUnit[] {\n return Object.keys(DIGITAL_UNITS) as DigitalUnit[];\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 * Color Role - Convert Pillar\n *\n * Conversão entre variantes de cor usando hub-and-spoke (via rgb_object/RGBA).\n *\n * @example\n * import { convertColor, hexToRgba, rgbaToHex } from '@attrx/role-morphic/color/convert';\n *\n * convertColor('hex', 'rgb_object', '#ff0000'); // { r: 255, g: 0, b: 0, a: 1 }\n * convertColor('rgb_object', 'hsl_string', { r: 255, g: 0, b: 0 }); // \"hsl(0, 100%, 50%)\"\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject } from \"./types\";\nimport { rgbToHsl, hslToRgb, normalizeAlpha, normalizeRgbChannel, clamp } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nexport const COLOR_BASE: ColorVariant = \"rgb_object\";\n\nexport const COLOR_VARIANTS: ColorVariant[] = [\n \"hex\",\n \"rgb_object\",\n \"rgb_string\",\n \"hsl_object\",\n \"hsl_string\",\n];\n\n// =============================================================================\n// TO BASE (→ RGBA)\n// =============================================================================\n\n/**\n * Converte hex para RGBA\n */\nexport function hexToRgba(hex: string): RGBA {\n let h = hex.trim();\n if (h.startsWith(\"#\")) h = h.slice(1);\n\n let r: number, g: number, b: number, a: number;\n\n if (h.length === 3) {\n r = parseInt(h[0] + h[0], 16);\n g = parseInt(h[1] + h[1], 16);\n b = parseInt(h[2] + h[2], 16);\n a = 1;\n } else if (h.length === 4) {\n r = parseInt(h[0] + h[0], 16);\n g = parseInt(h[1] + h[1], 16);\n b = parseInt(h[2] + h[2], 16);\n a = parseInt(h[3] + h[3], 16) / 255;\n } else if (h.length === 6) {\n r = parseInt(h.slice(0, 2), 16);\n g = parseInt(h.slice(2, 4), 16);\n b = parseInt(h.slice(4, 6), 16);\n a = 1;\n } else if (h.length === 8) {\n r = parseInt(h.slice(0, 2), 16);\n g = parseInt(h.slice(2, 4), 16);\n b = parseInt(h.slice(4, 6), 16);\n a = parseInt(h.slice(6, 8), 16) / 255;\n } else {\n throw new Error(`Invalid hex color: ${hex}`);\n }\n\n return { r, g, b, a };\n}\n\n/**\n * Converte RGB object para RGBA\n */\nexport function rgbObjectToRgba(rgb: ColorRgbObject): RGBA {\n return {\n r: normalizeRgbChannel(rgb.r),\n g: normalizeRgbChannel(rgb.g),\n b: normalizeRgbChannel(rgb.b),\n a: normalizeAlpha(rgb.a),\n };\n}\n\n/**\n * Converte RGB string para RGBA\n */\nexport function rgbStringToRgba(rgb: string): RGBA {\n const match = rgb.match(/rgba?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i);\n if (!match) {\n throw new Error(`Invalid RGB string: ${rgb}`);\n }\n\n return {\n r: normalizeRgbChannel(parseFloat(match[1])),\n g: normalizeRgbChannel(parseFloat(match[2])),\n b: normalizeRgbChannel(parseFloat(match[3])),\n a: match[4] !== undefined ? normalizeAlpha(parseFloat(match[4])) : 1,\n };\n}\n\n/**\n * Converte HSL object para RGBA\n */\nexport function hslObjectToRgba(hsl: ColorHslObject): RGBA {\n const { r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l);\n return {\n r,\n g,\n b,\n a: normalizeAlpha(hsl.a),\n };\n}\n\n/**\n * Converte HSL string para RGBA\n */\nexport function hslStringToRgba(hsl: string): RGBA {\n const match = hsl.match(/hsla?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%?\\s*,\\s*([\\d.]+)%?\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i);\n if (!match) {\n throw new Error(`Invalid HSL string: ${hsl}`);\n }\n\n const h = parseFloat(match[1]);\n const s = parseFloat(match[2]);\n const l = parseFloat(match[3]);\n const a = match[4] !== undefined ? parseFloat(match[4]) : 1;\n\n const { r, g, b } = hslToRgb(h, s, l);\n return { r, g, b, a: normalizeAlpha(a) };\n}\n\n/**\n * Converte qualquer variante para RGBA (base)\n */\nexport function toBaseColor(variant: ColorVariant, value: unknown): RGBA {\n switch (variant) {\n case \"hex\":\n return hexToRgba(value as string);\n case \"rgb_object\":\n return rgbObjectToRgba(value as ColorRgbObject);\n case \"rgb_string\":\n return rgbStringToRgba(value as string);\n case \"hsl_object\":\n return hslObjectToRgba(value as ColorHslObject);\n case \"hsl_string\":\n return hslStringToRgba(value as string);\n default:\n throw new Error(`Unknown color variant: ${variant}`);\n }\n}\n\n// =============================================================================\n// FROM BASE (RGBA →)\n// =============================================================================\n\n/**\n * Converte RGBA para hex\n */\nexport function rgbaToHex(rgba: RGBA, includeAlpha = false): string {\n const r = rgba.r.toString(16).padStart(2, \"0\");\n const g = rgba.g.toString(16).padStart(2, \"0\");\n const b = rgba.b.toString(16).padStart(2, \"0\");\n\n if (includeAlpha || rgba.a < 1) {\n const a = Math.round(rgba.a * 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 * Converte RGBA para RGB object\n */\nexport function rgbaToRgbObject(rgba: RGBA): ColorRgbObject {\n if (rgba.a < 1) {\n return { r: rgba.r, g: rgba.g, b: rgba.b, a: rgba.a };\n }\n return { r: rgba.r, g: rgba.g, b: rgba.b };\n}\n\n/**\n * Converte RGBA para RGB string\n */\nexport function rgbaToRgbString(rgba: RGBA): string {\n if (rgba.a < 1) {\n return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n }\n return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n}\n\n/**\n * Converte RGBA para HSL object\n */\nexport function rgbaToHslObject(rgba: RGBA): ColorHslObject {\n const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n if (rgba.a < 1) {\n return { h, s, l, a: rgba.a };\n }\n return { h, s, l };\n}\n\n/**\n * Converte RGBA para HSL string\n */\nexport function rgbaToHslString(rgba: RGBA): string {\n const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n if (rgba.a < 1) {\n return `hsla(${h}, ${s}%, ${l}%, ${rgba.a})`;\n }\n return `hsl(${h}, ${s}%, ${l}%)`;\n}\n\n/**\n * Converte RGBA (base) para qualquer variante\n */\nexport function fromBaseColor(variant: ColorVariant, rgba: RGBA): unknown {\n switch (variant) {\n case \"hex\":\n return rgbaToHex(rgba);\n case \"rgb_object\":\n return rgbaToRgbObject(rgba);\n case \"rgb_string\":\n return rgbaToRgbString(rgba);\n case \"hsl_object\":\n return rgbaToHslObject(rgba);\n case \"hsl_string\":\n return rgbaToHslString(rgba);\n default:\n throw new Error(`Unknown color variant: ${variant}`);\n }\n}\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte entre duas variantes de cor\n *\n * @param from - Variante de origem\n * @param to - Variante de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertColor('hex', 'rgb_object', '#ff0000');\n * // { r: 255, g: 0, b: 0 }\n */\nexport function convertColor<TFrom = unknown, TTo = unknown>(\n from: ColorVariant,\n to: ColorVariant,\n value: TFrom,\n): TTo {\n // Otimização: mesma variante\n if (from === to) {\n return value as unknown as TTo;\n }\n\n // Converte via base (RGBA)\n const rgba = toBaseColor(from, value);\n return fromBaseColor(to, rgba) as TTo;\n}\n\n/**\n * Versão safe de convertColor que retorna Result\n */\nexport function tryConvertColor<TFrom = unknown, TTo = unknown>(\n from: ColorVariant,\n to: ColorVariant,\n value: TFrom,\n): Result<TTo> {\n try {\n const result = convertColor<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 * Verifica se variante existe\n */\nexport function hasColorVariant(variant: string): variant is ColorVariant {\n return COLOR_VARIANTS.includes(variant as ColorVariant);\n}\n\n/**\n * Retorna lista de variantes\n */\nexport function getColorVariants(): ColorVariant[] {\n return [...COLOR_VARIANTS];\n}\n","/**\n * Date Role - Convert Pillar\n *\n * Conversão entre variantes de data usando hub-and-spoke (via timestamp).\n *\n * @example\n * import { convertDate, isoToTimestamp, epochToIso } from '@attrx/role-morphic/date/convert';\n *\n * convertDate('iso', 'epoch', '2024-12-05T19:30:00.000Z'); // 1733425800\n * convertDate('epoch', 'iso', 1733425800); // '2024-12-05T19:30:00.000Z'\n * isoToTimestamp('2024-12-05T19:30:00.000Z'); // 1733425800000\n */\n\nimport type { DateVariant, DateTimestamp, DateIso, DateEpoch } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const DATE_BASE: DateVariant = \"timestamp\";\n\n/** Lista de variantes disponíveis */\nexport const DATE_VARIANTS: DateVariant[] = [\"iso\", \"timestamp\", \"epoch\"];\n\n// =============================================================================\n// TO BASE (para timestamp em ms)\n// =============================================================================\n\n/**\n * Converte ISO para timestamp (base)\n */\nexport function isoToBase(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/**\n * Timestamp já é a base\n */\nexport function timestampToBase(value: DateTimestamp): DateTimestamp {\n return value;\n}\n\n/**\n * Converte epoch (segundos) para timestamp (base em ms)\n */\nexport function epochToBase(value: DateEpoch): DateTimestamp {\n return value * 1000;\n}\n\n/**\n * Converte qualquer variante para base (timestamp)\n */\nexport function toBaseDate(variant: DateVariant, value: unknown): DateTimestamp {\n switch (variant) {\n case \"iso\":\n return isoToBase(value as DateIso);\n case \"timestamp\":\n return timestampToBase(value as DateTimestamp);\n case \"epoch\":\n return epochToBase(value as DateEpoch);\n default:\n throw new Error(`Unknown date variant: ${variant}`);\n }\n}\n\n// =============================================================================\n// FROM BASE (de timestamp em ms)\n// =============================================================================\n\n/**\n * Converte timestamp (base) para ISO\n */\nexport function baseToIso(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 * Timestamp já é a base\n */\nexport function baseToTimestamp(base: DateTimestamp): DateTimestamp {\n return base;\n}\n\n/**\n * Converte timestamp (base em ms) para epoch (segundos)\n */\nexport function baseToEpoch(base: DateTimestamp): DateEpoch {\n return Math.floor(base / 1000);\n}\n\n/**\n * Converte base (timestamp) para qualquer variante\n */\nexport function fromBaseDate(variant: DateVariant, base: DateTimestamp): unknown {\n switch (variant) {\n case \"iso\":\n return baseToIso(base);\n case \"timestamp\":\n return baseToTimestamp(base);\n case \"epoch\":\n return baseToEpoch(base);\n default:\n throw new Error(`Unknown date variant: ${variant}`);\n }\n}\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte entre duas variantes de data\n *\n * @param from - Variante de origem\n * @param to - Variante de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertDate('iso', 'epoch', '2024-12-05T19:30:00.000Z'); // 1733425800\n * convertDate('epoch', 'iso', 1733425800); // '2024-12-05T19:30:00.000Z'\n */\nexport function convertDate<TFrom = unknown, TTo = unknown>(\n from: DateVariant,\n to: DateVariant,\n value: TFrom\n): TTo {\n // Otimização: mesma variante\n if (from === to) {\n return value as unknown as TTo;\n }\n\n // Hub-and-spoke: from → base → to\n const base = toBaseDate(from, value);\n return fromBaseDate(to, base) as TTo;\n}\n\n/**\n * Versão safe de convertDate que retorna Result\n */\nexport function tryConvertDate<TFrom = unknown, TTo = unknown>(\n from: DateVariant,\n to: DateVariant,\n value: TFrom\n): Result<TTo> {\n try {\n const result = convertDate<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 FUNCTIONS\n// =============================================================================\n\n/**\n * Converte ISO para timestamp (milissegundos)\n */\nexport function isoToTimestamp(iso: DateIso): DateTimestamp {\n return isoToBase(iso);\n}\n\n/**\n * Converte timestamp (milissegundos) para ISO\n */\nexport function timestampToIso(timestamp: DateTimestamp): DateIso {\n return baseToIso(timestamp);\n}\n\n/**\n * Converte ISO para epoch (segundos)\n */\nexport function isoToEpoch(iso: DateIso): DateEpoch {\n return baseToEpoch(isoToBase(iso));\n}\n\n/**\n * Converte epoch (segundos) para ISO\n */\nexport function epochToIso(epoch: DateEpoch): DateIso {\n return baseToIso(epochToBase(epoch));\n}\n\n/**\n * Converte timestamp (milissegundos) para epoch (segundos)\n */\nexport function timestampToEpoch(timestamp: DateTimestamp): DateEpoch {\n return baseToEpoch(timestamp);\n}\n\n/**\n * Converte epoch (segundos) para timestamp (milissegundos)\n */\nexport function epochToTimestamp(epoch: DateEpoch): DateTimestamp {\n return epochToBase(epoch);\n}\n\n// =============================================================================\n// NOW HELPERS\n// =============================================================================\n\n/**\n * Retorna o timestamp atual em milissegundos\n */\nexport function nowTimestamp(): DateTimestamp {\n return Date.now();\n}\n\n/**\n * Retorna o epoch atual em segundos\n */\nexport function nowEpoch(): DateEpoch {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Retorna a data/hora atual em ISO\n */\nexport function nowIso(): DateIso {\n return new Date().toISOString();\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se variante existe\n */\nexport function hasDateVariant(variant: string): variant is DateVariant {\n return DATE_VARIANTS.includes(variant as DateVariant);\n}\n\n/**\n * Retorna lista de variantes\n */\nexport function getDateVariants(): DateVariant[] {\n return [...DATE_VARIANTS];\n}\n","/**\n * Area Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castArea, castAreaStrict, detectAreaUnit } from '@attrx/role-morphic/area/cast';\n *\n * castArea('100 ha', 'hectare'); // 100\n * castArea('100 ha', 'acre'); // 247.105... (converte)\n * castAreaStrict('100 ha'); // 100 (não converte)\n * detectAreaUnit('100 hectares'); // 'hectare'\n */\n\nimport { AREA_UNITS, AREA_ALIASES, type AreaUnit } from \"./constants\";\nimport { convertArea } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castArea(100, 'hectare'); // 100\n * castArea('100', 'hectare'); // 100\n * castArea('100 ha', 'hectare'); // 100\n * castArea('100 ha', 'acre'); // 247.105... (converte)\n * castArea('100 acres', 'hectare'); // 40.4686... (converte)\n * castArea('invalid', 'hectare'); // null\n */\nexport function castArea(\n input: unknown,\n targetVariant: AreaUnit = \"square_meter\"\n): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n return parseAreaString(input, targetVariant);\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castAreaStrict('100 ha'); // 100 (ignora unidade, não converte)\n * castAreaStrict('100'); // 100\n * castAreaStrict(100); // 100\n */\nexport function castAreaStrict(input: unknown): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n const numValue = parseNumber(input);\n return numValue;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castArea que retorna Result\n */\nexport function tryCastArea(\n input: unknown,\n targetVariant: AreaUnit = \"square_meter\"\n): Result<number> {\n const result = castArea(input, targetVariant);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to area:${targetVariant}`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de área a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectAreaUnit('100 ha'); // 'hectare'\n * detectAreaUnit('100 hectares'); // 'hectare'\n * detectAreaUnit('100 m²'); // 'square_meter'\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 detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseAreaString(input: string, targetVariant: AreaUnit): 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 const [, numStr, unitStr] = match;\n\n // Normaliza número\n const numValue = parseNumber(numStr);\n if (numValue === null) {\n return null;\n }\n\n // Se tem unidade no input, converte se necessário\n const cleanUnitStr = unitStr.trim();\n if (cleanUnitStr) {\n const detectedUnit = detectUnit(cleanUnitStr);\n if (detectedUnit && detectedUnit !== targetVariant) {\n // Converte da unidade detectada para a target\n return convertArea(detectedUnit, targetVariant, numValue);\n }\n }\n\n return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction 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 */\nfunction detectUnit(unitStr: string): AreaUnit | null {\n const normalized = unitStr.toLowerCase().trim();\n\n // Checa aliases primeiro\n if (normalized in AREA_ALIASES) {\n return AREA_ALIASES[normalized] as AreaUnit;\n }\n\n // Checa símbolos e nomes\n for (const [variant, config] of Object.entries(AREA_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 as AreaUnit;\n }\n }\n\n return null;\n}\n","/**\n * Length Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castLength, castLengthStrict, detectLengthUnit } from '@attrx/role-morphic/length/cast';\n *\n * castLength('100 km', 'kilometer'); // 100\n * castLength('100 km', 'mile'); // 62.1371... (converte)\n * castLengthStrict('100 km'); // 100 (não converte)\n * detectLengthUnit('100 meters'); // 'meter'\n */\n\nimport { LENGTH_UNITS, LENGTH_ALIASES, type LengthUnit } from \"./constants\";\nimport { convertLength } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castLength(100, 'meter'); // 100\n * castLength('100', 'meter'); // 100\n * castLength('100 km', 'kilometer'); // 100\n * castLength('100 km', 'mile'); // 62.1371... (converte)\n * castLength('1 mile', 'kilometer'); // 1.609344 (converte)\n * castLength('invalid', 'meter'); // null\n */\nexport function castLength(\n input: unknown,\n targetVariant: LengthUnit = \"meter\"\n): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n return parseLengthString(input, targetVariant);\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castLengthStrict('100 km'); // 100 (ignora unidade, não converte)\n * castLengthStrict('100'); // 100\n * castLengthStrict(100); // 100\n */\nexport function castLengthStrict(input: unknown): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n const numValue = parseNumber(input);\n return numValue;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castLength que retorna Result\n */\nexport function tryCastLength(\n input: unknown,\n targetVariant: LengthUnit = \"meter\"\n): Result<number> {\n const result = castLength(input, targetVariant);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to length:${targetVariant}`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de comprimento a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectLengthUnit('100 km'); // 'kilometer'\n * detectLengthUnit('100 meters'); // 'meter'\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 detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseLengthString(input: string, targetVariant: LengthUnit): 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 const [, numStr, unitStr] = match;\n\n // Normaliza número\n const numValue = parseNumber(numStr);\n if (numValue === null) {\n return null;\n }\n\n // Se tem unidade no input, converte se necessário\n const cleanUnitStr = unitStr.trim();\n if (cleanUnitStr) {\n const detectedUnit = detectUnit(cleanUnitStr);\n if (detectedUnit && detectedUnit !== targetVariant) {\n // Converte da unidade detectada para a target\n return convertLength(detectedUnit, targetVariant, numValue);\n }\n }\n\n return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction 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 */\nfunction detectUnit(unitStr: string): LengthUnit | null {\n const normalized = unitStr.toLowerCase().trim();\n\n // Checa aliases primeiro\n if (normalized in LENGTH_ALIASES) {\n return LENGTH_ALIASES[normalized] as LengthUnit;\n }\n\n // Checa símbolos e nomes\n for (const [variant, config] of Object.entries(LENGTH_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 as LengthUnit;\n }\n }\n\n return null;\n}\n","/**\n * Mass Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castMass, castMassStrict, detectMassUnit } from '@attrx/role-morphic/mass/cast';\n *\n * castMass('100 kg', 'kilogram'); // 100\n * castMass('100 lb', 'kilogram'); // 45.359237 (converte)\n * castMassStrict('100 kg'); // 100 (não converte)\n * detectMassUnit('100 pounds'); // 'pound'\n */\n\nimport { MASS_UNITS, MASS_ALIASES, type MassUnit } from \"./constants\";\nimport { convertMass } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castMass(100, 'kilogram'); // 100\n * castMass('100', 'kilogram'); // 100\n * castMass('100 kg', 'kilogram'); // 100\n * castMass('100 lb', 'kilogram'); // 45.359237 (converte)\n * castMass('100 pounds', 'gram'); // 45359.237 (converte)\n * castMass('invalid', 'kilogram'); // null\n */\nexport function castMass(\n input: unknown,\n targetVariant: MassUnit = \"kilogram\"\n): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n return parseMassString(input, targetVariant);\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castMassStrict('100 kg'); // 100 (ignora unidade, não converte)\n * castMassStrict('100'); // 100\n * castMassStrict(100); // 100\n */\nexport function castMassStrict(input: unknown): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n const numValue = parseNumber(input);\n return numValue;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castMass que retorna Result\n */\nexport function tryCastMass(\n input: unknown,\n targetVariant: MassUnit = \"kilogram\"\n): Result<number> {\n const result = castMass(input, targetVariant);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to mass:${targetVariant}`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de massa a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectMassUnit('100 kg'); // 'kilogram'\n * detectMassUnit('100 pounds'); // 'pound'\n * detectMassUnit('100 oz'); // 'ounce'\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 detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseMassString(input: string, targetVariant: MassUnit): 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 const [, numStr, unitStr] = match;\n\n // Normaliza número\n const numValue = parseNumber(numStr);\n if (numValue === null) {\n return null;\n }\n\n // Se tem unidade no input, converte se necessário\n const cleanUnitStr = unitStr.trim();\n if (cleanUnitStr) {\n const detectedUnit = detectUnit(cleanUnitStr);\n if (detectedUnit && detectedUnit !== targetVariant) {\n // Converte da unidade detectada para a target\n return convertMass(detectedUnit, targetVariant, numValue);\n }\n }\n\n return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction 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 */\nfunction detectUnit(unitStr: string): MassUnit | null {\n const normalized = unitStr.toLowerCase().trim();\n\n // Checa aliases primeiro\n if (normalized in MASS_ALIASES) {\n return MASS_ALIASES[normalized] as MassUnit;\n }\n\n // Checa símbolos e nomes\n for (const [variant, config] of Object.entries(MASS_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 as MassUnit;\n }\n }\n\n return null;\n}\n","/**\n * Temperature Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castTemperature, castTemperatureStrict, detectTemperatureUnit } from '@attrx/role-morphic/temperature/cast';\n *\n * castTemperature('100 °C', 'celsius'); // 100\n * castTemperature('32 °F', 'celsius'); // 0 (converte)\n * castTemperatureStrict('100 °C'); // 100 (não converte)\n * detectTemperatureUnit('100 degrees F'); // 'fahrenheit'\n */\n\nimport { TEMPERATURE_UNITS, TEMPERATURE_ALIASES, type TemperatureUnit } from \"./constants\";\nimport { convertTemperature } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castTemperature(100, 'celsius'); // 100\n * castTemperature('100', 'celsius'); // 100\n * castTemperature('100 °C', 'celsius'); // 100\n * castTemperature('32 °F', 'celsius'); // 0 (converte F → C)\n * castTemperature('273.15 K', 'celsius'); // 0 (converte K → C)\n * castTemperature('invalid', 'celsius'); // null\n */\nexport function castTemperature(\n input: unknown,\n targetVariant: TemperatureUnit = \"celsius\"\n): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n return parseTemperatureString(input, targetVariant);\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castTemperatureStrict('100 °C'); // 100 (ignora unidade, não converte)\n * castTemperatureStrict('100'); // 100\n * castTemperatureStrict(100); // 100\n */\nexport function castTemperatureStrict(input: unknown): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n const numValue = parseNumber(input);\n return numValue;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castTemperature que retorna Result\n */\nexport function tryCastTemperature(\n input: unknown,\n targetVariant: TemperatureUnit = \"celsius\"\n): Result<number> {\n const result = castTemperature(input, targetVariant);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to temperature:${targetVariant}`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de temperatura a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectTemperatureUnit('100 °C'); // 'celsius'\n * detectTemperatureUnit('100 degrees F'); // 'fahrenheit'\n * detectTemperatureUnit('273 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 detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseTemperatureString(input: string, targetVariant: TemperatureUnit): 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 const [, numStr, unitStr] = match;\n\n // Normaliza número\n const numValue = parseNumber(numStr);\n if (numValue === null) {\n return null;\n }\n\n // Se tem unidade no input, converte se necessário\n const cleanUnitStr = unitStr.trim();\n if (cleanUnitStr) {\n const detectedUnit = detectUnit(cleanUnitStr);\n if (detectedUnit && detectedUnit !== targetVariant) {\n // Converte da unidade detectada para a target\n return convertTemperature(detectedUnit, targetVariant, numValue);\n }\n }\n\n return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction 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 */\nfunction detectUnit(unitStr: string): TemperatureUnit | null {\n const normalized = unitStr.toLowerCase().trim();\n\n // Checa aliases primeiro\n if (normalized in TEMPERATURE_ALIASES) {\n return TEMPERATURE_ALIASES[normalized] as TemperatureUnit;\n }\n\n // Checa símbolos e nomes\n for (const [variant, config] of Object.entries(TEMPERATURE_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 as TemperatureUnit;\n }\n }\n\n return null;\n}\n","/**\n * Volume Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castVolume, castVolumeStrict, detectVolumeUnit } from '@attrx/role-morphic/volume/cast';\n *\n * castVolume('500 ml', 'liter'); // 0.5 (converte)\n * castVolume('1 gal', 'liter'); // 3.785411784 (converte)\n * castVolumeStrict('500 ml'); // 500 (não converte)\n * detectVolumeUnit('2 gallons'); // 'gallon_us'\n */\n\nimport { VOLUME_UNITS, VOLUME_ALIASES, type VolumeUnit } from \"./constants\";\nimport { convertVolume } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castVolume(100, 'liter'); // 100\n * castVolume('100', 'liter'); // 100\n * castVolume('500 ml', 'liter'); // 0.5 (converte)\n * castVolume('1 gal', 'liter'); // 3.785411784 (converte)\n * castVolume('invalid', 'liter'); // null\n */\nexport function castVolume(\n input: unknown,\n targetVariant: VolumeUnit = \"liter\"\n): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n return parseVolumeString(input, targetVariant);\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castVolumeStrict('500 ml'); // 500 (ignora unidade, não converte)\n * castVolumeStrict('100'); // 100\n * castVolumeStrict(100); // 100\n */\nexport function castVolumeStrict(input: unknown): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n const numValue = parseNumber(input);\n return numValue;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castVolume que retorna Result\n */\nexport function tryCastVolume(\n input: unknown,\n targetVariant: VolumeUnit = \"liter\"\n): Result<number> {\n const result = castVolume(input, targetVariant);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to volume:${targetVariant}`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de volume a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectVolumeUnit('500 ml'); // 'milliliter'\n * detectVolumeUnit('2 gallons'); // 'gallon_us'\n * detectVolumeUnit('1 L'); // 'liter'\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 detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseVolumeString(input: string, targetVariant: VolumeUnit): 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 const [, numStr, unitStr] = match;\n\n // Normaliza número\n const numValue = parseNumber(numStr);\n if (numValue === null) {\n return null;\n }\n\n // Se tem unidade no input, converte se necessário\n const cleanUnitStr = unitStr.trim();\n if (cleanUnitStr) {\n const detectedUnit = detectUnit(cleanUnitStr);\n if (detectedUnit && detectedUnit !== targetVariant) {\n // Converte da unidade detectada para a target\n return convertVolume(detectedUnit, targetVariant, numValue);\n }\n }\n\n return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction 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 */\nfunction detectUnit(unitStr: string): VolumeUnit | null {\n const normalized = unitStr.toLowerCase().trim();\n\n // Checa aliases primeiro\n if (normalized in VOLUME_ALIASES) {\n return VOLUME_ALIASES[normalized] as VolumeUnit;\n }\n\n // Checa símbolos e nomes\n for (const [variant, config] of Object.entries(VOLUME_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 as VolumeUnit;\n }\n }\n\n return null;\n}\n","/**\n * Speed Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castSpeed, castSpeedStrict, detectSpeedUnit } from '@attrx/role-morphic/speed/cast';\n *\n * castSpeed('100 km/h', 'meter_per_second'); // 27.7778... (converte)\n * castSpeed('60 mph', 'kilometer_per_hour'); // 96.5606... (converte)\n * castSpeedStrict('100 km/h'); // 100 (não converte)\n * detectSpeedUnit('60 miles per hour'); // 'mile_per_hour'\n */\n\nimport { SPEED_UNITS, SPEED_ALIASES, type SpeedUnit } from \"./constants\";\nimport { convertSpeed } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castSpeed(100, 'meter_per_second'); // 100\n * castSpeed('100', 'meter_per_second'); // 100\n * castSpeed('100 km/h', 'meter_per_second'); // 27.7778... (converte)\n * castSpeed('60 mph', 'kilometer_per_hour'); // 96.5606... (converte)\n * castSpeed('invalid', 'meter_per_second'); // null\n */\nexport function castSpeed(\n input: unknown,\n targetVariant: SpeedUnit = \"meter_per_second\"\n): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n return parseSpeedString(input, targetVariant);\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castSpeedStrict('100 km/h'); // 100 (ignora unidade, não converte)\n * castSpeedStrict('100'); // 100\n * castSpeedStrict(100); // 100\n */\nexport function castSpeedStrict(input: unknown): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n const numValue = parseNumber(input);\n return numValue;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castSpeed que retorna Result\n */\nexport function tryCastSpeed(\n input: unknown,\n targetVariant: SpeedUnit = \"meter_per_second\"\n): Result<number> {\n const result = castSpeed(input, targetVariant);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to speed:${targetVariant}`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de velocidade a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectSpeedUnit('100 km/h'); // 'kilometer_per_hour'\n * detectSpeedUnit('60 mph'); // 'mile_per_hour'\n * detectSpeedUnit('10 knots'); // 'knot'\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 detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseSpeedString(input: string, targetVariant: SpeedUnit): 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 const [, numStr, unitStr] = match;\n\n // Normaliza número\n const numValue = parseNumber(numStr);\n if (numValue === null) {\n return null;\n }\n\n // Se tem unidade no input, converte se necessário\n const cleanUnitStr = unitStr.trim();\n if (cleanUnitStr) {\n const detectedUnit = detectUnit(cleanUnitStr);\n if (detectedUnit && detectedUnit !== targetVariant) {\n // Converte da unidade detectada para a target\n return convertSpeed(detectedUnit, targetVariant, numValue);\n }\n }\n\n return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction 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 */\nfunction detectUnit(unitStr: string): SpeedUnit | null {\n const normalized = unitStr.toLowerCase().trim();\n\n // Checa aliases primeiro\n if (normalized in SPEED_ALIASES) {\n return SPEED_ALIASES[normalized] as SpeedUnit;\n }\n\n // Checa símbolos e nomes\n for (const [variant, config] of Object.entries(SPEED_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 as SpeedUnit;\n }\n }\n\n return null;\n}\n","/**\n * Energy Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castEnergy, castEnergyStrict, detectEnergyUnit } from '@attrx/role-morphic/energy/cast';\n *\n * castEnergy('100 kWh', 'kilowatt_hour'); // 100\n * castEnergy('100 BTU', 'joule'); // 105505.59 (converte)\n * castEnergyStrict('100 kWh'); // 100 (não converte)\n * detectEnergyUnit('100 kilocalories'); // 'kilocalorie'\n */\n\nimport { ENERGY_UNITS, ENERGY_ALIASES, type EnergyUnit } from \"./constants\";\nimport { convertEnergy } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castEnergy(100, 'joule'); // 100\n * castEnergy('100', 'joule'); // 100\n * castEnergy('100 kWh', 'kilowatt_hour'); // 100\n * castEnergy('100 BTU', 'joule'); // 105505.59 (converte)\n * castEnergy('1 kcal', 'kilojoule'); // 4.1868 (converte)\n * castEnergy('invalid', 'joule'); // null\n */\nexport function castEnergy(\n input: unknown,\n targetVariant: EnergyUnit = \"joule\"\n): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n return parseEnergyString(input, targetVariant);\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castEnergyStrict('100 kWh'); // 100 (ignora unidade, não converte)\n * castEnergyStrict('100'); // 100\n * castEnergyStrict(100); // 100\n */\nexport function castEnergyStrict(input: unknown): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n const numValue = parseNumber(input);\n return numValue;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castEnergy que retorna Result\n */\nexport function tryCastEnergy(\n input: unknown,\n targetVariant: EnergyUnit = \"joule\"\n): Result<number> {\n const result = castEnergy(input, targetVariant);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to energy:${targetVariant}`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de energia a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectEnergyUnit('100 kWh'); // 'kilowatt_hour'\n * detectEnergyUnit('100 kilocalories'); // 'kilocalorie'\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 detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseEnergyString(input: string, targetVariant: EnergyUnit): 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 const [, numStr, unitStr] = match;\n\n // Normaliza número\n const numValue = parseNumber(numStr);\n if (numValue === null) {\n return null;\n }\n\n // Se tem unidade no input, converte se necessário\n const cleanUnitStr = unitStr.trim();\n if (cleanUnitStr) {\n const detectedUnit = detectUnit(cleanUnitStr);\n if (detectedUnit && detectedUnit !== targetVariant) {\n // Converte da unidade detectada para a target\n return convertEnergy(detectedUnit, targetVariant, numValue);\n }\n }\n\n return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction 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 */\nfunction detectUnit(unitStr: string): EnergyUnit | null {\n const normalized = unitStr.toLowerCase().trim();\n\n // Checa aliases primeiro\n if (normalized in ENERGY_ALIASES) {\n return ENERGY_ALIASES[normalized] as EnergyUnit;\n }\n\n // Checa símbolos e nomes\n for (const [variant, config] of Object.entries(ENERGY_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 as EnergyUnit;\n }\n }\n\n return null;\n}\n","/**\n * Power Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castPower, castPowerStrict, detectPowerUnit } from '@attrx/role-morphic/power/cast';\n *\n * castPower('100 kW'); // 100000 (converted to watts)\n * castPower('100 kW', 'kilowatt'); // 100 (kept as kilowatts)\n * castPowerStrict('100'); // 100 (no conversion)\n * detectPowerUnit('100 hp'); // 'horsepower_mechanical'\n */\n\nimport { POWER_UNITS, POWER_ALIASES, type PowerUnit } from \"./constants\";\nimport { convertPower, POWER_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: watt)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castPower('100 kW'); // 100000 (watts)\n * castPower('100 kW', 'kilowatt'); // 100\n * castPower('100'); // 100\n * castPower(100); // 100\n * castPower('invalid'); // null\n */\nexport function castPower(\n input: unknown,\n targetVariant: PowerUnit = POWER_BASE,\n): number | null {\n // Already a number\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String parsing\n if (typeof input === \"string\") {\n const parsed = parsePowerString(input);\n if (parsed === null) {\n return null;\n }\n\n // If unit was detected and differs from target, convert\n if (parsed.unit && parsed.unit !== targetVariant) {\n return convertPower(parsed.unit, targetVariant, parsed.value);\n }\n\n return parsed.value;\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castPowerStrict('100 kW'); // 100 (ignora a unidade)\n * castPowerStrict('100'); // 100\n */\nexport function castPowerStrict(input: unknown): number | null {\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n if (typeof input === \"string\") {\n const parsed = parsePowerString(input);\n return parsed?.value ?? null;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castPower que retorna Result\n */\nexport function tryCastPower(\n input: unknown,\n targetVariant: PowerUnit = POWER_BASE,\n): Result<number> {\n const result = castPower(input, targetVariant);\n if (result === null) {\n return { ok: false, error: `Cannot cast \"${String(input)}\" to power` };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de potência de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\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\n // Extract unit part (after the number)\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n if (!unitStr) {\n return null;\n }\n\n // Check direct unit names\n if (unitStr in POWER_UNITS) {\n return unitStr as PowerUnit;\n }\n\n // Check aliases\n if (unitStr in POWER_ALIASES) {\n return POWER_ALIASES[unitStr] as PowerUnit;\n }\n\n // Check symbols (case-sensitive for some)\n for (const [unit, config] of Object.entries(POWER_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr) {\n return unit as PowerUnit;\n }\n }\n\n return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedPower {\n value: number;\n unit: PowerUnit | null;\n}\n\n/**\n * Parseia string de potência extraindo valor e unidade\n */\nfunction parsePowerString(input: string): ParsedPower | null {\n const trimmed = input.trim();\n if (!trimmed) {\n return null;\n }\n\n // Try to extract number and unit\n const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n\n const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n const value = parseFloat(numStr);\n\n if (isNaN(value) || !Number.isFinite(value)) {\n return null;\n }\n\n const unitStr = match[2]?.trim().toLowerCase() || \"\";\n let unit: PowerUnit | null = null;\n\n if (unitStr) {\n // Check aliases first\n if (unitStr in POWER_ALIASES) {\n unit = POWER_ALIASES[unitStr] as PowerUnit;\n }\n // Check direct unit names\n else if (unitStr in POWER_UNITS) {\n unit = unitStr as PowerUnit;\n }\n // Check symbols\n else {\n for (const [u, config] of Object.entries(POWER_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr) {\n unit = u as PowerUnit;\n break;\n }\n }\n }\n }\n\n return { value, unit };\n}\n","/**\n * Pressure Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castPressure, castPressureStrict, detectPressureUnit } from '@attrx/role-morphic/pressure/cast';\n *\n * castPressure('1 bar'); // 100000 (converted to pascals)\n * castPressure('1 bar', 'bar'); // 1 (kept as bar)\n * castPressureStrict('100'); // 100 (no conversion)\n * detectPressureUnit('14.7 psi'); // 'psi'\n */\n\nimport { PRESSURE_UNITS, PRESSURE_ALIASES, type PressureUnit } from \"./constants\";\nimport { convertPressure, PRESSURE_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: pascal)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castPressure('1 bar'); // 100000 (pascals)\n * castPressure('1 bar', 'bar'); // 1\n * castPressure('100'); // 100\n * castPressure(100); // 100\n * castPressure('invalid'); // null\n */\nexport function castPressure(\n input: unknown,\n targetVariant: PressureUnit = PRESSURE_BASE,\n): number | null {\n // Already a number\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String parsing\n if (typeof input === \"string\") {\n const parsed = parsePressureString(input);\n if (parsed === null) {\n return null;\n }\n\n // If unit was detected and differs from target, convert\n if (parsed.unit && parsed.unit !== targetVariant) {\n return convertPressure(parsed.unit, targetVariant, parsed.value);\n }\n\n return parsed.value;\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castPressureStrict('100 bar'); // 100 (ignora a unidade)\n * castPressureStrict('100'); // 100\n */\nexport function castPressureStrict(input: unknown): number | null {\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n if (typeof input === \"string\") {\n const parsed = parsePressureString(input);\n return parsed?.value ?? null;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castPressure que retorna Result\n */\nexport function tryCastPressure(\n input: unknown,\n targetVariant: PressureUnit = PRESSURE_BASE,\n): Result<number> {\n const result = castPressure(input, targetVariant);\n if (result === null) {\n return { ok: false, error: `Cannot cast \"${String(input)}\" to pressure` };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de pressão de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\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\n // Extract unit part (after the number)\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n if (!unitStr) {\n return null;\n }\n\n // Check direct unit names\n if (unitStr in PRESSURE_UNITS) {\n return unitStr as PressureUnit;\n }\n\n // Check aliases\n if (unitStr in PRESSURE_ALIASES) {\n return PRESSURE_ALIASES[unitStr] as PressureUnit;\n }\n\n // Check symbols (case-sensitive for some)\n for (const [unit, config] of Object.entries(PRESSURE_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr) {\n return unit as PressureUnit;\n }\n }\n\n return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedPressure {\n value: number;\n unit: PressureUnit | null;\n}\n\n/**\n * Parseia string de pressão extraindo valor e unidade\n */\nfunction parsePressureString(input: string): ParsedPressure | null {\n const trimmed = input.trim();\n if (!trimmed) {\n return null;\n }\n\n // Try to extract number and unit\n const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n\n const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n const value = parseFloat(numStr);\n\n if (isNaN(value) || !Number.isFinite(value)) {\n return null;\n }\n\n const unitStr = match[2]?.trim().toLowerCase() || \"\";\n let unit: PressureUnit | null = null;\n\n if (unitStr) {\n // Check aliases first\n if (unitStr in PRESSURE_ALIASES) {\n unit = PRESSURE_ALIASES[unitStr] as PressureUnit;\n }\n // Check direct unit names\n else if (unitStr in PRESSURE_UNITS) {\n unit = unitStr as PressureUnit;\n }\n // Check symbols\n else {\n for (const [u, config] of Object.entries(PRESSURE_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr) {\n unit = u as PressureUnit;\n break;\n }\n }\n }\n }\n\n return { value, unit };\n}\n","/**\n * Frequency Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castFrequency, castFrequencyStrict, detectFrequencyUnit } from '@attrx/role-morphic/frequency/cast';\n *\n * castFrequency('2.4 GHz'); // 2400000000 (converted to hertz)\n * castFrequency('2.4 GHz', 'gigahertz'); // 2.4 (kept as gigahertz)\n * castFrequencyStrict('100'); // 100 (no conversion)\n * detectFrequencyUnit('3600 rpm'); // 'rpm'\n */\n\nimport { FREQUENCY_UNITS, FREQUENCY_ALIASES, type FrequencyUnit } from \"./constants\";\nimport { convertFrequency, FREQUENCY_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: hertz)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castFrequency('2.4 GHz'); // 2400000000 (hertz)\n * castFrequency('2.4 GHz', 'gigahertz'); // 2.4\n * castFrequency('100'); // 100\n * castFrequency(100); // 100\n * castFrequency('invalid'); // null\n */\nexport function castFrequency(\n input: unknown,\n targetVariant: FrequencyUnit = FREQUENCY_BASE,\n): number | null {\n // Already a number\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String parsing\n if (typeof input === \"string\") {\n const parsed = parseFrequencyString(input);\n if (parsed === null) {\n return null;\n }\n\n // If unit was detected and differs from target, convert\n if (parsed.unit && parsed.unit !== targetVariant) {\n return convertFrequency(parsed.unit, targetVariant, parsed.value);\n }\n\n return parsed.value;\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castFrequencyStrict('100 MHz'); // 100 (ignora a unidade)\n * castFrequencyStrict('100'); // 100\n */\nexport function castFrequencyStrict(input: unknown): number | null {\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n if (typeof input === \"string\") {\n const parsed = parseFrequencyString(input);\n return parsed?.value ?? null;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castFrequency que retorna Result\n */\nexport function tryCastFrequency(\n input: unknown,\n targetVariant: FrequencyUnit = FREQUENCY_BASE,\n): Result<number> {\n const result = castFrequency(input, targetVariant);\n if (result === null) {\n return { ok: false, error: `Cannot cast \"${String(input)}\" to frequency` };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de frequência de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\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\n // Extract unit part (after the number)\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n if (!unitStr) {\n return null;\n }\n\n // Check direct unit names\n if (unitStr in FREQUENCY_UNITS) {\n return unitStr as FrequencyUnit;\n }\n\n // Check aliases\n if (unitStr in FREQUENCY_ALIASES) {\n return FREQUENCY_ALIASES[unitStr] as FrequencyUnit;\n }\n\n // Check symbols (case-sensitive for some)\n for (const [unit, config] of Object.entries(FREQUENCY_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr) {\n return unit as FrequencyUnit;\n }\n }\n\n return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedFrequency {\n value: number;\n unit: FrequencyUnit | null;\n}\n\n/**\n * Parseia string de frequência extraindo valor e unidade\n */\nfunction parseFrequencyString(input: string): ParsedFrequency | null {\n const trimmed = input.trim();\n if (!trimmed) {\n return null;\n }\n\n // Try to extract number and unit\n const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n\n const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n const value = parseFloat(numStr);\n\n if (isNaN(value) || !Number.isFinite(value)) {\n return null;\n }\n\n const unitStr = match[2]?.trim().toLowerCase() || \"\";\n let unit: FrequencyUnit | null = null;\n\n if (unitStr) {\n // Check aliases first\n if (unitStr in FREQUENCY_ALIASES) {\n unit = FREQUENCY_ALIASES[unitStr] as FrequencyUnit;\n }\n // Check direct unit names\n else if (unitStr in FREQUENCY_UNITS) {\n unit = unitStr as FrequencyUnit;\n }\n // Check symbols\n else {\n for (const [u, config] of Object.entries(FREQUENCY_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr) {\n unit = u as FrequencyUnit;\n break;\n }\n }\n }\n }\n\n return { value, unit };\n}\n","/**\n * Angle Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castAngle, castAngleStrict, detectAngleUnit } from '@attrx/role-morphic/angle/cast';\n *\n * castAngle('90°'); // 90 (degrees)\n * castAngle('3.14159 rad', 'degree'); // ~180 (converted to degrees)\n * castAngleStrict('90'); // 90 (no conversion)\n * detectAngleUnit('45°'); // 'degree'\n */\n\nimport { ANGLE_UNITS, ANGLE_ALIASES, type AngleUnit } from \"./constants\";\nimport { convertAngle, ANGLE_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: degree)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castAngle('90°'); // 90\n * castAngle('3.14159 rad', 'degree'); // ~180\n * castAngle('100'); // 100\n * castAngle(45); // 45\n * castAngle('invalid'); // null\n */\nexport function castAngle(\n input: unknown,\n targetVariant: AngleUnit = ANGLE_BASE,\n): number | null {\n // Already a number\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String parsing\n if (typeof input === \"string\") {\n const parsed = parseAngleString(input);\n if (parsed === null) {\n return null;\n }\n\n // If unit was detected and differs from target, convert\n if (parsed.unit && parsed.unit !== targetVariant) {\n return convertAngle(parsed.unit, targetVariant, parsed.value);\n }\n\n return parsed.value;\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castAngleStrict('90°'); // 90 (ignora a unidade)\n * castAngleStrict('100'); // 100\n */\nexport function castAngleStrict(input: unknown): number | null {\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n if (typeof input === \"string\") {\n const parsed = parseAngleString(input);\n return parsed?.value ?? null;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castAngle que retorna Result\n */\nexport function tryCastAngle(\n input: unknown,\n targetVariant: AngleUnit = ANGLE_BASE,\n): Result<number> {\n const result = castAngle(input, targetVariant);\n if (result === null) {\n return { ok: false, error: `Cannot cast \"${String(input)}\" to angle` };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de ângulo de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\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();\n\n // Special case: degree symbol can be directly attached to number\n if (trimmed.endsWith(\"°\")) {\n return \"degree\";\n }\n\n const lowerTrimmed = trimmed.toLowerCase();\n\n // Extract unit part (after the number)\n const match = lowerTrimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n if (!unitStr) {\n return null;\n }\n\n // Check direct unit names\n if (unitStr in ANGLE_UNITS) {\n return unitStr as AngleUnit;\n }\n\n // Check aliases\n if (unitStr in ANGLE_ALIASES) {\n return ANGLE_ALIASES[unitStr] as AngleUnit;\n }\n\n // Check symbols (case-sensitive for some)\n for (const [unit, config] of Object.entries(ANGLE_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr || config.symbol === unitStr) {\n return unit as AngleUnit;\n }\n }\n\n return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedAngle {\n value: number;\n unit: AngleUnit | null;\n}\n\n/**\n * Parseia string de ângulo extraindo valor e unidade\n */\nfunction parseAngleString(input: string): ParsedAngle | null {\n const trimmed = input.trim();\n if (!trimmed) {\n return null;\n }\n\n // Special case: degree symbol directly attached (45°)\n const degreeMatch = trimmed.match(/^([+-]?[\\d.,]+)°$/);\n if (degreeMatch) {\n const numStr = degreeMatch[1].replace(\",\", \".\");\n const value = parseFloat(numStr);\n if (isNaN(value) || !Number.isFinite(value)) {\n return null;\n }\n return { value, unit: \"degree\" };\n }\n\n // Try to extract number and unit\n const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n\n const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n const value = parseFloat(numStr);\n\n if (isNaN(value) || !Number.isFinite(value)) {\n return null;\n }\n\n const unitStr = match[2]?.trim().toLowerCase() || \"\";\n let unit: AngleUnit | null = null;\n\n if (unitStr) {\n // Check aliases first\n if (unitStr in ANGLE_ALIASES) {\n unit = ANGLE_ALIASES[unitStr] as AngleUnit;\n }\n // Check direct unit names\n else if (unitStr in ANGLE_UNITS) {\n unit = unitStr as AngleUnit;\n }\n // Check symbols\n else {\n for (const [u, config] of Object.entries(ANGLE_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr || config.symbol === unitStr) {\n unit = u as AngleUnit;\n break;\n }\n }\n }\n }\n\n return { value, unit };\n}\n","/**\n * Time Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castTime, castTimeStrict, detectTimeUnit } from '@attrx/role-morphic/time/cast';\n *\n * castTime('5 min'); // 300 (converted to seconds)\n * castTime('5 min', 'minute'); // 5 (kept as minutes)\n * castTimeStrict('100'); // 100 (no conversion)\n * detectTimeUnit('2 hours'); // 'hour'\n */\n\nimport { TIME_UNITS, TIME_ALIASES, type TimeUnit } from \"./constants\";\nimport { convertTime, TIME_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: second)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castTime('5 min'); // 300 (seconds)\n * castTime('5 min', 'minute'); // 5\n * castTime('100'); // 100\n * castTime(100); // 100\n * castTime('invalid'); // null\n */\nexport function castTime(\n input: unknown,\n targetVariant: TimeUnit = TIME_BASE,\n): number | null {\n // Already a number\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String parsing\n if (typeof input === \"string\") {\n const parsed = parseTimeString(input);\n if (parsed === null) {\n return null;\n }\n\n // If unit was detected and differs from target, convert\n if (parsed.unit && parsed.unit !== targetVariant) {\n return convertTime(parsed.unit, targetVariant, parsed.value);\n }\n\n return parsed.value;\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castTimeStrict('5 min'); // 5 (ignora a unidade)\n * castTimeStrict('100'); // 100\n */\nexport function castTimeStrict(input: unknown): number | null {\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n if (typeof input === \"string\") {\n const parsed = parseTimeString(input);\n return parsed?.value ?? null;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castTime que retorna Result\n */\nexport function tryCastTime(\n input: unknown,\n targetVariant: TimeUnit = TIME_BASE,\n): Result<number> {\n const result = castTime(input, targetVariant);\n if (result === null) {\n return { ok: false, error: `Cannot cast \"${String(input)}\" to time` };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de tempo de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectTimeUnit('5 min'); // 'minute'\n * detectTimeUnit('2 hours'); // 'hour'\n * detectTimeUnit('100'); // null\n */\nexport function detectTimeUnit(input: string): TimeUnit | null {\n const trimmed = input.trim().toLowerCase();\n\n // Extract unit part (after the number)\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n if (!unitStr) {\n return null;\n }\n\n // Check direct unit names\n if (unitStr in TIME_UNITS) {\n return unitStr as TimeUnit;\n }\n\n // Check aliases\n if (unitStr in TIME_ALIASES) {\n return TIME_ALIASES[unitStr] as TimeUnit;\n }\n\n // Check symbols (case-sensitive for some)\n for (const [unit, config] of Object.entries(TIME_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr) {\n return unit as TimeUnit;\n }\n }\n\n return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedTime {\n value: number;\n unit: TimeUnit | null;\n}\n\n/**\n * Parseia string de tempo extraindo valor e unidade\n */\nfunction parseTimeString(input: string): ParsedTime | null {\n const trimmed = input.trim();\n if (!trimmed) {\n return null;\n }\n\n // Try to extract number and unit\n const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n\n const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n const value = parseFloat(numStr);\n\n if (isNaN(value) || !Number.isFinite(value)) {\n return null;\n }\n\n const unitStr = match[2]?.trim().toLowerCase() || \"\";\n let unit: TimeUnit | null = null;\n\n if (unitStr) {\n // Check aliases first\n if (unitStr in TIME_ALIASES) {\n unit = TIME_ALIASES[unitStr] as TimeUnit;\n }\n // Check direct unit names\n else if (unitStr in TIME_UNITS) {\n unit = unitStr as TimeUnit;\n }\n // Check symbols\n else {\n for (const [u, config] of Object.entries(TIME_UNITS)) {\n if (config.symbol.toLowerCase() === unitStr) {\n unit = u as TimeUnit;\n break;\n }\n }\n }\n }\n\n return { value, unit };\n}\n","/**\n * Digital Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castDigital, castDigitalStrict, detectDigitalUnit } from '@attrx/role-morphic/digital/cast';\n *\n * castDigital('1 MB'); // 1000000 (converted to bytes)\n * castDigital('1 MB', 'megabyte'); // 1 (kept as megabytes)\n * castDigitalStrict('100'); // 100 (no conversion)\n * detectDigitalUnit('2 GiB'); // 'gibibyte'\n */\n\nimport { DIGITAL_UNITS, DIGITAL_ALIASES, type DigitalUnit } from \"./constants\";\nimport { convertDigital, DIGITAL_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: byte)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castDigital('1 MB'); // 1000000 (bytes)\n * castDigital('1 MB', 'megabyte'); // 1\n * castDigital('100'); // 100\n * castDigital(100); // 100\n * castDigital('invalid'); // null\n */\nexport function castDigital(\n input: unknown,\n targetVariant: DigitalUnit = DIGITAL_BASE,\n): number | null {\n // Already a number\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String parsing\n if (typeof input === \"string\") {\n const parsed = parseDigitalString(input);\n if (parsed === null) {\n return null;\n }\n\n // If unit was detected and differs from target, convert\n if (parsed.unit && parsed.unit !== targetVariant) {\n return convertDigital(parsed.unit, targetVariant, parsed.value);\n }\n\n return parsed.value;\n }\n\n return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castDigitalStrict('100 MB'); // 100 (ignora a unidade)\n * castDigitalStrict('100'); // 100\n */\nexport function castDigitalStrict(input: unknown): number | null {\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n if (typeof input === \"string\") {\n const parsed = parseDigitalString(input);\n return parsed?.value ?? null;\n }\n\n return null;\n}\n\n/**\n * Versão safe de castDigital que retorna Result\n */\nexport function tryCastDigital(\n input: unknown,\n targetVariant: DigitalUnit = DIGITAL_BASE,\n): Result<number> {\n const result = castDigital(input, targetVariant);\n if (result === null) {\n return { ok: false, error: `Cannot cast \"${String(input)}\" to digital storage` };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de armazenamento digital de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectDigitalUnit('100 MB'); // 'megabyte'\n * detectDigitalUnit('2 GiB'); // 'gibibyte'\n * detectDigitalUnit('100'); // null\n */\nexport function detectDigitalUnit(input: string): DigitalUnit | null {\n const trimmed = input.trim();\n\n // Extract unit part (after the number)\n const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n if (!match || !match[1]) {\n return null;\n }\n\n const unitStr = match[1].trim();\n if (!unitStr) {\n return null;\n }\n\n const lowerUnitStr = unitStr.toLowerCase();\n\n // Check direct unit names\n if (lowerUnitStr in DIGITAL_UNITS) {\n return lowerUnitStr as DigitalUnit;\n }\n\n // Check aliases (case-sensitive for IEC units like KiB, MiB)\n if (unitStr in DIGITAL_ALIASES) {\n return DIGITAL_ALIASES[unitStr] as DigitalUnit;\n }\n if (lowerUnitStr in DIGITAL_ALIASES) {\n return DIGITAL_ALIASES[lowerUnitStr] as DigitalUnit;\n }\n\n // Check symbols\n for (const [unit, config] of Object.entries(DIGITAL_UNITS)) {\n if (config.symbol === unitStr || config.symbol.toLowerCase() === lowerUnitStr) {\n return unit as DigitalUnit;\n }\n }\n\n return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedDigital {\n value: number;\n unit: DigitalUnit | null;\n}\n\n/**\n * Parseia string de armazenamento digital extraindo valor e unidade\n */\nfunction parseDigitalString(input: string): ParsedDigital | null {\n const trimmed = input.trim();\n if (!trimmed) {\n return null;\n }\n\n // Try to extract number and unit\n const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n\n const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n const value = parseFloat(numStr);\n\n if (isNaN(value) || !Number.isFinite(value)) {\n return null;\n }\n\n const unitStr = match[2]?.trim() || \"\";\n const lowerUnitStr = unitStr.toLowerCase();\n let unit: DigitalUnit | null = null;\n\n if (unitStr) {\n // Check aliases (case-sensitive for IEC)\n if (unitStr in DIGITAL_ALIASES) {\n unit = DIGITAL_ALIASES[unitStr] as DigitalUnit;\n } else if (lowerUnitStr in DIGITAL_ALIASES) {\n unit = DIGITAL_ALIASES[lowerUnitStr] as DigitalUnit;\n }\n // Check direct unit names\n else if (lowerUnitStr in DIGITAL_UNITS) {\n unit = lowerUnitStr as DigitalUnit;\n }\n // Check symbols\n else {\n for (const [u, config] of Object.entries(DIGITAL_UNITS)) {\n if (config.symbol === unitStr || config.symbol.toLowerCase() === lowerUnitStr) {\n unit = u as DigitalUnit;\n break;\n }\n }\n }\n }\n\n return { value, unit };\n}\n","/**\n * Color Role - Cast Pillar\n *\n * Normaliza input sujo para uma variante de cor específica.\n *\n * @example\n * import { castColor, tryCastColor, detectColorFormat } from '@attrx/role-morphic/color/cast';\n *\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 */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject } from \"./types\";\nimport { NAMED_COLORS } from \"./types\";\nimport {\n toBaseColor,\n fromBaseColor,\n hexToRgba,\n rgbObjectToRgba,\n rgbStringToRgba,\n hslObjectToRgba,\n hslStringToRgba,\n} from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// DETECT FORMAT\n// =============================================================================\n\n/**\n * Detecta o formato de uma string de cor\n *\n * @example\n * detectColorFormat('red'); // 'named'\n * detectColorFormat('#ff0000'); // 'hex'\n * detectColorFormat('rgb(255,0,0)'); // 'rgb_string'\n * detectColorFormat('hsl(0,100%,50%)'); // 'hsl_string'\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*\\(/i.test(trimmed)) {\n return \"rgb_string\";\n }\n\n // HSL string\n if (/^hsla?\\s*\\(/i.test(trimmed)) {\n return \"hsl_string\";\n }\n\n return null;\n}\n\n/**\n * Detecta se um objeto é RGB ou HSL\n */\nfunction detectObjectFormat(obj: Record<string, unknown>): \"rgb_object\" | \"hsl_object\" | null {\n if (typeof obj.r === \"number\" && typeof obj.g === \"number\" && typeof obj.b === \"number\") {\n return \"rgb_object\";\n }\n if (typeof obj.h === \"number\" && typeof obj.s === \"number\" && typeof obj.l === \"number\") {\n return \"hsl_object\";\n }\n return null;\n}\n\n// =============================================================================\n// PARSE INPUT\n// =============================================================================\n\n/**\n * Tenta parsear qualquer input para RGBA\n */\nfunction parseToRgba(input: unknown): RGBA | null {\n // Já é RGBA\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"r\" in input &&\n \"g\" in input &&\n \"b\" in input &&\n \"a\" in input\n ) {\n const rgba = input as RGBA;\n if (\n typeof rgba.r === \"number\" &&\n typeof rgba.g === \"number\" &&\n typeof rgba.b === \"number\" &&\n typeof rgba.a === \"number\"\n ) {\n return rgba;\n }\n }\n\n // String\n if (typeof input === \"string\") {\n const trimmed = input.trim();\n\n // Named color\n const namedColor = NAMED_COLORS[trimmed.toLowerCase()];\n if (namedColor) {\n return namedColor;\n }\n\n // Hex\n if (/^#?[0-9a-f]{3,8}$/i.test(trimmed)) {\n try {\n return hexToRgba(trimmed);\n } catch {\n return null;\n }\n }\n\n // RGB string\n if (/^rgba?\\s*\\(/i.test(trimmed)) {\n try {\n return rgbStringToRgba(trimmed);\n } catch {\n return null;\n }\n }\n\n // HSL string\n if (/^hsla?\\s*\\(/i.test(trimmed)) {\n try {\n return hslStringToRgba(trimmed);\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n // Object\n if (typeof input === \"object\" && input !== null) {\n const format = detectObjectFormat(input as Record<string, unknown>);\n\n if (format === \"rgb_object\") {\n try {\n return rgbObjectToRgba(input as ColorRgbObject);\n } catch {\n return null;\n }\n }\n\n if (format === \"hsl_object\") {\n try {\n return hslObjectToRgba(input as ColorHslObject);\n } catch {\n return null;\n }\n }\n }\n\n return null;\n}\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de qualquer input para uma variante de cor\n *\n * @param variant - Variante de destino\n * @param input - Valor de entrada (string, object, etc)\n * @returns Valor na variante de destino ou null se não puder converter\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 * castColor('hex', 'invalid'); // null\n */\nexport function castColor<T = unknown>(variant: ColorVariant, input: unknown): T | null {\n const rgba = parseToRgba(input);\n if (!rgba) {\n return null;\n }\n\n try {\n return fromBaseColor(variant, rgba) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Versão safe de castColor que retorna Result\n */\nexport function tryCastColor<T = unknown>(\n variant: ColorVariant,\n input: unknown,\n): Result<T> {\n const result = castColor<T>(variant, input);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to color variant \"${variant}\"`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Converte hex para RGB object\n */\nexport function hexToRgb(hex: string): ColorRgbObject | null {\n return castColor<ColorRgbObject>(\"rgb_object\", hex);\n}\n\n/**\n * Converte RGB object para hex\n */\nexport function rgbToHex(rgb: ColorRgbObject): string | null {\n return castColor<string>(\"hex\", rgb);\n}\n\n/**\n * Converte hex para HSL object\n */\nexport function hexToHsl(hex: string): ColorHslObject | null {\n return castColor<ColorHslObject>(\"hsl_object\", hex);\n}\n\n/**\n * Converte HSL object para hex\n */\nexport function hslToHex(hsl: ColorHslObject): string | null {\n return castColor<string>(\"hex\", hsl);\n}\n\n/**\n * Converte RGB string para hex\n */\nexport function rgbStringToHex(rgb: string): string | null {\n return castColor<string>(\"hex\", rgb);\n}\n\n/**\n * Converte hex para RGB string\n */\nexport function hexToRgbString(hex: string): string | null {\n return castColor<string>(\"rgb_string\", hex);\n}\n\n/**\n * Converte HSL string para hex\n */\nexport function hslStringToHex(hsl: string): string | null {\n return castColor<string>(\"hex\", hsl);\n}\n\n/**\n * Converte hex para HSL string\n */\nexport function hexToHslString(hex: string): string | null {\n return castColor<string>(\"hsl_string\", hex);\n}\n\n/**\n * Verifica se uma string é uma cor válida (qualquer formato)\n */\nexport function isColorString(value: string): boolean {\n return parseToRgba(value) !== null;\n}\n\n/**\n * Alias para isColorString - verifica se valor é uma cor válida\n * (Mantido para compatibilidade com API anterior)\n */\nexport function isValidColor(value: string): boolean {\n return isColorString(value);\n}\n","/**\n * Date Role - Cast Pillar\n *\n * Normaliza input sujo para o tipo esperado de cada variante.\n *\n * @example\n * import { castDate, castIso, castTimestamp, castEpoch } from '@attrx/role-morphic/date/cast';\n *\n * castDate('iso', '2024-12-05'); // '2024-12-05T00:00:00.000Z'\n * castDate('timestamp', '2024-12-05'); // 1733356800000\n * castDate('epoch', new Date()); // 1733425800\n */\n\nimport type { DateVariant, DateIso, DateTimestamp, DateEpoch } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST ISO\n// =============================================================================\n\n/**\n * Faz cast de input para ISO string\n *\n * @example\n * castIso('2024-12-05'); // '2024-12-05T00:00:00.000Z'\n * castIso(1733425800000); // '2024-12-05T19:30:00.000Z'\n * castIso(new Date()); // ISO string da data atual\n */\nexport function castIso(input: unknown): DateIso | null {\n // Já é string\n if (typeof input === \"string\") {\n const trimmed = input.trim();\n const date = new Date(trimmed);\n if (!isNaN(date.getTime())) {\n return date.toISOString();\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// CAST TIMESTAMP\n// =============================================================================\n\n/**\n * Faz cast de input para timestamp (milissegundos)\n *\n * @example\n * castTimestamp('2024-12-05T19:30:00.000Z'); // 1733425800000\n * castTimestamp('1733425800000'); // 1733425800000\n * castTimestamp(new Date()); // timestamp atual\n */\nexport function castTimestamp(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\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// CAST EPOCH\n// =============================================================================\n\n/**\n * Faz cast de input para epoch (segundos)\n *\n * Detecta automaticamente se o input é milissegundos (> 1e11) e converte.\n *\n * @example\n * castEpoch('2024-12-05T19:30:00.000Z'); // 1733425800\n * castEpoch(1733425800000); // 1733425800 (detecta ms)\n * castEpoch(1733425800); // 1733425800\n * castEpoch(new Date()); // epoch atual\n */\nexport function castEpoch(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 (> 1e11), 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\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 (> 1e11), 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// MAIN CAST\n// =============================================================================\n\n/**\n * Faz cast de input para uma variante de data\n *\n * @param variant - Variante de destino (\"iso\", \"timestamp\", \"epoch\")\n * @param input - Valor de entrada\n * @returns Valor convertido ou null se não for possível\n *\n * @example\n * castDate('iso', '2024-12-05'); // '2024-12-05T00:00:00.000Z'\n * castDate('timestamp', new Date()); // timestamp atual\n * castDate('epoch', '2024-12-05'); // 1733356800\n */\nexport function castDate<T = unknown>(variant: DateVariant, input: unknown): T | null {\n switch (variant) {\n case \"iso\":\n return castIso(input) as T | null;\n case \"timestamp\":\n return castTimestamp(input) as T | null;\n case \"epoch\":\n return castEpoch(input) as T | null;\n default:\n return null;\n }\n}\n\n/**\n * Versão safe de castDate que retorna Result\n */\nexport function tryCastDate<T = unknown>(\n variant: DateVariant,\n input: unknown\n): Result<T> {\n const result = castDate<T>(variant, input);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to date variant \"${variant}\"`,\n };\n }\n return { ok: true, value: result };\n}\n\n/**\n * Detecta se um valor parece ser um timestamp em milissegundos ou segundos\n *\n * @returns \"timestamp\" se > 1e11, \"epoch\" caso contrário, null se não for número\n */\nexport function detectDateNumericVariant(value: unknown): \"timestamp\" | \"epoch\" | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n\n // Timestamps em ms geralmente são > 1e12 (após ano 2001)\n // Epochs em segundos são tipicamente < 1e11\n return Math.abs(value) > 1e11 ? \"timestamp\" : \"epoch\";\n}\n","/**\n * Currency Role - Cast Pillar\n *\n * Normaliza input monetário sujo para número.\n * Extrai o valor numérico de strings formatadas como moeda.\n *\n * NÃO infere a moeda - apenas extrai o valor numérico.\n * A moeda deve ser conhecida via metadata.\n *\n * @example\n * import { castCurrency, castCurrencyStrict } from '@attrx/role-morphic/currency/cast';\n *\n * castCurrency('R$ 1.500,50'); // 1500.50\n * castCurrency('$1,000.00'); // 1000\n * castCurrency('€ 99,99'); // 99.99\n * castCurrency('1500'); // 1500\n * castCurrency(1500.50); // 1500.50\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n | { ok: true; value: T }\n | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input monetário para número\n *\n * Suporta diversos formatos:\n * - Brasileiro: R$ 1.500,50\n * - Americano: $1,000.00\n * - Europeu: € 99,99 ou 99,99 €\n * - Sem símbolo: 1500.50 ou 1500,50\n *\n * @param input - Valor de entrada (number, string, etc)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castCurrency('R$ 1.500,50'); // 1500.50\n * castCurrency('$1,000.00'); // 1000\n * castCurrency('€ 99,99'); // 99.99\n * castCurrency('1.500,50'); // 1500.50 (brasileiro)\n * castCurrency('1,500.50'); // 1500.50 (americano)\n * castCurrency('-R$ 50,00'); // -50\n * castCurrency('invalid'); // null\n */\nexport function castCurrency(input: unknown): number | null {\n // Já é número\n if (typeof input === \"number\") {\n return Number.isFinite(input) ? input : null;\n }\n\n // String\n if (typeof input === \"string\") {\n return parseCurrencyString(input);\n }\n\n return null;\n}\n\n/**\n * Alias para castCurrency (currency não tem conversão, então strict é igual)\n */\nexport function castCurrencyStrict(input: unknown): number | null {\n return castCurrency(input);\n}\n\n/**\n * Versão safe de castCurrency que retorna Result\n */\nexport function tryCastCurrency(input: unknown): Result<number> {\n const result = castCurrency(input);\n if (result === null) {\n return {\n ok: false,\n error: `Cannot cast \"${String(input)}\" to currency value`,\n };\n }\n return { ok: true, value: result };\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Símbolos de moeda conhecidos (para remoção no parse)\n */\nconst CURRENCY_SYMBOL_REGEX = /^[\\s]*([A-Z]{1,3}\\$?|[R$€£¥₹₩₽₺CHF]+)[\\s]*/i;\nconst CURRENCY_SYMBOL_SUFFIX_REGEX = /[\\s]*([€₽])[\\s]*$/;\n\n/**\n * Parseia string monetária para número\n */\nfunction parseCurrencyString(input: string): number | null {\n let str = input.trim();\n\n if (!str) {\n return null;\n }\n\n // Detecta sinal negativo (pode estar antes do símbolo)\n let isNegative = false;\n if (str.startsWith(\"-\")) {\n isNegative = true;\n str = str.slice(1).trim();\n } else if (str.startsWith(\"(\") && str.endsWith(\")\")) {\n // Formato contábil: (1,000.00) = -1000\n isNegative = true;\n str = str.slice(1, -1).trim();\n }\n\n // Remove símbolo de moeda do início\n str = str.replace(CURRENCY_SYMBOL_REGEX, \"\");\n\n // Remove símbolo de moeda do final (ex: 100 €)\n str = str.replace(CURRENCY_SYMBOL_SUFFIX_REGEX, \"\");\n\n str = str.trim();\n\n if (!str) {\n return null;\n }\n\n // Parseia o número\n const numValue = parseNumber(str);\n\n if (numValue === null) {\n return null;\n }\n\n return isNegative ? -numValue : numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n *\n * Detecta automaticamente o formato baseado nos separadores:\n * - 1.000,50 → brasileiro → 1000.50\n * - 1,000.50 → americano → 1000.50\n * - 1.000 → ambíguo (assume milhar) → 1000\n * - 1,50 → brasileiro decimal → 1.50\n */\nfunction parseNumber(numStr: string): number | null {\n // Remove espaços\n numStr = numStr.replace(/\\s/g, \"\");\n\n // Remove caracteres não numéricos exceto . , - +\n if (!/^[+-]?[\\d.,]+$/.test(numStr)) {\n return null;\n }\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 → vírgula é decimal\n numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n } else {\n // Americano: 1,000.50 → ponto é decimal\n numStr = numStr.replace(/,/g, \"\");\n }\n } else if (hasComma && !hasDot) {\n // Só vírgulas: detecta se é milhar ou decimal\n const parts = numStr.split(\",\");\n const afterComma = parts.slice(1);\n\n // Se tem múltiplas vírgulas OU parte após vírgula tem 3 dígitos = milhar\n if (afterComma.length > 1 || (afterComma.length === 1 && afterComma[0].length === 3 && parts[0].length <= 3)) {\n // Milhar brasileiro: 1,000,000 ou 1,000\n numStr = numStr.replace(/,/g, \"\");\n } else {\n // Decimal brasileiro: 1,50\n numStr = numStr.replace(\",\", \".\");\n }\n } else if (!hasComma && hasDot) {\n // Só pontos\n const parts = numStr.split(\".\");\n const afterDot = parts.slice(1);\n\n // Múltiplos pontos = milhar brasileiro: 1.000.000\n if (afterDot.length > 1) {\n numStr = numStr.replace(/\\./g, \"\");\n } else if (afterDot.length === 1 && afterDot[0].length === 3) {\n // Único ponto com exatamente 3 dígitos após = milhar (1.500 → 1500)\n // Em contexto monetário, 1.500 é quase sempre milhar, não 1.5\n numStr = numStr.replace(/\\./g, \"\");\n }\n // Outros casos: decimal americano (1.50, 1000.50)\n }\n\n const value = parseFloat(numStr);\n return isNaN(value) ? null : value;\n}\n","/**\n * Area Role - Format Pillar\n *\n * Formata valores de área para apresentação.\n *\n * @example\n * import { formatArea } from '@attrx/role-morphic/area/format';\n *\n * formatArea('hectare', 2.5); // \"2.5 ha\"\n * formatArea('hectare', 2.5, { verbose: true }); // \"2.5 hectares\"\n * formatArea('hectare', 1000, { locale: 'pt-BR' }); // \"1.000 ha\"\n */\n\nimport { AREA_UNITS, type AreaUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AreaFormatOptions {\n /** Casas decimais (default: 2) */\n decimals?: number;\n /** Usa nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação de número */\n locale?: string;\n /** Notação numérica */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de área para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatArea('hectare', 2.5); // \"2.5 ha\"\n * formatArea('hectare', 2.5, { verbose: true }); // \"2.5 hectares\"\n * formatArea('hectare', 1, { verbose: true }); // \"1 hectare\"\n * formatArea('hectare', 1000, { locale: 'pt-BR' }); // \"1.000 ha\"\n * formatArea('hectare', 1500, { decimals: 0 }); // \"1500 ha\"\n */\nexport function formatArea(\n variant: AreaUnit,\n value: number,\n options: AreaFormatOptions = {}\n): string {\n const { decimals = 2, verbose = false, locale, notation } = options;\n const unit = AREA_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown area variant: ${variant}`);\n }\n\n // Formata número\n let formattedValue: string;\n\n if (locale) {\n const formatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n\n if (notation) {\n formatOptions.notation = notation;\n }\n\n formattedValue = value.toLocaleString(locale, formatOptions);\n } else {\n formattedValue = Number(value.toFixed(decimals)).toString();\n }\n\n // Escolhe símbolo ou nome\n const separator = unit.noSpace ? \"\" : \" \";\n\n if (verbose) {\n const name = value === 1 ? unit.singular : unit.plural;\n return `${formattedValue} ${name || unit.symbol}`;\n }\n\n return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getAreaSymbol('hectare'); // \"ha\"\n * getAreaSymbol('acre'); // \"ac\"\n */\nexport function getAreaSymbol(variant: AreaUnit): string {\n const unit = AREA_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown area variant: ${variant}`);\n }\n return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getAreaName('hectare', 1); // \"hectare\"\n * getAreaName('hectare', 2); // \"hectares\"\n */\nexport function getAreaName(variant: AreaUnit, count: number = 1): string {\n const unit = AREA_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown area variant: ${variant}`);\n }\n return count === 1\n ? (unit.singular || unit.symbol)\n : (unit.plural || unit.symbol);\n}\n","/**\n * Length Role - Format Pillar\n *\n * Formata valores de comprimento para apresentação.\n *\n * @example\n * import { formatLength } from '@attrx/role-morphic/length/format';\n *\n * formatLength('kilometer', 42.195); // \"42.2 km\"\n * formatLength('kilometer', 42.195, { verbose: true }); // \"42.2 kilometers\"\n * formatLength('meter', 1000, { locale: 'pt-BR' }); // \"1.000 m\"\n */\n\nimport { LENGTH_UNITS, type LengthUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface LengthFormatOptions {\n /** Casas decimais (default: 2) */\n decimals?: number;\n /** Usa nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação de número */\n locale?: string;\n /** Notação numérica */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de comprimento para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatLength('kilometer', 42.195); // \"42.2 km\"\n * formatLength('kilometer', 42.195, { verbose: true }); // \"42.2 kilometers\"\n * formatLength('kilometer', 1, { verbose: true }); // \"1 kilometer\"\n * formatLength('meter', 1000, { locale: 'pt-BR' }); // \"1.000 m\"\n * formatLength('meter', 1500, { decimals: 0 }); // \"1500 m\"\n */\nexport function formatLength(\n variant: LengthUnit,\n value: number,\n options: LengthFormatOptions = {}\n): string {\n const { decimals = 2, verbose = false, locale, notation } = options;\n const unit = LENGTH_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown length variant: ${variant}`);\n }\n\n // Formata número\n let formattedValue: string;\n\n if (locale) {\n const formatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n\n if (notation) {\n formatOptions.notation = notation;\n }\n\n formattedValue = value.toLocaleString(locale, formatOptions);\n } else {\n formattedValue = Number(value.toFixed(decimals)).toString();\n }\n\n // Escolhe símbolo ou nome\n const separator = unit.noSpace ? \"\" : \" \";\n\n if (verbose) {\n const name = value === 1 ? unit.singular : unit.plural;\n return `${formattedValue} ${name || unit.symbol}`;\n }\n\n return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getLengthSymbol('kilometer'); // \"km\"\n * getLengthSymbol('mile'); // \"mi\"\n */\nexport function getLengthSymbol(variant: LengthUnit): string {\n const unit = LENGTH_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown length variant: ${variant}`);\n }\n return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getLengthName('kilometer', 1); // \"kilometer\"\n * getLengthName('kilometer', 2); // \"kilometers\"\n */\nexport function getLengthName(variant: LengthUnit, count: number = 1): string {\n const unit = LENGTH_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown length variant: ${variant}`);\n }\n return count === 1\n ? (unit.singular || unit.symbol)\n : (unit.plural || unit.symbol);\n}\n","/**\n * Mass Role - Format Pillar\n *\n * Formata valores de massa para apresentação.\n *\n * @example\n * import { formatMass } from '@attrx/role-morphic/mass/format';\n *\n * formatMass('kilogram', 75.5); // \"75.5 kg\"\n * formatMass('kilogram', 75.5, { verbose: true }); // \"75.5 kilograms\"\n * formatMass('pound', 1000, { locale: 'en-US' }); // \"1,000 lb\"\n */\n\nimport { MASS_UNITS, type MassUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface MassFormatOptions {\n /** Casas decimais (default: 2) */\n decimals?: number;\n /** Usa nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação de número */\n locale?: string;\n /** Notação numérica */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de massa para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatMass('kilogram', 75.5); // \"75.5 kg\"\n * formatMass('kilogram', 75.5, { verbose: true }); // \"75.5 kilograms\"\n * formatMass('kilogram', 1, { verbose: true }); // \"1 kilogram\"\n * formatMass('pound', 1000, { locale: 'en-US' }); // \"1,000 lb\"\n * formatMass('gram', 1500, { decimals: 0 }); // \"1500 g\"\n */\nexport function formatMass(\n variant: MassUnit,\n value: number,\n options: MassFormatOptions = {}\n): string {\n const { decimals = 2, verbose = false, locale, notation } = options;\n const unit = MASS_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown mass variant: ${variant}`);\n }\n\n // Formata número\n let formattedValue: string;\n\n if (locale) {\n const formatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n\n if (notation) {\n formatOptions.notation = notation;\n }\n\n formattedValue = value.toLocaleString(locale, formatOptions);\n } else {\n formattedValue = Number(value.toFixed(decimals)).toString();\n }\n\n // Escolhe símbolo ou nome\n const separator = unit.noSpace ? \"\" : \" \";\n\n if (verbose) {\n const name = value === 1 ? unit.singular : unit.plural;\n return `${formattedValue} ${name || unit.symbol}`;\n }\n\n return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getMassSymbol('kilogram'); // \"kg\"\n * getMassSymbol('pound'); // \"lb\"\n */\nexport function getMassSymbol(variant: MassUnit): string {\n const unit = MASS_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown mass variant: ${variant}`);\n }\n return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getMassName('kilogram', 1); // \"kilogram\"\n * getMassName('kilogram', 2); // \"kilograms\"\n */\nexport function getMassName(variant: MassUnit, count: number = 1): string {\n const unit = MASS_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown mass variant: ${variant}`);\n }\n return count === 1\n ? (unit.singular || unit.symbol)\n : (unit.plural || unit.symbol);\n}\n","/**\n * Temperature Role - Format Pillar\n *\n * Formata valores de temperatura para apresentação.\n *\n * @example\n * import { formatTemperature } from '@attrx/role-morphic/temperature/format';\n *\n * formatTemperature('celsius', 37); // \"37°C\"\n * formatTemperature('fahrenheit', 98.6, { verbose: true }); // \"98.6 degrees Fahrenheit\"\n * formatTemperature('kelvin', 273.15); // \"273.15 K\"\n */\n\nimport { TEMPERATURE_UNITS, type TemperatureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TemperatureFormatOptions {\n /** Casas decimais (default: 2) */\n decimals?: number;\n /** Usa nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação de número */\n locale?: string;\n /** Notação numérica */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de temperatura para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatTemperature('celsius', 37); // \"37°C\"\n * formatTemperature('fahrenheit', 98.6); // \"98.6°F\"\n * formatTemperature('kelvin', 273.15); // \"273.15 K\"\n * formatTemperature('celsius', 37, { verbose: true }); // \"37 degrees Celsius\"\n * formatTemperature('celsius', 1000, { locale: 'pt-BR' }); // \"1.000°C\"\n */\nexport function formatTemperature(\n variant: TemperatureUnit,\n value: number,\n options: TemperatureFormatOptions = {}\n): string {\n const { decimals = 2, verbose = false, locale, notation } = options;\n const unit = TEMPERATURE_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown temperature variant: ${variant}`);\n }\n\n // Formata número\n let formattedValue: string;\n\n if (locale) {\n const formatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n\n if (notation) {\n formatOptions.notation = notation;\n }\n\n formattedValue = value.toLocaleString(locale, formatOptions);\n } else {\n formattedValue = Number(value.toFixed(decimals)).toString();\n }\n\n // Escolhe símbolo ou nome\n // Nota: °C, °F, °R não têm espaço (noSpace: true), mas K tem espaço\n const separator = unit.noSpace ? \"\" : \" \";\n\n if (verbose) {\n const name = value === 1 ? unit.singular : unit.plural;\n return `${formattedValue} ${name || unit.symbol}`;\n }\n\n return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getTemperatureSymbol('celsius'); // \"°C\"\n * getTemperatureSymbol('fahrenheit'); // \"°F\"\n * getTemperatureSymbol('kelvin'); // \"K\"\n */\nexport function getTemperatureSymbol(variant: TemperatureUnit): string {\n const unit = TEMPERATURE_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown temperature variant: ${variant}`);\n }\n return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getTemperatureName('celsius', 1); // \"degree Celsius\"\n * getTemperatureName('celsius', 2); // \"degrees Celsius\"\n * getTemperatureName('kelvin', 1); // \"kelvin\"\n * getTemperatureName('kelvin', 2); // \"kelvins\"\n */\nexport function getTemperatureName(variant: TemperatureUnit, count: number = 1): string {\n const unit = TEMPERATURE_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown temperature variant: ${variant}`);\n }\n return count === 1\n ? (unit.singular || unit.symbol)\n : (unit.plural || unit.symbol);\n}\n","/**\n * Volume Role - Format Pillar\n *\n * Formata valores de volume para apresentação.\n *\n * @example\n * import { formatVolume } from '@attrx/role-morphic/volume/format';\n *\n * formatVolume('liter', 2.5); // \"2.5 L\"\n * formatVolume('liter', 2.5, { verbose: true }); // \"2.5 liters\"\n * formatVolume('milliliter', 1000, { locale: 'pt-BR' }); // \"1.000 mL\"\n */\n\nimport { VOLUME_UNITS, type VolumeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface VolumeFormatOptions {\n /** Casas decimais (default: 2) */\n decimals?: number;\n /** Usa nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação de número */\n locale?: string;\n /** Notação numérica */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de volume para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatVolume('liter', 2.5); // \"2.5 L\"\n * formatVolume('liter', 2.5, { verbose: true }); // \"2.5 liters\"\n * formatVolume('liter', 1, { verbose: true }); // \"1 liter\"\n * formatVolume('milliliter', 1000, { locale: 'pt-BR' }); // \"1.000 mL\"\n * formatVolume('gallon_us', 5, { decimals: 0 }); // \"5 gal\"\n */\nexport function formatVolume(\n variant: VolumeUnit,\n value: number,\n options: VolumeFormatOptions = {}\n): string {\n const { decimals = 2, verbose = false, locale, notation } = options;\n const unit = VOLUME_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown volume variant: ${variant}`);\n }\n\n // Formata número\n let formattedValue: string;\n\n if (locale) {\n const formatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n\n if (notation) {\n formatOptions.notation = notation;\n }\n\n formattedValue = value.toLocaleString(locale, formatOptions);\n } else {\n formattedValue = Number(value.toFixed(decimals)).toString();\n }\n\n // Escolhe símbolo ou nome\n const separator = unit.noSpace ? \"\" : \" \";\n\n if (verbose) {\n const name = value === 1 ? unit.singular : unit.plural;\n return `${formattedValue} ${name || unit.symbol}`;\n }\n\n return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getVolumeSymbol('liter'); // \"L\"\n * getVolumeSymbol('gallon_us'); // \"gal\"\n * getVolumeSymbol('milliliter'); // \"mL\"\n */\nexport function getVolumeSymbol(variant: VolumeUnit): string {\n const unit = VOLUME_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown volume variant: ${variant}`);\n }\n return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getVolumeName('liter', 1); // \"liter\"\n * getVolumeName('liter', 2); // \"liters\"\n * getVolumeName('gallon_us', 1); // \"gallon\"\n */\nexport function getVolumeName(variant: VolumeUnit, count: number = 1): string {\n const unit = VOLUME_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown volume variant: ${variant}`);\n }\n return count === 1\n ? (unit.singular || unit.symbol)\n : (unit.plural || unit.symbol);\n}\n","/**\n * Speed Role - Format Pillar\n *\n * Formata valores de velocidade para apresentação.\n *\n * @example\n * import { formatSpeed } from '@attrx/role-morphic/speed/format';\n *\n * formatSpeed('kilometer_per_hour', 120); // \"120 km/h\"\n * formatSpeed('kilometer_per_hour', 120, { verbose: true }); // \"120 kilometers per hour\"\n * formatSpeed('mile_per_hour', 60); // \"60 mph\"\n */\n\nimport { SPEED_UNITS, type SpeedUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SpeedFormatOptions {\n /** Casas decimais (default: 2) */\n decimals?: number;\n /** Usa nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação de número */\n locale?: string;\n /** Notação numérica */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de velocidade para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatSpeed('kilometer_per_hour', 120); // \"120 km/h\"\n * formatSpeed('kilometer_per_hour', 120, { verbose: true }); // \"120 kilometers per hour\"\n * formatSpeed('kilometer_per_hour', 1, { verbose: true }); // \"1 kilometer per hour\"\n * formatSpeed('mile_per_hour', 1000, { locale: 'en-US' }); // \"1,000 mph\"\n */\nexport function formatSpeed(\n variant: SpeedUnit,\n value: number,\n options: SpeedFormatOptions = {}\n): string {\n const { decimals = 2, verbose = false, locale, notation } = options;\n const unit = SPEED_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown speed variant: ${variant}`);\n }\n\n // Formata número\n let formattedValue: string;\n\n if (locale) {\n const formatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n\n if (notation) {\n formatOptions.notation = notation;\n }\n\n formattedValue = value.toLocaleString(locale, formatOptions);\n } else {\n formattedValue = Number(value.toFixed(decimals)).toString();\n }\n\n // Escolhe símbolo ou nome\n const separator = unit.noSpace ? \"\" : \" \";\n\n if (verbose) {\n const name = value === 1 ? unit.singular : unit.plural;\n return `${formattedValue} ${name || unit.symbol}`;\n }\n\n return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getSpeedSymbol('kilometer_per_hour'); // \"km/h\"\n * getSpeedSymbol('mile_per_hour'); // \"mph\"\n * getSpeedSymbol('knot'); // \"kn\"\n */\nexport function getSpeedSymbol(variant: SpeedUnit): string {\n const unit = SPEED_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown speed variant: ${variant}`);\n }\n return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getSpeedName('kilometer_per_hour', 1); // \"kilometer per hour\"\n * getSpeedName('kilometer_per_hour', 2); // \"kilometers per hour\"\n * getSpeedName('knot', 1); // \"knot\"\n */\nexport function getSpeedName(variant: SpeedUnit, count: number = 1): string {\n const unit = SPEED_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown speed variant: ${variant}`);\n }\n return count === 1\n ? (unit.singular || unit.symbol)\n : (unit.plural || unit.symbol);\n}\n","/**\n * Energy Role - Format Pillar\n *\n * Formata valores de energia para apresentação.\n *\n * @example\n * import { formatEnergy } from '@attrx/role-morphic/energy/format';\n *\n * formatEnergy('kilowatt_hour', 2.5); // \"2.5 kWh\"\n * formatEnergy('kilowatt_hour', 2.5, { verbose: true }); // \"2.5 kilowatt-hours\"\n * formatEnergy('joule', 1000, { locale: 'pt-BR' }); // \"1.000 J\"\n */\n\nimport { ENERGY_UNITS, type EnergyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface EnergyFormatOptions {\n /** Casas decimais (default: 2) */\n decimals?: number;\n /** Usa nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação de número */\n locale?: string;\n /** Notação numérica */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de energia para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatEnergy('kilowatt_hour', 2.5); // \"2.5 kWh\"\n * formatEnergy('kilowatt_hour', 2.5, { verbose: true }); // \"2.5 kilowatt-hours\"\n * formatEnergy('kilowatt_hour', 1, { verbose: true }); // \"1 kilowatt-hour\"\n * formatEnergy('joule', 1000, { locale: 'pt-BR' }); // \"1.000 J\"\n * formatEnergy('kilocalorie', 1500, { decimals: 0 }); // \"1500 kcal\"\n */\nexport function formatEnergy(\n variant: EnergyUnit,\n value: number,\n options: EnergyFormatOptions = {}\n): string {\n const { decimals = 2, verbose = false, locale, notation } = options;\n const unit = ENERGY_UNITS[variant];\n\n if (!unit) {\n throw new Error(`Unknown energy variant: ${variant}`);\n }\n\n // Formata número\n let formattedValue: string;\n\n if (locale) {\n const formatOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n\n if (notation) {\n formatOptions.notation = notation;\n }\n\n formattedValue = value.toLocaleString(locale, formatOptions);\n } else {\n formattedValue = Number(value.toFixed(decimals)).toString();\n }\n\n // Escolhe símbolo ou nome\n const separator = unit.noSpace ? \"\" : \" \";\n\n if (verbose) {\n const name = value === 1 ? unit.singular : unit.plural;\n return `${formattedValue} ${name || unit.symbol}`;\n }\n\n return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getEnergySymbol('kilowatt_hour'); // \"kWh\"\n * getEnergySymbol('kilocalorie'); // \"kcal\"\n */\nexport function getEnergySymbol(variant: EnergyUnit): string {\n const unit = ENERGY_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown energy variant: ${variant}`);\n }\n return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getEnergyName('kilowatt_hour', 1); // \"kilowatt-hour\"\n * getEnergyName('kilowatt_hour', 2); // \"kilowatt-hours\"\n */\nexport function getEnergyName(variant: EnergyUnit, count: number = 1): string {\n const unit = ENERGY_UNITS[variant];\n if (!unit) {\n throw new Error(`Unknown energy variant: ${variant}`);\n }\n return count === 1\n ? (unit.singular || unit.symbol)\n : (unit.plural || unit.symbol);\n}\n","/**\n * Power Role - Format Pillar\n *\n * Formatação de valores de potência para exibição.\n *\n * @example\n * import { formatPower, getPowerSymbol, getPowerName } from '@attrx/role-morphic/power/format';\n *\n * formatPower('kilowatt', 2.5); // \"2.5 kW\"\n * formatPower('kilowatt', 2.5, { verbose: true }); // \"2.5 kilowatts\"\n * getPowerSymbol('kilowatt'); // \"kW\"\n * getPowerName('kilowatt', 2); // \"kilowatts\"\n */\n\nimport { POWER_UNITS, type PowerUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PowerFormatOptions {\n /** Número de casas decimais */\n decimals?: number;\n /** Usar nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação numérica */\n locale?: string;\n /** Notação: standard, scientific, compact */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de potência para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatPower('kilowatt', 2.5); // \"2.5 kW\"\n * formatPower('kilowatt', 2.5, { verbose: true }); // \"2.5 kilowatts\"\n * formatPower('kilowatt', 1, { verbose: true }); // \"1 kilowatt\"\n * formatPower('watt', 1000, { decimals: 0 }); // \"1000 W\"\n */\nexport function formatPower(\n variant: PowerUnit,\n value: number,\n options: PowerFormatOptions = {},\n): string {\n const config = POWER_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown power unit: ${variant}`);\n }\n\n const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n // Format number\n let formattedNumber: string;\n\n if (locale || notation !== \"standard\") {\n const intlOptions: Intl.NumberFormatOptions = { notation };\n if (decimals !== undefined) {\n intlOptions.minimumFractionDigits = decimals;\n intlOptions.maximumFractionDigits = decimals;\n }\n formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n } else if (decimals !== undefined) {\n formattedNumber = value.toFixed(decimals);\n } else {\n // Smart formatting: remove trailing zeros\n formattedNumber = Number(value.toPrecision(12)).toString();\n }\n\n // Get unit label\n const unitLabel = verbose\n ? value === 1\n ? config.singular\n : config.plural\n : config.symbol;\n\n return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getPowerSymbol('kilowatt'); // \"kW\"\n * getPowerSymbol('horsepower_mechanical'); // \"hp\"\n */\nexport function getPowerSymbol(variant: PowerUnit): string {\n const config = POWER_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown power unit: ${variant}`);\n }\n return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getPowerName('kilowatt', 1); // \"kilowatt\"\n * getPowerName('kilowatt', 2); // \"kilowatts\"\n */\nexport function getPowerName(variant: PowerUnit, count: number = 1): string {\n const config = POWER_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown power unit: ${variant}`);\n }\n return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Pressure Role - Format Pillar\n *\n * Formatação de valores de pressão para exibição.\n *\n * @example\n * import { formatPressure, getPressureSymbol, getPressureName } from '@attrx/role-morphic/pressure/format';\n *\n * formatPressure('bar', 2.5); // \"2.5 bar\"\n * formatPressure('bar', 2.5, { verbose: true }); // \"2.5 bar\"\n * getPressureSymbol('pascal'); // \"Pa\"\n * getPressureName('atmosphere', 2); // \"atmospheres\"\n */\n\nimport { PRESSURE_UNITS, type PressureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PressureFormatOptions {\n /** Número de casas decimais */\n decimals?: number;\n /** Usar nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação numérica */\n locale?: string;\n /** Notação: standard, scientific, compact */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de pressão para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatPressure('bar', 2.5); // \"2.5 bar\"\n * formatPressure('bar', 2.5, { verbose: true }); // \"2.5 bar\"\n * formatPressure('atmosphere', 1, { verbose: true }); // \"1 atmosphere\"\n * formatPressure('pascal', 1000, { decimals: 0 }); // \"1000 Pa\"\n */\nexport function formatPressure(\n variant: PressureUnit,\n value: number,\n options: PressureFormatOptions = {},\n): string {\n const config = PRESSURE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown pressure unit: ${variant}`);\n }\n\n const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n // Format number\n let formattedNumber: string;\n\n if (locale || notation !== \"standard\") {\n const intlOptions: Intl.NumberFormatOptions = { notation };\n if (decimals !== undefined) {\n intlOptions.minimumFractionDigits = decimals;\n intlOptions.maximumFractionDigits = decimals;\n }\n formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n } else if (decimals !== undefined) {\n formattedNumber = value.toFixed(decimals);\n } else {\n // Smart formatting: remove trailing zeros\n formattedNumber = Number(value.toPrecision(12)).toString();\n }\n\n // Get unit label\n const unitLabel = verbose\n ? value === 1\n ? config.singular\n : config.plural\n : config.symbol;\n\n return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getPressureSymbol('bar'); // \"bar\"\n * getPressureSymbol('atmosphere'); // \"atm\"\n */\nexport function getPressureSymbol(variant: PressureUnit): string {\n const config = PRESSURE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown pressure unit: ${variant}`);\n }\n return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getPressureName('atmosphere', 1); // \"atmosphere\"\n * getPressureName('atmosphere', 2); // \"atmospheres\"\n */\nexport function getPressureName(variant: PressureUnit, count: number = 1): string {\n const config = PRESSURE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown pressure unit: ${variant}`);\n }\n return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Frequency Role - Format Pillar\n *\n * Formatação de valores de frequência para exibição.\n *\n * @example\n * import { formatFrequency, getFrequencySymbol, getFrequencyName } from '@attrx/role-morphic/frequency/format';\n *\n * formatFrequency('gigahertz', 2.4); // \"2.4 GHz\"\n * formatFrequency('gigahertz', 2.4, { verbose: true }); // \"2.4 gigahertz\"\n * getFrequencySymbol('megahertz'); // \"MHz\"\n * getFrequencyName('hertz', 2); // \"hertz\"\n */\n\nimport { FREQUENCY_UNITS, type FrequencyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FrequencyFormatOptions {\n /** Número de casas decimais */\n decimals?: number;\n /** Usar nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação numérica */\n locale?: string;\n /** Notação: standard, scientific, compact */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de frequência para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatFrequency('gigahertz', 2.4); // \"2.4 GHz\"\n * formatFrequency('gigahertz', 2.4, { verbose: true }); // \"2.4 gigahertz\"\n * formatFrequency('hertz', 1, { verbose: true }); // \"1 hertz\"\n * formatFrequency('megahertz', 100, { decimals: 0 }); // \"100 MHz\"\n */\nexport function formatFrequency(\n variant: FrequencyUnit,\n value: number,\n options: FrequencyFormatOptions = {},\n): string {\n const config = FREQUENCY_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown frequency unit: ${variant}`);\n }\n\n const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n // Format number\n let formattedNumber: string;\n\n if (locale || notation !== \"standard\") {\n const intlOptions: Intl.NumberFormatOptions = { notation };\n if (decimals !== undefined) {\n intlOptions.minimumFractionDigits = decimals;\n intlOptions.maximumFractionDigits = decimals;\n }\n formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n } else if (decimals !== undefined) {\n formattedNumber = value.toFixed(decimals);\n } else {\n // Smart formatting: remove trailing zeros\n formattedNumber = Number(value.toPrecision(12)).toString();\n }\n\n // Get unit label\n const unitLabel = verbose\n ? value === 1\n ? config.singular\n : config.plural\n : config.symbol;\n\n return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getFrequencySymbol('megahertz'); // \"MHz\"\n * getFrequencySymbol('rpm'); // \"rpm\"\n */\nexport function getFrequencySymbol(variant: FrequencyUnit): string {\n const config = FREQUENCY_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown frequency unit: ${variant}`);\n }\n return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getFrequencyName('hertz', 1); // \"hertz\"\n * getFrequencyName('hertz', 2); // \"hertz\"\n * getFrequencyName('rpm', 2); // \"revolutions per minute\"\n */\nexport function getFrequencyName(variant: FrequencyUnit, count: number = 1): string {\n const config = FREQUENCY_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown frequency unit: ${variant}`);\n }\n return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Angle Role - Format Pillar\n *\n * Formatação de valores de ângulo para exibição.\n *\n * @example\n * import { formatAngle, getAngleSymbol, getAngleName } from '@attrx/role-morphic/angle/format';\n *\n * formatAngle('degree', 45); // \"45°\"\n * formatAngle('degree', 45, { verbose: true }); // \"45 degrees\"\n * getAngleSymbol('degree'); // \"°\"\n * getAngleName('degree', 2); // \"degrees\"\n */\n\nimport { ANGLE_UNITS, type AngleUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AngleFormatOptions {\n /** Número de casas decimais */\n decimals?: number;\n /** Usar nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação numérica */\n locale?: string;\n /** Notação: standard, scientific, compact */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de ângulo para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatAngle('degree', 45); // \"45°\"\n * formatAngle('degree', 45, { verbose: true }); // \"45 degrees\"\n * formatAngle('radian', 3.14159); // \"3.14159 rad\"\n * formatAngle('degree', 90, { decimals: 0 }); // \"90°\"\n */\nexport function formatAngle(\n variant: AngleUnit,\n value: number,\n options: AngleFormatOptions = {},\n): string {\n const config = ANGLE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown angle unit: ${variant}`);\n }\n\n const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n // Format number\n let formattedNumber: string;\n\n if (locale || notation !== \"standard\") {\n const intlOptions: Intl.NumberFormatOptions = { notation };\n if (decimals !== undefined) {\n intlOptions.minimumFractionDigits = decimals;\n intlOptions.maximumFractionDigits = decimals;\n }\n formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n } else if (decimals !== undefined) {\n formattedNumber = value.toFixed(decimals);\n } else {\n // Smart formatting: remove trailing zeros\n formattedNumber = Number(value.toPrecision(12)).toString();\n }\n\n // Get unit label\n const unitLabel = verbose\n ? value === 1\n ? config.singular\n : config.plural\n : config.symbol;\n\n // Some angle units don't use space (e.g., 45° not 45 °)\n const separator = config.noSpace && !verbose ? \"\" : \" \";\n\n return `${formattedNumber}${separator}${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getAngleSymbol('degree'); // \"°\"\n * getAngleSymbol('radian'); // \"rad\"\n */\nexport function getAngleSymbol(variant: AngleUnit): string {\n const config = ANGLE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown angle unit: ${variant}`);\n }\n return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getAngleName('degree', 1); // \"degree\"\n * getAngleName('degree', 2); // \"degrees\"\n */\nexport function getAngleName(variant: AngleUnit, count: number = 1): string {\n const config = ANGLE_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown angle unit: ${variant}`);\n }\n return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Time Role - Format Pillar\n *\n * Formatação de valores de tempo para exibição.\n *\n * @example\n * import { formatTime, getTimeSymbol, getTimeName } from '@attrx/role-morphic/time/format';\n *\n * formatTime('hour', 2.5); // \"2.5 h\"\n * formatTime('hour', 2.5, { verbose: true }); // \"2.5 hours\"\n * getTimeSymbol('minute'); // \"min\"\n * getTimeName('hour', 2); // \"hours\"\n */\n\nimport { TIME_UNITS, type TimeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TimeFormatOptions {\n /** Número de casas decimais */\n decimals?: number;\n /** Usar nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação numérica */\n locale?: string;\n /** Notação: standard, scientific, compact */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de tempo para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatTime('hour', 2.5); // \"2.5 h\"\n * formatTime('hour', 2.5, { verbose: true }); // \"2.5 hours\"\n * formatTime('second', 1, { verbose: true }); // \"1 second\"\n * formatTime('millisecond', 100, { decimals: 0 }); // \"100 ms\"\n */\nexport function formatTime(\n variant: TimeUnit,\n value: number,\n options: TimeFormatOptions = {},\n): string {\n const config = TIME_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown time unit: ${variant}`);\n }\n\n const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n // Format number\n let formattedNumber: string;\n\n if (locale || notation !== \"standard\") {\n const intlOptions: Intl.NumberFormatOptions = { notation };\n if (decimals !== undefined) {\n intlOptions.minimumFractionDigits = decimals;\n intlOptions.maximumFractionDigits = decimals;\n }\n formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n } else if (decimals !== undefined) {\n formattedNumber = value.toFixed(decimals);\n } else {\n // Smart formatting: remove trailing zeros\n formattedNumber = Number(value.toPrecision(12)).toString();\n }\n\n // Get unit label\n const unitLabel = verbose\n ? value === 1\n ? config.singular\n : config.plural\n : config.symbol;\n\n return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getTimeSymbol('minute'); // \"min\"\n * getTimeSymbol('hour'); // \"h\"\n */\nexport function getTimeSymbol(variant: TimeUnit): string {\n const config = TIME_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown time unit: ${variant}`);\n }\n return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getTimeName('hour', 1); // \"hour\"\n * getTimeName('hour', 2); // \"hours\"\n */\nexport function getTimeName(variant: TimeUnit, count: number = 1): string {\n const config = TIME_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown time unit: ${variant}`);\n }\n return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Digital Role - Format Pillar\n *\n * Formatação de valores de armazenamento digital para exibição.\n *\n * @example\n * import { formatDigital, getDigitalSymbol, getDigitalName } from '@attrx/role-morphic/digital/format';\n *\n * formatDigital('gigabyte', 2.5); // \"2.5 GB\"\n * formatDigital('gigabyte', 2.5, { verbose: true }); // \"2.5 gigabytes\"\n * getDigitalSymbol('mebibyte'); // \"MiB\"\n * getDigitalName('byte', 2); // \"bytes\"\n */\n\nimport { DIGITAL_UNITS, type DigitalUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DigitalFormatOptions {\n /** Número de casas decimais */\n decimals?: number;\n /** Usar nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Locale para formatação numérica */\n locale?: string;\n /** Notação: standard, scientific, compact */\n notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de armazenamento digital para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatDigital('gigabyte', 2.5); // \"2.5 GB\"\n * formatDigital('gigabyte', 2.5, { verbose: true }); // \"2.5 gigabytes\"\n * formatDigital('byte', 1, { verbose: true }); // \"1 byte\"\n * formatDigital('mebibyte', 100, { decimals: 0 }); // \"100 MiB\"\n */\nexport function formatDigital(\n variant: DigitalUnit,\n value: number,\n options: DigitalFormatOptions = {},\n): string {\n const config = DIGITAL_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown digital unit: ${variant}`);\n }\n\n const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n // Format number\n let formattedNumber: string;\n\n if (locale || notation !== \"standard\") {\n const intlOptions: Intl.NumberFormatOptions = { notation };\n if (decimals !== undefined) {\n intlOptions.minimumFractionDigits = decimals;\n intlOptions.maximumFractionDigits = decimals;\n }\n formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n } else if (decimals !== undefined) {\n formattedNumber = value.toFixed(decimals);\n } else {\n // Smart formatting: remove trailing zeros\n formattedNumber = Number(value.toPrecision(12)).toString();\n }\n\n // Get unit label\n const unitLabel = verbose\n ? value === 1\n ? config.singular\n : config.plural\n : config.symbol;\n\n return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getDigitalSymbol('megabyte'); // \"MB\"\n * getDigitalSymbol('mebibyte'); // \"MiB\"\n */\nexport function getDigitalSymbol(variant: DigitalUnit): string {\n const config = DIGITAL_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown digital unit: ${variant}`);\n }\n return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getDigitalName('byte', 1); // \"byte\"\n * getDigitalName('byte', 2); // \"bytes\"\n */\nexport function getDigitalName(variant: DigitalUnit, count: number = 1): string {\n const config = DIGITAL_UNITS[variant];\n if (!config) {\n throw new Error(`Unknown digital unit: ${variant}`);\n }\n return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Color Role - Format Pillar\n *\n * Formatação de cores para apresentação.\n *\n * @example\n * import { formatColor } from '@attrx/role-morphic/color/format';\n *\n * formatColor('hex', '#ff0000', { uppercase: true }); // '#FF0000'\n * formatColor('rgb_string', { r: 255, g: 0, b: 0 }); // 'rgb(255, 0, 0)'\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject, ColorFormatOptions } from \"./types\";\nimport { rgbToHsl } from \"./types\";\nimport { toBaseColor } from \"./convert\";\n\n// =============================================================================\n// FORMAT OPTIONS DEFAULTS\n// =============================================================================\n\nconst DEFAULT_OPTIONS: ColorFormatOptions = {\n uppercase: false,\n includeAlpha: false,\n compact: false,\n};\n\n// =============================================================================\n// FORMAT BY VARIANT\n// =============================================================================\n\n/**\n * Formata RGBA como hex\n */\nfunction formatAsHex(rgba: RGBA, options: ColorFormatOptions): string {\n const r = rgba.r.toString(16).padStart(2, \"0\");\n const g = rgba.g.toString(16).padStart(2, \"0\");\n const b = rgba.b.toString(16).padStart(2, \"0\");\n\n let hex: string;\n\n if (options.includeAlpha || rgba.a < 1) {\n const a = Math.round(rgba.a * 255)\n .toString(16)\n .padStart(2, \"0\");\n hex = `#${r}${g}${b}${a}`;\n } else {\n hex = `#${r}${g}${b}`;\n }\n\n // Compact: try to use shorthand if possible\n if (options.compact && !options.includeAlpha && rgba.a === 1) {\n if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) {\n hex = `#${r[0]}${g[0]}${b[0]}`;\n }\n }\n\n return options.uppercase ? hex.toUpperCase() : hex.toLowerCase();\n}\n\n/**\n * Formata RGBA como RGB string\n */\nfunction formatAsRgbString(rgba: RGBA, options: ColorFormatOptions): string {\n if (options.includeAlpha || rgba.a < 1) {\n if (options.compact) {\n return `rgba(${rgba.r},${rgba.g},${rgba.b},${rgba.a})`;\n }\n return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n }\n\n if (options.compact) {\n return `rgb(${rgba.r},${rgba.g},${rgba.b})`;\n }\n return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n}\n\n/**\n * Formata RGBA como HSL string\n */\nfunction formatAsHslString(rgba: RGBA, options: ColorFormatOptions): string {\n const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n\n if (options.includeAlpha || rgba.a < 1) {\n if (options.compact) {\n return `hsla(${h},${s}%,${l}%,${rgba.a})`;\n }\n return `hsla(${h}, ${s}%, ${l}%, ${rgba.a})`;\n }\n\n if (options.compact) {\n return `hsl(${h},${s}%,${l}%)`;\n }\n return `hsl(${h}, ${s}%, ${l}%)`;\n}\n\n/**\n * Formata RGBA como RGB object (formato CSS rgb())\n * Nota: rgb_object format usa a mesma representação de rgb_string\n */\nfunction formatAsRgbObject(rgba: RGBA, options: ColorFormatOptions): string {\n // rgb_object format outputs RGB string representation (same as rgb_string)\n return formatAsRgbString(rgba, options);\n}\n\n/**\n * Formata RGBA como HSL object (formato CSS hsl())\n * Nota: hsl_object format usa a mesma representação de hsl_string\n */\nfunction formatAsHslObject(rgba: RGBA, options: ColorFormatOptions): string {\n // hsl_object format outputs HSL string representation (same as hsl_string)\n return formatAsHslString(rgba, options);\n}\n\n// =============================================================================\n// MAIN FORMAT\n// =============================================================================\n\n/**\n * Formata cor para apresentação\n *\n * @param variant - Variante de saída\n * @param value - Valor da cor (qualquer variante)\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatColor('hex', '#ff0000', { uppercase: true });\n * // '#FF0000'\n *\n * formatColor('rgb_string', { r: 255, g: 0, b: 0 });\n * // 'rgb(255, 0, 0)'\n *\n * formatColor('hex', '#ff0000', { compact: true });\n * // '#f00'\n */\nexport function formatColor(\n variant: ColorVariant,\n value: unknown,\n options?: ColorFormatOptions,\n): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Primeiro converte para RGBA (base)\n let rgba: RGBA;\n\n // Se o value já é um objeto com r,g,b,a, usa direto\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"r\" in value &&\n \"g\" in value &&\n \"b\" in value\n ) {\n const obj = value as ColorRgbObject;\n rgba = {\n r: obj.r,\n g: obj.g,\n b: obj.b,\n a: obj.a ?? 1,\n };\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n \"h\" in value &&\n \"s\" in value &&\n \"l\" in value\n ) {\n // HSL object - converte para RGBA\n rgba = toBaseColor(\"hsl_object\", value);\n } else if (typeof value === \"string\") {\n // String - detecta formato e converte\n rgba = toBaseColor(detectStringVariant(value), value);\n } else {\n throw new Error(`Cannot format color: ${String(value)}`);\n }\n\n // Formata na variante de saída\n switch (variant) {\n case \"hex\":\n return formatAsHex(rgba, opts);\n case \"rgb_string\":\n return formatAsRgbString(rgba, opts);\n case \"hsl_string\":\n return formatAsHslString(rgba, opts);\n case \"rgb_object\":\n return formatAsRgbObject(rgba, opts);\n case \"hsl_object\":\n return formatAsHslObject(rgba, opts);\n default:\n throw new Error(`Unknown color variant: ${variant}`);\n }\n}\n\n/**\n * Detecta variante de uma string\n */\nfunction detectStringVariant(value: string): ColorVariant {\n const trimmed = value.trim().toLowerCase();\n\n if (/^#?[0-9a-f]{3,8}$/i.test(trimmed)) {\n return \"hex\";\n }\n if (/^rgba?\\s*\\(/i.test(trimmed)) {\n return \"rgb_string\";\n }\n if (/^hsla?\\s*\\(/i.test(trimmed)) {\n return \"hsl_string\";\n }\n\n // Default to hex\n return \"hex\";\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Formata como hex\n */\nexport function formatHex(value: unknown, options?: ColorFormatOptions): string {\n return formatColor(\"hex\", value, options);\n}\n\n/**\n * Formata como RGB string\n */\nexport function formatRgbString(value: unknown, options?: ColorFormatOptions): string {\n return formatColor(\"rgb_string\", value, options);\n}\n\n/**\n * Formata como HSL string\n */\nexport function formatHslString(value: unknown, options?: ColorFormatOptions): string {\n return formatColor(\"hsl_string\", value, options);\n}\n","/**\n * Date Role - Format Pillar\n *\n * Formatação de datas para apresentação.\n *\n * @example\n * import { formatDate, formatIso, formatTimestamp } from '@attrx/role-morphic/date/format';\n *\n * formatDate('iso', '2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' });\n * // \"quinta-feira, 5 de dezembro de 2024\"\n */\n\nimport type { DateVariant, DateIso, DateTimestamp, DateEpoch, DateFormatOptions } from \"./types\";\n\n// =============================================================================\n// FORMAT ISO\n// =============================================================================\n\n/**\n * Formata ISO string para apresentação\n *\n * @example\n * formatIso('2024-12-05T19:30:00.000Z');\n * // '2024-12-05T19:30:00.000Z'\n *\n * formatIso('2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' });\n * // 'quinta-feira, 5 de dezembro de 2024'\n */\nexport function formatIso(value: DateIso, options?: DateFormatOptions): string {\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 de formatação, retorna o ISO string original\n if (\n !options ||\n (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n ) {\n return value;\n }\n\n return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// FORMAT TIMESTAMP\n// =============================================================================\n\n/**\n * Formata timestamp (ms) para apresentação\n *\n * @example\n * formatTimestamp(1733425800000);\n * // '1733425800000'\n *\n * formatTimestamp(1733425800000, { dateStyle: 'medium', locale: 'en-US' });\n * // 'Dec 5, 2024'\n */\nexport function formatTimestamp(value: DateTimestamp, options?: DateFormatOptions): string {\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 !options ||\n (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n ) {\n return String(value);\n }\n\n return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// FORMAT EPOCH\n// =============================================================================\n\n/**\n * Formata epoch (segundos) para apresentação\n *\n * @example\n * formatEpoch(1733425800);\n * // '1733425800'\n *\n * formatEpoch(1733425800, { dateStyle: 'short', timeStyle: 'short' });\n * // '12/5/24, 7:30 PM'\n */\nexport function formatEpoch(value: DateEpoch, options?: DateFormatOptions): string {\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 !options ||\n (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n ) {\n return String(value);\n }\n\n return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// MAIN FORMAT\n// =============================================================================\n\n/**\n * Formata data para apresentação\n *\n * @param variant - Variante da data (\"iso\", \"timestamp\", \"epoch\")\n * @param value - Valor da data\n * @param options - Opções de formatação\n * @returns String formatada\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 *\n * formatDate('timestamp', 1733425800000, { dateOnly: true, dateStyle: 'medium' });\n * // 'Dec 5, 2024'\n */\nexport function formatDate(\n variant: DateVariant,\n value: unknown,\n options?: DateFormatOptions\n): string {\n switch (variant) {\n case \"iso\":\n return formatIso(value as DateIso, options);\n case \"timestamp\":\n return formatTimestamp(value as DateTimestamp, options);\n case \"epoch\":\n return formatEpoch(value as DateEpoch, options);\n default:\n return \"Invalid Date\";\n }\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Formata Date usando Intl.DateTimeFormat\n */\nfunction formatWithIntl(date: Date, options: DateFormatOptions): string {\n const locale = options.locale || \"en-US\";\n const formatOptions: Intl.DateTimeFormatOptions = {};\n\n if (options.timeZone) {\n formatOptions.timeZone = options.timeZone;\n }\n\n if (options.dateOnly) {\n formatOptions.dateStyle = options.dateStyle || \"medium\";\n } else if (options.timeOnly) {\n formatOptions.timeStyle = options.timeStyle || \"medium\";\n } else {\n if (options.dateStyle) formatOptions.dateStyle = options.dateStyle;\n if (options.timeStyle) formatOptions.timeStyle = options.timeStyle;\n }\n\n return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n}\n\n// =============================================================================\n// RELATIVE TIME HELPERS\n// =============================================================================\n\n/**\n * Formata diferença de tempo relativa (ex: \"2 hours ago\", \"in 3 days\")\n *\n * @param timestamp - Timestamp em milissegundos\n * @param options - Opções de formatação\n *\n * @example\n * formatRelative(Date.now() - 3600000, { locale: 'en-US' });\n * // '1 hour ago'\n */\nexport function formatRelative(\n timestamp: DateTimestamp,\n options?: { locale?: string; now?: DateTimestamp }\n): string {\n const locale = options?.locale || \"en-US\";\n const now = options?.now || Date.now();\n const diff = timestamp - now;\n const absDiff = Math.abs(diff);\n\n // Escolhe a unidade apropriada\n let value: number;\n let unit: Intl.RelativeTimeFormatUnit;\n\n if (absDiff < 60000) {\n // < 1 minuto\n value = Math.round(diff / 1000);\n unit = \"second\";\n } else if (absDiff < 3600000) {\n // < 1 hora\n value = Math.round(diff / 60000);\n unit = \"minute\";\n } else if (absDiff < 86400000) {\n // < 1 dia\n value = Math.round(diff / 3600000);\n unit = \"hour\";\n } else if (absDiff < 2592000000) {\n // < 30 dias\n value = Math.round(diff / 86400000);\n unit = \"day\";\n } else if (absDiff < 31536000000) {\n // < 1 ano\n value = Math.round(diff / 2592000000);\n unit = \"month\";\n } else {\n value = Math.round(diff / 31536000000);\n unit = \"year\";\n }\n\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n return rtf.format(value, unit);\n}\n","/**\n * Currency Role - Constants\n *\n * Códigos de moeda, símbolos e configurações de formatação.\n *\n * Currency é sobre VALOR MONETÁRIO, não sobre tipos de moeda.\n * O código da moeda (BRL, USD, etc) é METADATA usado apenas para formatação.\n *\n * NÃO há conversão entre moedas - isso é operação de negócio com taxas externas.\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Códigos de moeda ISO 4217\n */\nexport type CurrencyCode =\n // Major currencies\n | \"USD\"\n | \"EUR\"\n | \"GBP\"\n | \"JPY\"\n | \"CHF\"\n | \"CNY\"\n | \"CAD\"\n | \"AUD\"\n // Latin America\n | \"BRL\"\n | \"MXN\"\n | \"ARS\"\n | \"CLP\"\n | \"COP\"\n // Other important\n | \"INR\"\n | \"KRW\"\n | \"RUB\"\n | \"TRY\"\n | \"ZAR\";\n\n/**\n * Configuração de uma moeda para formatação\n */\nexport interface CurrencyConfig {\n /** Código ISO 4217 */\n code: CurrencyCode;\n /** Símbolo da moeda */\n symbol: string;\n /** Nome singular */\n singular: string;\n /** Nome plural */\n plural: string;\n /** Casas decimais padrão */\n decimals: number;\n /** Símbolo vem antes do valor? */\n symbolFirst: boolean;\n /** Separador de milhares */\n thousandsSeparator: string;\n /** Separador decimal */\n decimalSeparator: string;\n}\n\n// =============================================================================\n// CURRENCY CONFIGS\n// =============================================================================\n\n/**\n * Configuração de cada moeda para formatação\n */\nexport const CURRENCY_CONFIGS: Record<CurrencyCode, CurrencyConfig> = {\n // ===========================================================================\n // Major Currencies\n // ===========================================================================\n USD: {\n code: \"USD\",\n symbol: \"$\",\n singular: \"US dollar\",\n plural: \"US dollars\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n EUR: {\n code: \"EUR\",\n symbol: \"€\",\n singular: \"euro\",\n plural: \"euros\",\n decimals: 2,\n symbolFirst: false, // 100 € (europeu) ou €100 (varia)\n thousandsSeparator: \".\",\n decimalSeparator: \",\",\n },\n GBP: {\n code: \"GBP\",\n symbol: \"£\",\n singular: \"British pound\",\n plural: \"British pounds\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n JPY: {\n code: \"JPY\",\n symbol: \"¥\",\n singular: \"Japanese yen\",\n plural: \"Japanese yen\",\n decimals: 0, // Yen não tem centavos\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n CHF: {\n code: \"CHF\",\n symbol: \"CHF\",\n singular: \"Swiss franc\",\n plural: \"Swiss francs\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \"'\",\n decimalSeparator: \".\",\n },\n CNY: {\n code: \"CNY\",\n symbol: \"¥\",\n singular: \"Chinese yuan\",\n plural: \"Chinese yuan\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n CAD: {\n code: \"CAD\",\n symbol: \"C$\",\n singular: \"Canadian dollar\",\n plural: \"Canadian dollars\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n AUD: {\n code: \"AUD\",\n symbol: \"A$\",\n singular: \"Australian dollar\",\n plural: \"Australian dollars\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n\n // ===========================================================================\n // Latin America\n // ===========================================================================\n BRL: {\n code: \"BRL\",\n symbol: \"R$\",\n singular: \"Brazilian real\",\n plural: \"Brazilian reais\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \".\",\n decimalSeparator: \",\",\n },\n MXN: {\n code: \"MXN\",\n symbol: \"$\",\n singular: \"Mexican peso\",\n plural: \"Mexican pesos\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n ARS: {\n code: \"ARS\",\n symbol: \"$\",\n singular: \"Argentine peso\",\n plural: \"Argentine pesos\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \".\",\n decimalSeparator: \",\",\n },\n CLP: {\n code: \"CLP\",\n symbol: \"$\",\n singular: \"Chilean peso\",\n plural: \"Chilean pesos\",\n decimals: 0, // Peso chileno não tem centavos\n symbolFirst: true,\n thousandsSeparator: \".\",\n decimalSeparator: \",\",\n },\n COP: {\n code: \"COP\",\n symbol: \"$\",\n singular: \"Colombian peso\",\n plural: \"Colombian pesos\",\n decimals: 0, // Peso colombiano praticamente não usa centavos\n symbolFirst: true,\n thousandsSeparator: \".\",\n decimalSeparator: \",\",\n },\n\n // ===========================================================================\n // Other Important\n // ===========================================================================\n INR: {\n code: \"INR\",\n symbol: \"₹\",\n singular: \"Indian rupee\",\n plural: \"Indian rupees\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n KRW: {\n code: \"KRW\",\n symbol: \"₩\",\n singular: \"South Korean won\",\n plural: \"South Korean won\",\n decimals: 0, // Won não tem centavos\n symbolFirst: true,\n thousandsSeparator: \",\",\n decimalSeparator: \".\",\n },\n RUB: {\n code: \"RUB\",\n symbol: \"₽\",\n singular: \"Russian ruble\",\n plural: \"Russian rubles\",\n decimals: 2,\n symbolFirst: false,\n thousandsSeparator: \" \",\n decimalSeparator: \",\",\n },\n TRY: {\n code: \"TRY\",\n symbol: \"₺\",\n singular: \"Turkish lira\",\n plural: \"Turkish lira\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \".\",\n decimalSeparator: \",\",\n },\n ZAR: {\n code: \"ZAR\",\n symbol: \"R\",\n singular: \"South African rand\",\n plural: \"South African rand\",\n decimals: 2,\n symbolFirst: true,\n thousandsSeparator: \" \",\n decimalSeparator: \",\",\n },\n};\n\n// =============================================================================\n// SYMBOL TO CODE MAPPING\n// =============================================================================\n\n/**\n * Mapeamento de símbolos para códigos de moeda\n * Usado no cast para detectar moeda a partir de string\n *\n * NOTA: Alguns símbolos são ambíguos ($ é usado por várias moedas)\n * O cast retorna apenas o valor numérico, não infere a moeda\n */\nexport const CURRENCY_SYMBOLS: Record<string, CurrencyCode[]> = {\n $: [\"USD\", \"CAD\", \"AUD\", \"MXN\", \"ARS\", \"CLP\", \"COP\"],\n \"€\": [\"EUR\"],\n \"£\": [\"GBP\"],\n \"¥\": [\"JPY\", \"CNY\"],\n \"R$\": [\"BRL\"],\n \"C$\": [\"CAD\"],\n \"A$\": [\"AUD\"],\n CHF: [\"CHF\"],\n \"₹\": [\"INR\"],\n \"₩\": [\"KRW\"],\n \"₽\": [\"RUB\"],\n \"₺\": [\"TRY\"],\n R: [\"ZAR\"],\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todos os códigos de moeda */\nexport const CURRENCY_CODE_LIST = Object.keys(CURRENCY_CONFIGS) as CurrencyCode[];\n\n/**\n * Retorna configuração de uma moeda\n */\nexport function getCurrencyConfig(code: CurrencyCode): CurrencyConfig {\n return CURRENCY_CONFIGS[code];\n}\n\n/**\n * Verifica se é um código de moeda válido\n */\nexport function isCurrencyCode(code: string): code is CurrencyCode {\n return code.toUpperCase() in CURRENCY_CONFIGS;\n}\n","/**\n * Currency Role - Format Pillar\n *\n * Formata valores monetários para apresentação.\n * Usa metadata (código da moeda) para determinar formatação.\n *\n * @example\n * import { formatCurrency } from '@attrx/role-morphic/currency/format';\n *\n * formatCurrency(1500.50, { currency: 'BRL' }); // \"R$ 1.500,50\"\n * formatCurrency(1000, { currency: 'USD' }); // \"$1,000.00\"\n * formatCurrency(99.99, { currency: 'EUR' }); // \"99,99 €\"\n */\n\nimport {\n CURRENCY_CONFIGS,\n type CurrencyCode,\n type CurrencyConfig,\n} from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface CurrencyFormatOptions {\n /** Código da moeda (obrigatório) */\n currency: CurrencyCode;\n /** Casas decimais (default: decimais padrão da moeda) */\n decimals?: number;\n /** Usa nome completo ao invés de símbolo */\n verbose?: boolean;\n /** Esconde símbolo, retorna só o número formatado */\n hideSymbol?: boolean;\n /** Força símbolo antes do valor */\n symbolFirst?: boolean;\n /** Usa Intl.NumberFormat com locale */\n locale?: string;\n /** Mostra sinal de positivo para valores positivos */\n showPositiveSign?: boolean;\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor monetário para apresentação\n *\n * @param value - Valor numérico\n * @param options - Opções de formatação (currency obrigatório)\n * @returns String formatada\n *\n * @example\n * formatCurrency(1500.50, { currency: 'BRL' }); // \"R$ 1.500,50\"\n * formatCurrency(1000, { currency: 'USD' }); // \"$1,000.00\"\n * formatCurrency(99.99, { currency: 'EUR' }); // \"99,99 €\"\n * formatCurrency(1500, { currency: 'JPY' }); // \"¥1,500\"\n * formatCurrency(1500.50, { currency: 'BRL', verbose: true }); // \"1.500,50 Brazilian reais\"\n * formatCurrency(1500.50, { currency: 'BRL', hideSymbol: true }); // \"1.500,50\"\n * formatCurrency(1500.50, { currency: 'BRL', locale: 'pt-BR' }); // \"R$ 1.500,50\" (via Intl)\n */\nexport function formatCurrency(\n value: number,\n options: CurrencyFormatOptions\n): string {\n const config = CURRENCY_CONFIGS[options.currency];\n\n if (!config) {\n throw new Error(`Unknown currency code: ${options.currency}`);\n }\n\n // Se locale especificado, usa Intl.NumberFormat\n if (options.locale) {\n return formatWithIntl(value, options, config);\n }\n\n // Formatação manual\n return formatManual(value, options, config);\n}\n\n/**\n * Formata usando Intl.NumberFormat (mais preciso para i18n)\n */\nfunction formatWithIntl(\n value: number,\n options: CurrencyFormatOptions,\n config: CurrencyConfig\n): string {\n const decimals = options.decimals ?? config.decimals;\n\n const intlOptions: Intl.NumberFormatOptions = {\n style: options.hideSymbol ? \"decimal\" : \"currency\",\n currency: config.code,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n };\n\n if (options.verbose) {\n intlOptions.currencyDisplay = \"name\";\n }\n\n let formatted = new Intl.NumberFormat(options.locale, intlOptions).format(\n value\n );\n\n if (options.showPositiveSign && value > 0) {\n formatted = \"+\" + formatted;\n }\n\n return formatted;\n}\n\n/**\n * Formatação manual (mais controle, sem dependência de locale)\n */\nfunction formatManual(\n value: number,\n options: CurrencyFormatOptions,\n config: CurrencyConfig\n): string {\n const decimals = options.decimals ?? config.decimals;\n const isNegative = value < 0;\n const absValue = Math.abs(value);\n\n // Formata o número\n const formattedNumber = formatNumber(\n absValue,\n decimals,\n config.thousandsSeparator,\n config.decimalSeparator\n );\n\n // Monta o resultado\n let result = \"\";\n\n // Sinal\n if (isNegative) {\n result += \"-\";\n } else if (options.showPositiveSign) {\n result += \"+\";\n }\n\n // Símbolo e valor\n if (options.hideSymbol) {\n result += formattedNumber;\n } else if (options.verbose) {\n // Modo verbose: \"1.500,50 Brazilian reais\"\n const name = absValue === 1 ? config.singular : config.plural;\n result += `${formattedNumber} ${name}`;\n } else {\n // Modo normal com símbolo\n const symbolFirst =\n options.symbolFirst !== undefined\n ? options.symbolFirst\n : config.symbolFirst;\n\n if (symbolFirst) {\n result += `${config.symbol}${formattedNumber}`;\n } else {\n result += `${formattedNumber} ${config.symbol}`;\n }\n }\n\n return result;\n}\n\n/**\n * Formata número com separadores\n */\nfunction formatNumber(\n value: number,\n decimals: number,\n thousandsSeparator: string,\n decimalSeparator: string\n): string {\n // Fixa decimais\n const fixed = value.toFixed(decimals);\n\n // Separa inteiro e decimal\n const [intPart, decPart] = fixed.split(\".\");\n\n // Adiciona separador de milhares\n const intFormatted = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSeparator);\n\n // Junta com separador decimal\n if (decimals > 0 && decPart) {\n return `${intFormatted}${decimalSeparator}${decPart}`;\n }\n\n return intFormatted;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna apenas o símbolo da moeda\n *\n * @example\n * getCurrencySymbol('BRL'); // \"R$\"\n * getCurrencySymbol('USD'); // \"$\"\n */\nexport function getCurrencySymbol(code: CurrencyCode): string {\n const config = CURRENCY_CONFIGS[code];\n if (!config) {\n throw new Error(`Unknown currency code: ${code}`);\n }\n return config.symbol;\n}\n\n/**\n * Retorna o nome da moeda (singular ou plural)\n *\n * @example\n * getCurrencyName('BRL', 1); // \"Brazilian real\"\n * getCurrencyName('BRL', 2); // \"Brazilian reais\"\n */\nexport function getCurrencyName(code: CurrencyCode, count: number = 1): string {\n const config = CURRENCY_CONFIGS[code];\n if (!config) {\n throw new Error(`Unknown currency code: ${code}`);\n }\n return count === 1 ? config.singular : config.plural;\n}\n\n/**\n * Retorna casas decimais padrão da moeda\n *\n * @example\n * getCurrencyDecimals('BRL'); // 2\n * getCurrencyDecimals('JPY'); // 0\n */\nexport function getCurrencyDecimals(code: CurrencyCode): number {\n const config = CURRENCY_CONFIGS[code];\n if (!config) {\n throw new Error(`Unknown currency code: ${code}`);\n }\n return config.decimals;\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 * AreaRole - Classe OOP para manipulação de unidades de área\n *\n * Implementa os 4 pilares via composição dos módulos separados.\n * Para uso funcional, importe diretamente dos pilares:\n *\n * @example\n * // OOP\n * import { areaRole } from '@attrx/role-morphic/area';\n * areaRole.convert('hectare', 'acre', 1);\n *\n * // Funcional\n * import { convertArea } from '@attrx/role-morphic/area/convert';\n * convertArea('hectare', 'acre', 1);\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { AREA_UNITS, AREA_ALIASES } 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 * LengthRole - Classe OOP para manipulação de unidades de comprimento\n *\n * Implementa os 4 pilares via composição dos módulos separados.\n * Para uso funcional, importe diretamente dos pilares:\n *\n * @example\n * // OOP\n * import { lengthRole } from '@attrx/role-morphic/length';\n * lengthRole.convert('kilometer', 'mile', 1);\n *\n * // Funcional\n * import { convertLength } from '@attrx/role-morphic/length/convert';\n * convertLength('kilometer', 'mile', 1);\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { LENGTH_UNITS, LENGTH_ALIASES } 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 readonly validation: SimpleValidationConfig = {\n min: 0,\n minError: \"Length cannot be negative\",\n };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da LengthRole */\nexport const lengthRole = new LengthRole();\n","/**\n * MassRole - Role para conversão de unidades de massa\n *\n * Implementa os 4 pilares via SimpleRole base class.\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * @example\n * // OOP style\n * import { massRole } from '@attrx/role-morphic/mass';\n * massRole.convert('kilogram', 'pound', 1); // 2.20462\n *\n * // Functional style (preferido)\n * import { convertMass } from '@attrx/role-morphic/mass/convert';\n * convertMass('kilogram', 'pound', 1); // 2.20462\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { MASS_UNITS, MASS_ALIASES } 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 * 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 * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * @example\n * // OOP style\n * import { temperatureRole } from '@attrx/role-morphic/temperature';\n * temperatureRole.convert('celsius', 'fahrenheit', 0); // 32\n *\n * // Functional style (preferido)\n * import { convertTemperature } from '@attrx/role-morphic/temperature/convert';\n * convertTemperature('celsius', 'fahrenheit', 0); // 32\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport {\n TEMPERATURE_UNITS,\n TEMPERATURE_ALIASES,\n TEMPERATURE_CONSTANTS,\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 * 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 } 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 * EnergyRole - Role para conversão de unidades de energia\n *\n * Implementa os 4 pilares via SimpleRole base class.\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * @example\n * // OOP style\n * import { energyRole } from '@attrx/role-morphic/energy';\n * energyRole.convert('kilocalorie', 'kilojoule', 1); // 4.1868\n *\n * // Functional style (preferido)\n * import { convertEnergy } from '@attrx/role-morphic/energy/convert';\n * convertEnergy('kilocalorie', 'kilojoule', 1); // 4.1868\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { ENERGY_UNITS, ENERGY_ALIASES } 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 * 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 } 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 * SpeedRole - Role para conversão de unidades de velocidade\n *\n * Implementa os 4 pilares via SimpleRole base class.\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * Nota: Velocidade pode ser negativa (movimento em direção oposta).\n *\n * @example\n * // OOP style\n * import { speedRole } from '@attrx/role-morphic/speed';\n * speedRole.convert('kilometer_per_hour', 'mile_per_hour', 100); // 62.1371\n *\n * // Functional style (preferido)\n * import { convertSpeed } from '@attrx/role-morphic/speed/convert';\n * convertSpeed('kilometer_per_hour', 'mile_per_hour', 100); // 62.1371\n */\n\nimport { SimpleRole } from \"../../contracts\";\nimport { SPEED_UNITS, SPEED_ALIASES } 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 * 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 * VolumeRole - Role para conversão de unidades de volume\n *\n * Implementa os 4 pilares via SimpleRole base class.\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * @example\n * // OOP style\n * import { volumeRole } from '@attrx/role-morphic/volume';\n * volumeRole.convert('gallon_us', 'liter', 1); // 3.785411784\n *\n * // Functional style (preferido)\n * import { convertVolume } from '@attrx/role-morphic/volume/convert';\n * convertVolume('gallon_us', 'liter', 1); // 3.785411784\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { VOLUME_UNITS, VOLUME_ALIASES } 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 * 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 } 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 * 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 } 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 * 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 { FREQUENCY_UNITS, FREQUENCY_ALIASES } 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 * 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 { PRESSURE_UNITS, PRESSURE_ALIASES } 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 * 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 {\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 * CurrencyRole - Role para valores monetários\n *\n * IMPORTANTE: Currency é diferente das outras roles!\n * - NÃO tem convert (conversão entre moedas é operação de negócio)\n * - O tipo de moeda (BRL, USD) é METADATA, não variante\n * - Apenas 3 pilares: validate, cast, format\n *\n * @example\n * // Functional style (preferido)\n * import { validateCurrency, castCurrency, formatCurrency } from '@attrx/role-morphic/currency';\n *\n * validateCurrency(100.50); // { valid: true, errors: [] }\n * castCurrency('R$ 1.500,50'); // 1500.50\n * formatCurrency(1500.50, { currency: 'BRL' }); // \"R$ 1.500,50\"\n */\n\nimport { validateCurrency, type CurrencyValidationConfig } from \"./validate\";\nimport { castCurrency, tryCastCurrency } from \"./cast\";\nimport { formatCurrency, type CurrencyFormatOptions } from \"./format\";\nimport { CURRENCY_CONFIGS, type CurrencyCode } from \"./constants\";\n\n// =============================================================================\n// CURRENCY ROLE CLASS\n// =============================================================================\n\n/**\n * CurrencyRole - classe wrapper para os 3 pilares\n *\n * Nota: Currency não estende SimpleRole porque não tem convert.\n * É uma role especial com apenas validate, cast e format.\n */\nexport class CurrencyRole {\n readonly name = \"currency\";\n\n /**\n * Valida um valor monetário\n */\n validate(\n value: unknown,\n config?: CurrencyValidationConfig\n ): { valid: boolean; errors: string[] } {\n return validateCurrency(value, config);\n }\n\n /**\n * Verifica se um valor monetário é válido\n */\n isValid(value: unknown, config?: CurrencyValidationConfig): boolean {\n return validateCurrency(value, config).valid;\n }\n\n /**\n * Faz cast de input para número\n */\n cast(input: unknown): number | null {\n return castCurrency(input);\n }\n\n /**\n * Versão safe de cast que retorna Result\n */\n tryCast(\n input: unknown\n ): { ok: true; value: number } | { ok: false; error: string } {\n return tryCastCurrency(input);\n }\n\n /**\n * Formata valor monetário\n */\n format(value: number, options: CurrencyFormatOptions): string {\n return formatCurrency(value, options);\n }\n\n /**\n * Lista códigos de moeda disponíveis\n */\n getCurrencyCodes(): CurrencyCode[] {\n return Object.keys(CURRENCY_CONFIGS) as CurrencyCode[];\n }\n\n /**\n * Verifica se um código de moeda é válido\n */\n hasCurrency(code: string): code is CurrencyCode {\n return code.toUpperCase() in CURRENCY_CONFIGS;\n }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da CurrencyRole */\nexport const currencyRole = new CurrencyRole();\n"]}
|