@@ -246,11 +246,12 @@ export type StringFieldMeta = BaseFieldMeta & {
246246}
247247
248248export type NumberFieldMeta = BaseFieldMeta & {
249- type : "number" | "int"
249+ type : "number"
250250 minimum ?: number
251251 maximum ?: number
252252 exclusiveMinimum ?: number
253253 exclusiveMaximum ?: number
254+ refinement ?: "int"
254255}
255256
256257export type SelectFieldMeta = BaseFieldMeta & {
@@ -682,7 +683,8 @@ export const createMeta = <T = any>(
682683 // if this is S.Int (a refinement), set the type and skip following "from"
683684 // otherwise we'd lose the "Int" information and get "number" instead
684685 if ( titleType === "Int" || titleType === "int" ) {
685- meta [ "type" ] = "int"
686+ meta [ "type" ] = "number"
687+ meta [ "refinement" ] = "int"
686688 // don't follow "from" for Int refinements
687689 } else if ( "from" in property ) {
688690 return createMeta < T > ( {
@@ -888,66 +890,28 @@ export const generateInputStandardSchemaFromFieldMeta = (
888890 }
889891 break
890892
891- case "int" : {
892- // create a custom integer schema with translations
893- // S.Number with empty message, then S.int with integer message
894- schema = S
895- . Number
896- . annotations ( {
897- message : ( ) => trans ( "validation.empty" )
898- } )
899- . pipe (
900- S . int ( { message : ( issue ) => trans ( "validation.integer.expected" , { actualValue : String ( issue . actual ) } ) } )
901- )
902- if ( typeof meta . minimum === "number" ) {
903- schema = schema . pipe ( S . greaterThanOrEqualTo ( meta . minimum ) ) . annotations ( {
904- message : ( ) =>
905- trans ( meta . minimum === 0 ? "validation.number.positive" : "validation.number.min" , {
906- minimum : meta . minimum ,
907- isExclusive : true
908- } )
909- } )
910- }
911- if ( typeof meta . maximum === "number" ) {
912- schema = schema . pipe ( S . lessThanOrEqualTo ( meta . maximum ) ) . annotations ( {
913- message : ( ) =>
914- trans ( "validation.number.max" , {
915- maximum : meta . maximum ,
916- isExclusive : true
917- } )
918- } )
919- }
920- if ( typeof meta . exclusiveMinimum === "number" ) {
921- schema = schema . pipe ( S . greaterThan ( meta . exclusiveMinimum ) ) . annotations ( {
922- message : ( ) =>
923- trans ( meta . exclusiveMinimum === 0 ? "validation.number.positive" : "validation.number.min" , {
924- minimum : meta . exclusiveMinimum ,
925- isExclusive : false
926- } )
927- } )
928- }
929- if ( typeof meta . exclusiveMaximum === "number" ) {
930- schema = schema . pipe ( S . lessThan ( meta . exclusiveMaximum ) ) . annotations ( {
931- message : ( ) =>
932- trans ( "validation.number.max" , {
933- maximum : meta . exclusiveMaximum ,
934- isExclusive : false
935- } )
936- } )
937- }
938- break
939- }
940-
941893 case "number" :
942- schema = S . Number . annotations ( {
943- message : ( ) => trans ( "validation.number.expected" , { actualValue : "NaN" } )
944- } )
945-
946- if ( meta . required ) {
947- schema . annotations ( {
948- message : ( ) => trans ( "validation.empty" )
894+ if ( meta . refinement === "int" ) {
895+ schema = S
896+ . Number
897+ . annotations ( {
898+ message : ( ) => trans ( "validation.empty" )
899+ } )
900+ . pipe (
901+ S . int ( { message : ( issue ) => trans ( "validation.integer.expected" , { actualValue : String ( issue . actual ) } ) } )
902+ )
903+ } else {
904+ schema = S . Number . annotations ( {
905+ message : ( ) => trans ( "validation.number.expected" , { actualValue : "NaN" } )
949906 } )
907+
908+ if ( meta . required ) {
909+ schema . annotations ( {
910+ message : ( ) => trans ( "validation.empty" )
911+ } )
912+ }
950913 }
914+
951915 if ( typeof meta . minimum === "number" ) {
952916 schema = schema . pipe ( S . greaterThanOrEqualTo ( meta . minimum ) ) . annotations ( {
953917 message : ( ) =>
0 commit comments