@@ -59,10 +59,43 @@ export const runHandler = async <T>(
5959 await handler ( result ) ;
6060} ;
6161
62+ // ─── Sync Transform Runner ──────────────────────────────────────────────────
63+
64+ /**
65+ * Run transforms synchronously when transforms are defined.
66+ */
67+ export function runSyncTransforms <
68+ TValuesIn ,
69+ TValuesOut ,
70+ TPositionalsIn extends readonly unknown [ ] ,
71+ TPositionalsOut extends readonly unknown [ ] ,
72+ > (
73+ transforms : TransformsConfig <
74+ TValuesIn ,
75+ TValuesOut ,
76+ TPositionalsIn ,
77+ TPositionalsOut
78+ > ,
79+ values : TValuesIn ,
80+ positionals : TPositionalsIn ,
81+ ) : { positionals : TPositionalsOut ; values : TValuesOut } ;
82+
83+ /**
84+ * Pass through unchanged when transforms are undefined.
85+ */
86+ export function runSyncTransforms <
87+ TValues ,
88+ TPositionals extends readonly unknown [ ] ,
89+ > (
90+ transforms : undefined ,
91+ values : TValues ,
92+ positionals : TPositionals ,
93+ ) : { positionals : TPositionals ; values : TValues } ;
94+
6295/**
6396 * Run transforms synchronously. Throws if any transform returns a thenable.
6497 */
65- export const runSyncTransforms = <
98+ export function runSyncTransforms <
6699 TValuesIn ,
67100 TValuesOut ,
68101 TPositionalsIn extends readonly unknown [ ] ,
@@ -73,40 +106,80 @@ export const runSyncTransforms = <
73106 | undefined ,
74107 values : TValuesIn ,
75108 positionals : TPositionalsIn ,
76- ) : { positionals : TPositionalsOut ; values : TValuesOut } => {
77- let currentValues : unknown = values ;
78- let currentPositionals : unknown = positionals ;
79-
80- if ( transforms ?. values ) {
81- const result = transforms . values ( currentValues as TValuesIn ) ;
82- if ( isThenable ( result ) ) {
83- throw new BargsError (
84- 'Transform returned a thenable. Use bargsAsync() for async transforms.' ,
85- ) ;
86- }
87- currentValues = result ;
109+ ) : {
110+ positionals : TPositionalsIn | TPositionalsOut ;
111+ values : TValuesIn | TValuesOut ;
112+ } {
113+ if ( ! transforms ) {
114+ return { positionals, values } ;
88115 }
89116
90- if ( transforms ?. positionals ) {
91- const result = transforms . positionals ( currentPositionals as TPositionalsIn ) ;
92- if ( isThenable ( result ) ) {
93- throw new BargsError (
94- 'Transform returned a thenable. Use bargsAsync() for async transforms.' ,
95- ) ;
96- }
97- currentPositionals = result ;
98- }
117+ // Apply values transform
118+ const transformedValues = transforms . values
119+ ? ( ( ) => {
120+ const result = transforms . values ( values ) ;
121+ if ( isThenable ( result ) ) {
122+ throw new BargsError (
123+ 'Transform returned a thenable. Use bargsAsync() for async transforms.' ,
124+ ) ;
125+ }
126+ return result ;
127+ } ) ( )
128+ : values ;
129+
130+ // Apply positionals transform
131+ const transformedPositionals = transforms . positionals
132+ ? ( ( ) => {
133+ const result = transforms . positionals ( positionals ) ;
134+ if ( isThenable ( result ) ) {
135+ throw new BargsError (
136+ 'Transform returned a thenable. Use bargsAsync() for async transforms.' ,
137+ ) ;
138+ }
139+ return result ;
140+ } ) ( )
141+ : positionals ;
99142
100143 return {
101- positionals : currentPositionals as TPositionalsOut ,
102- values : currentValues as TValuesOut ,
144+ positionals : transformedPositionals ,
145+ values : transformedValues ,
103146 } ;
104- } ;
147+ }
148+
149+ // ─── Async Transform Runner ─────────────────────────────────────────────────
150+
151+ /**
152+ * Run transforms asynchronously when transforms are defined.
153+ */
154+ export function runTransforms <
155+ TValuesIn ,
156+ TValuesOut ,
157+ TPositionalsIn extends readonly unknown [ ] ,
158+ TPositionalsOut extends readonly unknown [ ] ,
159+ > (
160+ transforms : TransformsConfig <
161+ TValuesIn ,
162+ TValuesOut ,
163+ TPositionalsIn ,
164+ TPositionalsOut
165+ > ,
166+ values : TValuesIn ,
167+ positionals : TPositionalsIn ,
168+ ) : Promise < { positionals : TPositionalsOut ; values : TValuesOut } > ;
169+
170+ /**
171+ * Pass through unchanged when transforms are undefined.
172+ */
173+ export function runTransforms < TValues , TPositionals extends readonly unknown [ ] > (
174+ transforms : undefined ,
175+ values : TValues ,
176+ positionals : TPositionals ,
177+ ) : Promise < { positionals : TPositionals ; values : TValues } > ;
105178
106179/**
107180 * Run transforms asynchronously.
108181 */
109- export const runTransforms = async <
182+ export async function runTransforms <
110183 TValuesIn ,
111184 TValuesOut ,
112185 TPositionalsIn extends readonly unknown [ ] ,
@@ -117,25 +190,29 @@ export const runTransforms = async <
117190 | undefined ,
118191 values : TValuesIn ,
119192 positionals : TPositionalsIn ,
120- ) : Promise < { positionals : TPositionalsOut ; values : TValuesOut } > => {
121- let currentValues : unknown = values ;
122- let currentPositionals : unknown = positionals ;
123-
124- if ( transforms ?. values ) {
125- currentValues = await transforms . values ( currentValues as TValuesIn ) ;
193+ ) : Promise < {
194+ positionals : TPositionalsIn | TPositionalsOut ;
195+ values : TValuesIn | TValuesOut ;
196+ } > {
197+ if ( ! transforms ) {
198+ return { positionals , values } ;
126199 }
127200
128- if ( transforms ?. positionals ) {
129- currentPositionals = await transforms . positionals (
130- currentPositionals as TPositionalsIn ,
131- ) ;
132- }
201+ // Apply values transform (await if needed)
202+ const transformedValues = transforms . values
203+ ? await transforms . values ( values )
204+ : values ;
205+
206+ // Apply positionals transform (await if needed)
207+ const transformedPositionals = transforms . positionals
208+ ? await transforms . positionals ( positionals )
209+ : positionals ;
133210
134211 return {
135- positionals : currentPositionals as TPositionalsOut ,
136- values : currentValues as TValuesOut ,
212+ positionals : transformedPositionals ,
213+ values : transformedValues ,
137214 } ;
138- } ;
215+ }
139216
140217/**
141218 * Build parseArgs options config from our options schema.
0 commit comments