@@ -56,6 +56,19 @@ const isOptional = (validator?: TypeCheck<any>) => {
56
56
return ! ! schema && TypeBoxSymbol . optional in schema
57
57
}
58
58
59
+ const defaultParsers = [
60
+ 'json' ,
61
+ 'text' ,
62
+ 'urlencoded' ,
63
+ 'arrayBuffer' ,
64
+ 'formdata' ,
65
+ 'application/json' ,
66
+ 'text/plain' ,
67
+ 'application/x-www-form-urlencoded' ,
68
+ 'application/octet-stream' ,
69
+ 'multipart/form-data'
70
+ ]
71
+
59
72
export const hasAdditionalProperties = (
60
73
_schema : TAnySchema | TypeCheck < any >
61
74
) => {
@@ -481,7 +494,7 @@ export const composeHandler = ({
481
494
'get:function(){return getServer()}' +
482
495
'})\n'
483
496
484
- if ( inference . body ) fnLiteral += `let isParsing = false\n`
497
+ if ( inference . body ) fnLiteral += `let isParsing= false\n`
485
498
486
499
validator . createBody ?.( )
487
500
validator . createQuery ?.( )
@@ -699,7 +712,8 @@ export const composeHandler = ({
699
712
'}'
700
713
} else {
701
714
fnLiteral +=
702
- 'if(c.qi!==-1){' + `let url = '&' + decodeURIComponent(c.url.slice(c.qi + 1))\n`
715
+ 'if(c.qi!==-1){' +
716
+ `let url = '&' + decodeURIComponent(c.url.slice(c.qi + 1))\n`
703
717
704
718
let index = 0
705
719
for ( const {
@@ -883,9 +897,23 @@ export const composeHandler = ({
883
897
884
898
if ( adapter . parser . declare ) fnLiteral += adapter . parser . declare
885
899
886
- fnLiteral += 'isParsing=true\n'
887
- if ( hooks . type && ! hooks . parse . length ) {
888
- switch ( hooks . type ) {
900
+ const parser =
901
+ typeof hooks . parse === 'string'
902
+ ? hooks . parse
903
+ : Array . isArray ( hooks . parse ) && hooks . parse . length === 1
904
+ ? typeof hooks . parse [ 0 ] === 'string'
905
+ ? hooks . parse [ 0 ]
906
+ : typeof hooks . parse [ 0 ] . fn === 'string'
907
+ ? hooks . parse [ 0 ] . fn
908
+ : undefined
909
+ : undefined
910
+
911
+ if ( parser && parser in defaultParsers ) {
912
+ const reporter = report ( 'parse' , {
913
+ total : hooks . parse . length
914
+ } )
915
+
916
+ switch ( parser ) {
889
917
case 'json' :
890
918
case 'application/json' :
891
919
fnLiteral += adapter . parser . json ( isOptionalBody )
@@ -913,7 +941,32 @@ export const composeHandler = ({
913
941
case 'multipart/form-data' :
914
942
fnLiteral += adapter . parser . formData ( isOptionalBody )
915
943
break
944
+
945
+ default :
946
+ if ( ( parser [ 0 ] as string ) in app . parser ) {
947
+ fnLiteral += hasHeaders
948
+ ? `let contentType = c.headers['content-type']`
949
+ : `let contentType = c.request.headers.get('content-type')`
950
+
951
+ fnLiteral +=
952
+ `\nif(contentType){` +
953
+ `const index=contentType.indexOf(';')\n` +
954
+ `if(index!==-1)contentType=contentType.substring(0, index)}\n` +
955
+ `else{contentType=''}` +
956
+ `c.contentType=contentType\n`
957
+
958
+ fnLiteral +=
959
+ `let result=parser['${ parser } '](c, contentType)\n` +
960
+ `if(result instanceof Promise)result=await result\n` +
961
+ `if(result instanceof ElysiaCustomStatusResponse)throw result\n` +
962
+ `if(result!==undefined)c.body=result\n` +
963
+ 'delete c.contentType\n'
964
+ }
965
+
966
+ break
916
967
}
968
+
969
+ reporter . resolve ( )
917
970
} else if ( hasBodyInference ) {
918
971
fnLiteral += '\n'
919
972
fnLiteral += hasHeaders
@@ -923,74 +976,103 @@ export const composeHandler = ({
923
976
fnLiteral +=
924
977
`\nif(contentType){` +
925
978
`const index=contentType.indexOf(';')\n` +
926
- `if(index!==-1)contentType=contentType.substring(0, index)\n` +
979
+ `if(index!==-1)contentType=contentType.substring(0, index)}\n` +
980
+ `else{contentType=''}` +
927
981
`c.contentType=contentType\n`
928
982
929
- if ( hooks . parse . length ) {
930
- fnLiteral += `let used=false\n`
983
+ if ( hooks . parse . length ) fnLiteral += `let used=false\n`
931
984
932
- const reporter = report ( 'parse' , {
933
- total : hooks . parse . length
934
- } )
985
+ const reporter = report ( 'parse' , {
986
+ total : hooks . parse . length
987
+ } )
988
+
989
+ let hasDefaultParser = false
990
+ for ( let i = 0 ; i < hooks . parse . length ; i ++ ) {
991
+ const name = `bo${ i } `
992
+ if ( i !== 0 ) fnLiteral += `\nif(!used){`
935
993
936
- for ( let i = 0 ; i < hooks . parse . length ; i ++ ) {
994
+ if ( typeof hooks . parse [ i ] . fn === 'string' ) {
937
995
const endUnit = reporter . resolveChild (
938
- hooks . parse [ i ] . fn . name
996
+ hooks . parse [ i ] . fn as unknown as string
939
997
)
940
998
941
- const name = `bo${ i } `
999
+ switch ( hooks . parse [ i ] . fn as unknown as string ) {
1000
+ case 'json' :
1001
+ case 'application/json' :
1002
+ hasDefaultParser = true
1003
+ fnLiteral += adapter . parser . json ( isOptionalBody )
942
1004
943
- if ( i !== 0 ) fnLiteral += `if(!used){`
1005
+ break
944
1006
945
- fnLiteral +=
946
- `let ${ name } =parse[ ${ i } ](c,contentType)\n` +
947
- `if( ${ name } instanceof Promise) ${ name } =await ${ name } \n` +
948
- `if( ${ name } !==undefined){c.body= ${ name } ;used=true}`
1007
+ case 'text' :
1008
+ case 'text/plain' :
1009
+ hasDefaultParser = true
1010
+ fnLiteral += adapter . parser . text ( isOptionalBody )
949
1011
950
- endUnit ( )
1012
+ break
951
1013
952
- if ( i !== 0 ) fnLiteral += `}`
953
- }
1014
+ case 'urlencoded' :
1015
+ case 'application/x-www-form-urlencoded' :
1016
+ hasDefaultParser = true
1017
+ fnLiteral +=
1018
+ adapter . parser . urlencoded ( isOptionalBody )
954
1019
955
- reporter . resolve ( )
956
- }
1020
+ break
1021
+
1022
+ case 'arrayBuffer' :
1023
+ case 'application/octet-stream' :
1024
+ hasDefaultParser = true
1025
+ fnLiteral +=
1026
+ adapter . parser . arrayBuffer ( isOptionalBody )
957
1027
958
- fnLiteral += '\ndelete c.contentType\n'
1028
+ break
959
1029
960
- if ( hooks . parse . length ) fnLiteral += `if(!used){`
1030
+ case 'formdata' :
1031
+ case 'multipart/form-data' :
1032
+ hasDefaultParser = true
1033
+ fnLiteral += adapter . parser . formData ( isOptionalBody )
961
1034
962
- if ( hooks . type && ! Array . isArray ( hooks . type ) ) {
963
- switch ( hooks . type ) {
964
- case 'json' :
965
- case 'application/json' :
966
- fnLiteral += adapter . parser . json ( isOptionalBody )
967
- break
1035
+ break
968
1036
969
- case 'text' :
970
- case 'text/plain' :
971
- fnLiteral += adapter . parser . text ( isOptionalBody )
972
- break
1037
+ default :
1038
+ fnLiteral +=
1039
+ `${ name } =parser['${ hooks . parse [ i ] . fn } '](c,contentType)\n` +
1040
+ `if(${ name } instanceof Promise)${ name } =await ${ name } \n` +
1041
+ `if(${ name } !==undefined){c.body=${ name } ;used=true}\n`
1042
+ }
973
1043
974
- case 'urlencoded' :
975
- case 'application/x-www-form-urlencoded' :
976
- fnLiteral += adapter . parser . urlencoded ( isOptionalBody )
977
- break
1044
+ endUnit ( )
1045
+ } else {
1046
+ const endUnit = reporter . resolveChild (
1047
+ hooks . parse [ i ] . fn . name
1048
+ )
978
1049
979
- case 'arrayBuffer' :
980
- case 'application/octet-stream' :
981
- fnLiteral += adapter . parser . arrayBuffer ( isOptionalBody )
982
- break
1050
+ fnLiteral +=
1051
+ `let ${ name } =parse[${ i } ]\n` +
1052
+ `${ name } =${ name } (c,contentType)\n` +
1053
+ `if(${ name } instanceof Promise)${ name } =await ${ name } \n` +
1054
+ `if(${ name } !==undefined){c.body=${ name } ;used=true}`
983
1055
984
- case 'formdata' :
985
- case 'multipart/form-data' :
986
- fnLiteral += adapter . parser . formData ( isOptionalBody )
987
- break
1056
+ endUnit ( )
988
1057
}
989
- } else {
990
- fnLiteral +=
991
- `switch(contentType){` + `case 'application/json':\n`
1058
+
1059
+ if ( i !== 0 ) fnLiteral += `}`
1060
+
1061
+ if ( hasDefaultParser ) break
1062
+ }
1063
+
1064
+ reporter . resolve ( )
1065
+
1066
+ if ( ! hasDefaultParser ) {
1067
+ if ( hooks . parse . length )
1068
+ fnLiteral +=
1069
+ `\nif(!used){\n` +
1070
+ `if(!contentType) throw new ParseError()\n`
1071
+
1072
+ fnLiteral += `switch(contentType){`
992
1073
993
1074
fnLiteral +=
1075
+ `case 'application/json':\n` +
994
1076
adapter . parser . json ( isOptionalBody ) +
995
1077
`break\n` +
996
1078
`case 'text/plain':` +
@@ -1008,14 +1090,27 @@ export const composeHandler = ({
1008
1090
`case 'multipart/form-data':` +
1009
1091
adapter . parser . formData ( isOptionalBody ) +
1010
1092
`break` +
1011
- `}`
1012
- }
1093
+ '\n'
1013
1094
1014
- if ( hooks . parse . length ) fnLiteral += `}`
1095
+ for ( const key of Object . keys ( app . parser ) )
1096
+ fnLiteral +=
1097
+ `case '${ key } ':` +
1098
+ `let bo${ key } =parser['${ key } '](c,contentType)\n` +
1099
+ `if(bo${ key } instanceof Promise)bo${ key } =await bo${ key } \n` +
1100
+ `if(bo${ key } instanceof ElysiaCustomStatusResponse)throw result\n` +
1101
+ `if(bo${ key } !==undefined)c.body=bo${ key } \n` +
1102
+ `break` +
1103
+ '\n'
1104
+
1105
+ if ( hooks . parse . length ) fnLiteral += '}'
1106
+
1107
+ fnLiteral += '}'
1108
+ }
1015
1109
1016
- fnLiteral += '}'
1110
+ // fnLiteral += ' }'
1017
1111
}
1018
1112
1113
+ fnLiteral += '\ndelete c.contentType'
1019
1114
fnLiteral += '\nisParsing=false\n'
1020
1115
}
1021
1116
@@ -1809,6 +1904,7 @@ export const composeHandler = ({
1809
1904
`ElysiaCustomStatusResponse,` +
1810
1905
`ELYSIA_TRACE,` +
1811
1906
`ELYSIA_REQUEST_ID,` +
1907
+ 'parser,' +
1812
1908
`getServer,` +
1813
1909
adapterVariables +
1814
1910
'TypeBoxError' +
@@ -1862,15 +1958,13 @@ export const composeHandler = ({
1862
1958
// @ts -expect-error private property
1863
1959
getServer : ( ) => app . getServer ( ) ,
1864
1960
TypeBoxError,
1961
+ parser : app . parser ,
1865
1962
...adapter . inject
1866
1963
} )
1867
1964
} catch ( error ) {
1868
1965
const debugHooks = lifeCycleToFn ( hooks )
1869
1966
1870
1967
console . log ( '[Composer] failed to generate optimized handler' )
1871
- console . log (
1872
- 'Please report the following to Elysia maintainers privately as it may include sensitive information about your codebase:'
1873
- )
1874
1968
console . log ( '---' )
1875
1969
console . log ( {
1876
1970
handler :
0 commit comments