22 * Pipeline steps: data transforms — select, map, filter, sort, limit.
33 */
44
5+ import type { IPage } from '../../types.js' ;
56import { render , evalExpr } from '../template.js' ;
67
7- export async function stepSelect ( _page : any , params : any , data : any , args : Record < string , any > ) : Promise < any > {
8+ function isRecord ( value : unknown ) : value is Record < string , unknown > {
9+ return typeof value === 'object' && value !== null && ! Array . isArray ( value ) ;
10+ }
11+
12+ export async function stepSelect ( _page : IPage | null , params : unknown , data : unknown , args : Record < string , unknown > ) : Promise < unknown > {
813 const pathStr = String ( render ( params , { args, data } ) ) ;
914 if ( data && typeof data === 'object' ) {
10- let current = data ;
15+ let current : unknown = data ;
1116 for ( const part of pathStr . split ( '.' ) ) {
12- if ( current && typeof current === 'object' && ! Array . isArray ( current ) ) current = ( current as any ) [ part ] ;
17+ if ( isRecord ( current ) ) current = current [ part ] ;
1318 else if ( Array . isArray ( current ) && / ^ \d + $ / . test ( part ) ) current = current [ parseInt ( part , 10 ) ] ;
1419 else return null ;
1520 }
@@ -18,24 +23,25 @@ export async function stepSelect(_page: any, params: any, data: any, args: Recor
1823 return data ;
1924}
2025
21- export async function stepMap ( _page : any , params : any , data : any , args : Record < string , any > ) : Promise < any > {
26+ export async function stepMap ( _page : IPage | null , params : unknown , data : unknown , args : Record < string , unknown > ) : Promise < unknown > {
2227 if ( ! data || typeof data !== 'object' ) return data ;
23- let source = data ;
28+ let source : unknown = data ;
2429
2530 // Support inline select: { map: { select: 'path', key: '${{ item.x }}' } }
26- if ( params && typeof params === 'object' && 'select' in params ) {
27- source = await stepSelect ( null , ( params as any ) . select , data , args ) ;
31+ if ( isRecord ( params ) && 'select' in params ) {
32+ source = await stepSelect ( null , params . select , data , args ) ;
2833 }
2934
3035 if ( ! source || typeof source !== 'object' ) return source ;
3136
32- let items : any [ ] = Array . isArray ( source ) ? source : [ source ] ;
33- if ( ! Array . isArray ( source ) && typeof source === 'object' && 'data' in source ) items = source . data ;
34- const result : any [ ] = [ ] ;
37+ let items : unknown [ ] = Array . isArray ( source ) ? source : [ source ] ;
38+ if ( isRecord ( source ) && Array . isArray ( source . data ) ) items = source . data ;
39+ const result : Array < Record < string , unknown > > = [ ] ;
40+ const templateParams = isRecord ( params ) ? params : { } ;
3541 for ( let i = 0 ; i < items . length ; i ++ ) {
3642 const item = items [ i ] ;
37- const row : Record < string , any > = { } ;
38- for ( const [ key , template ] of Object . entries ( params ) ) {
43+ const row : Record < string , unknown > = { } ;
44+ for ( const [ key , template ] of Object . entries ( templateParams ) ) {
3945 if ( key === 'select' ) continue ;
4046 row [ key ] = render ( template , { args, data : source , item, index : i } ) ;
4147 }
@@ -44,19 +50,26 @@ export async function stepMap(_page: any, params: any, data: any, args: Record<s
4450 return result ;
4551}
4652
47- export async function stepFilter ( _page : any , params : any , data : any , args : Record < string , any > ) : Promise < any > {
53+ export async function stepFilter ( _page : IPage | null , params : unknown , data : unknown , args : Record < string , unknown > ) : Promise < unknown > {
4854 if ( ! Array . isArray ( data ) ) return data ;
4955 return data . filter ( ( item , i ) => evalExpr ( String ( params ) , { args, item, index : i } ) ) ;
5056}
5157
52- export async function stepSort ( _page : any , params : any , data : any , _args : Record < string , any > ) : Promise < any > {
58+ export async function stepSort ( _page : IPage | null , params : unknown , data : unknown , _args : Record < string , unknown > ) : Promise < unknown > {
5359 if ( ! Array . isArray ( data ) ) return data ;
54- const key = typeof params === 'object' ? ( params . by ?? '' ) : String ( params ) ;
55- const reverse = typeof params === 'object' ? params . order === 'desc' : false ;
56- return [ ...data ] . sort ( ( a , b ) => { const va = a [ key ] ?? '' ; const vb = b [ key ] ?? '' ; const cmp = va < vb ? - 1 : va > vb ? 1 : 0 ; return reverse ? - cmp : cmp ; } ) ;
60+ const key = isRecord ( params ) ? String ( params . by ?? '' ) : String ( params ) ;
61+ const reverse = isRecord ( params ) ? params . order === 'desc' : false ;
62+ return [ ...data ] . sort ( ( a , b ) => {
63+ const left = isRecord ( a ) ? a [ key ] : undefined ;
64+ const right = isRecord ( b ) ? b [ key ] : undefined ;
65+ const va = left ?? '' ;
66+ const vb = right ?? '' ;
67+ const cmp = va < vb ? - 1 : va > vb ? 1 : 0 ;
68+ return reverse ? - cmp : cmp ;
69+ } ) ;
5770}
5871
59- export async function stepLimit ( _page : any , params : any , data : any , args : Record < string , any > ) : Promise < any > {
72+ export async function stepLimit ( _page : IPage | null , params : unknown , data : unknown , args : Record < string , unknown > ) : Promise < unknown > {
6073 if ( ! Array . isArray ( data ) ) return data ;
6174 return data . slice ( 0 , Number ( render ( params , { args, data } ) ) ) ;
6275}
0 commit comments