1- /**
2- * Fixed conversion rate between USD and Comfy credits.
3- * 1 credit costs 210 cents ($2.10).
4- */
5- export const COMFY_CREDIT_RATE_CENTS = 210
6-
7- export const COMFY_CREDIT_RATE_USD = COMFY_CREDIT_RATE_CENTS / 100
8-
91const DEFAULT_NUMBER_FORMAT : Intl . NumberFormatOptions = {
102 minimumFractionDigits : 2 ,
113 maximumFractionDigits : 2
124}
135
146const formatNumber = (
157 value : number ,
16- options : Intl . NumberFormatOptions = DEFAULT_NUMBER_FORMAT ,
17- locale ?: string
8+ locale ?: string ,
9+ options : Intl . NumberFormatOptions = DEFAULT_NUMBER_FORMAT
1810) => {
1911 const merged : Intl . NumberFormatOptions = {
2012 ...DEFAULT_NUMBER_FORMAT ,
@@ -32,166 +24,50 @@ const formatNumber = (
3224 return new Intl . NumberFormat ( locale , merged ) . format ( value )
3325}
3426
35- export const centsToUsd = ( cents : number ) : number => cents / 100
27+ export const COMFY_CREDIT_RATE_CENTS = 210
28+ export const COMFY_CREDIT_RATE_USD = COMFY_CREDIT_RATE_CENTS / 100
29+
3630export const usdToCents = ( usd : number ) : number => Math . round ( usd * 100 )
31+ const centsToUsd = ( cents : number ) : number => cents / 100
3732
38- /**
39- * Converts a USD amount into Comfy credits.
40- */
41- export function usdToComfyCredits ( usd : number ) : number {
42- return usd / COMFY_CREDIT_RATE_USD
43- }
33+ export const centsToCredits = ( cents : number ) : number =>
34+ cents / COMFY_CREDIT_RATE_CENTS
4435
45- /**
46- * Converts USD cents into Comfy credits.
47- */
48- export function centsToComfyCredits ( cents : number ) : number {
49- return cents / COMFY_CREDIT_RATE_CENTS
50- }
36+ export const creditsToCents = ( credits : number ) : number =>
37+ Math . round ( credits * COMFY_CREDIT_RATE_CENTS )
5138
52- /**
53- * Converts Comfy credits back to USD.
54- */
55- export function comfyCreditsToUsd ( credits : number ) : number {
56- return credits * COMFY_CREDIT_RATE_USD
57- }
58-
59- /**
60- * Converts Comfy credits to cents.
61- */
62- export function comfyCreditsToCents ( credits : number ) : number {
63- return credits * COMFY_CREDIT_RATE_CENTS
64- }
39+ export const usdToCredits = ( usd : number ) : number =>
40+ centsToCredits ( usdToCents ( usd ) )
6541
66- export function formatUsdFromCents (
67- cents : number ,
68- options ?: Intl . NumberFormatOptions ,
69- locale ?: string
70- ) : string {
71- return formatNumber (
72- centsToUsd ( cents ) ,
73- { ...DEFAULT_NUMBER_FORMAT , ...options } ,
74- locale
75- )
76- }
42+ export const creditsToUsd = ( credits : number ) : number =>
43+ centsToUsd ( creditsToCents ( credits ) )
7744
78- /**
79- * Formats credits to a localized numeric string (no unit suffix).
80- */
81- export function formatComfyCreditsAmount (
45+ export const formatCredits = (
8246 credits : number ,
83- options ?: Intl . NumberFormatOptions ,
84- locale ?: string
85- ) : string {
86- return formatNumber ( credits , { ...DEFAULT_NUMBER_FORMAT , ...options } , locale )
87- }
88-
89- type FormatCreditsOptions = {
90- unit ?: string | null
91- numberOptions ?: Intl . NumberFormatOptions
92- locale ?: string
93- }
47+ locale ?: string ,
48+ options ?: Intl . NumberFormatOptions
49+ ) : string => formatNumber ( credits , locale , options )
9450
95- export function formatComfyCreditsLabel (
96- credits : number ,
97- { unit = 'credits' , numberOptions, locale } : FormatCreditsOptions = { }
98- ) : string {
99- const formatted = formatComfyCreditsAmount ( credits , numberOptions , locale )
100- return unit ? `${ formatted } ${ unit } ` : formatted
101- }
102-
103- export function formatComfyCreditsLabelFromCents (
51+ export const formatCreditsFromCents = (
10452 cents : number ,
105- options ?: FormatCreditsOptions
106- ) : string {
107- return formatComfyCreditsLabel ( centsToComfyCredits ( cents ) , options )
108- }
53+ locale ?: string ,
54+ options ?: Intl . NumberFormatOptions
55+ ) : string => formatCredits ( centsToCredits ( cents ) , locale , options )
10956
110- export function formatComfyCreditsLabelFromUsd (
57+ export const formatCreditsFromUsd = (
11158 usd : number ,
112- options ?: FormatCreditsOptions
113- ) : string {
114- return formatComfyCreditsLabel ( usdToComfyCredits ( usd ) , options )
115- }
116-
117- export function formatComfyCreditsRangeLabelFromUsd (
118- minUsd : number ,
119- maxUsd : number ,
120- {
121- unit = 'credits' ,
122- numberOptions,
123- locale,
124- separator = '–'
125- } : FormatCreditsOptions & {
126- separator ?: string
127- } = { }
128- ) : string {
129- const min = formatComfyCreditsAmount (
130- usdToComfyCredits ( minUsd ) ,
131- numberOptions ,
132- locale
133- )
134- const max = formatComfyCreditsAmount (
135- usdToComfyCredits ( maxUsd ) ,
136- numberOptions ,
137- locale
138- )
139- const joined = `${ min } ${ separator } ${ max } `
140- return unit ? `${ joined } ${ unit } ` : joined
141- }
142-
143- const USD_RANGE_REGEX = / ( ~ ? ) \$ ( \d + (?: \. \d + ) ? ) \s * [ - – ] \s * \$ ? ( \d + (?: \. \d + ) ? ) / g
144- const USD_VALUE_REGEX = / ( ~ ? ) \$ ( \d + (?: \. \d + ) ? ) / g
59+ locale ?: string ,
60+ options ?: Intl . NumberFormatOptions
61+ ) : string => formatCredits ( usdToCredits ( usd ) , locale , options )
14562
146- /**
147- * Converts a USD-denoted string (e.g., "$0.45-1.2/Run") into a credits string.
148- * Any "$X" occurrences become "Y credits". Ranges are rendered as "Y–Z credits".
149- */
150- export function convertUsdLabelToCredits (
151- label : string ,
152- options ?: FormatCreditsOptions
153- ) : string {
154- if ( ! label ) return label
155- const unit = options ?. unit ?? 'credits'
156- const numberOptions = options ?. numberOptions
157- const locale = options ?. locale
158-
159- const formatSingle = ( usd : number ) =>
160- formatComfyCreditsLabel ( usdToComfyCredits ( usd ) , {
161- unit,
162- numberOptions,
163- locale
164- } )
165-
166- const formatRange = ( min : number , max : number , prefix = '' ) => {
167- const minStr = formatComfyCreditsAmount (
168- usdToComfyCredits ( min ) ,
169- numberOptions ,
170- locale
171- )
172- const maxStr = formatComfyCreditsAmount (
173- usdToComfyCredits ( max ) ,
174- numberOptions ,
175- locale
176- )
177- const joined = `${ minStr } –${ maxStr } `
178- return unit ? `${ prefix } ${ joined } ${ unit } ` : `${ prefix } ${ joined } `
179- }
180-
181- let converted = label
182- converted = converted . replace (
183- USD_RANGE_REGEX ,
184- ( _match , prefix = '' , minUsd , maxUsd ) =>
185- formatRange ( parseFloat ( minUsd ) , parseFloat ( maxUsd ) , prefix )
186- )
187-
188- converted = converted . replace (
189- USD_VALUE_REGEX ,
190- ( _match , prefix = '' , amount ) => {
191- const formatted = formatSingle ( parseFloat ( amount ) )
192- return `${ prefix } ${ formatted } `
193- }
194- )
63+ export const formatUsdFromCents = (
64+ cents : number ,
65+ locale ?: string ,
66+ options ?: Intl . NumberFormatOptions
67+ ) : string => formatNumber ( centsToUsd ( cents ) , locale , options )
19568
196- return converted
197- }
69+ export const formatUsd = (
70+ usd : number ,
71+ locale ?: string ,
72+ options ?: Intl . NumberFormatOptions
73+ ) : string => formatNumber ( usd , locale , options )
0 commit comments