1
+ import type Controller from "@ember/controller" ;
1
2
import { get } from "@ember/object" ;
2
3
import { underscore } from "@ember/string" ;
3
4
import {
@@ -8,56 +9,61 @@ import {
8
9
/**
9
10
* Filter params by key
10
11
*/
11
- export const filterQueryParams = ( params , ...keys ) => {
12
- return Object . keys ( params ) . reduce ( ( obj , key ) => {
13
- return keys . includes ( key ) ? obj : { ...obj , [ key ] : get ( params , key ) } ;
14
- } , { } ) ;
12
+ export const filterQueryParams = <
13
+ T extends Record < string , unknown > ,
14
+ K extends string [ ]
15
+ > (
16
+ params : T ,
17
+ ...keys : K
18
+ ) => {
19
+ return Object . fromEntries (
20
+ Object . entries ( params ) . filter ( ( [ k ] ) => ! keys . includes ( k ) )
21
+ ) as Omit < T , K [ number ] > ;
15
22
} ;
16
23
17
24
/**
18
25
* Underscore all object keys
19
26
*/
20
- export const underscoreQueryParams = ( params ) => {
21
- return Object . keys ( params ) . reduce ( ( obj , key ) => {
22
- return { ...obj , [ underscore ( key ) ] : get ( params , key ) } ;
23
- } , { } ) ;
24
- } ;
27
+ export const underscoreQueryParams = ( params : Record < string , unknown > ) =>
28
+ Object . fromEntries (
29
+ Object . entries ( params ) . map ( ( [ k , v ] ) => [ underscore ( k ) , v ] )
30
+ ) ;
25
31
26
- export const serializeQueryParams = ( params , queryParamsObject ) => {
32
+ export const serializeQueryParams = < T extends Record < string , unknown > > (
33
+ params : T ,
34
+ queryParamsObject : { [ K in keyof T ] ?: ( deserialized : T [ K ] ) => string }
35
+ ) => {
27
36
return Object . keys ( params ) . reduce ( ( parsed , key ) => {
28
- const serializeFn = get ( queryParamsObject , key ) ?. serialize ;
29
- const value = get ( params , key ) ;
37
+ const serializeFn = queryParamsObject [ key as keyof T ] ;
38
+ const value = params [ key as keyof T ] ;
30
39
31
40
return key === "type"
32
41
? parsed
33
42
: {
34
43
...parsed ,
35
44
[ key ] : serializeFn ? serializeFn ( value ) : value ,
36
45
} ;
37
- } , { } ) ;
46
+ } , { } as Record < keyof T , string > ) ;
38
47
} ;
39
48
40
49
/**
41
- *
42
- * @param {string } param
43
- * @returns {string } | {undefined}
44
50
* ? in all controllers, the only parameter that have the default value is `ordering`, and the value is "-date"
45
51
*/
46
- export function getDefaultQueryParamValue ( param ) {
52
+ export function getDefaultQueryParamValue ( param : string ) {
47
53
if ( param === "ordering" ) return "-date" ;
48
54
else if ( param === "type" ) return "year" ;
49
55
return undefined ;
50
56
}
51
57
52
- export function allQueryParams ( controller ) {
58
+ export function allQueryParams < C extends Controller > ( controller : C ) {
53
59
const params = { } ;
54
60
for ( const qpKey of controller . queryParams ) {
55
61
params [ qpKey ] = controller [ qpKey ] ;
56
62
}
57
63
return params ;
58
64
}
59
65
60
- export function queryParamsState ( controller ) {
66
+ export function queryParamsState < C extends Controller > ( controller : C ) {
61
67
const states = { } ;
62
68
for ( const param of controller . queryParams ) {
63
69
const defaultValue = getDefaultQueryParamValue ( param ) ;
@@ -94,7 +100,10 @@ export function queryParamsState(controller) {
94
100
return states ;
95
101
}
96
102
97
- export function resetQueryParams ( controller , ...args ) {
103
+ export function resetQueryParams < C extends Controller > (
104
+ controller : C ,
105
+ ...args : string [ ]
106
+ ) {
98
107
if ( ! args [ 0 ] ) {
99
108
return ;
100
109
}
0 commit comments