@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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/constants.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"],"names":["p","q"],"mappings":"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","file":"convert.mjs","sourcesContent":["/**\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 - 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 - 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"]}