typia
Version:
Superfast runtime validators with only one line
1 lines • 4.5 kB
Source Map (JSON)
{"version":3,"file":"_randomNumber.mjs","names":[],"sources":["../../src/internal/_randomNumber.ts"],"sourcesContent":["import { OpenApi } from \"@typia/interface\";\n\nimport { _randomMultiple } from \"./_randomMultiple\";\n\nexport const _randomNumber = (schema: OpenApi.IJsonSchema.INumber): number => {\n const lower: IBoundary | null = getLowerBoundary(schema);\n const upper: IBoundary | null = getUpperBoundary(schema);\n const minimum: number =\n lower?.value ?? (upper === null ? 0 : upper.value - 100);\n const maximum: number =\n upper?.value ?? (lower === null ? 100 : lower.value + 100);\n if (minimum > maximum)\n throw new Error(\"Minimum value is greater than maximum value.\");\n return schema.multipleOf === undefined\n ? scalar({\n minimum,\n maximum,\n exclusiveMinimum: lower?.exclusive ?? false,\n exclusiveMaximum: upper?.exclusive ?? false,\n })\n : _randomMultiple({\n minimum,\n maximum,\n multipleOf: schema.multipleOf,\n exclusiveMinimum: lower?.exclusive ?? false,\n exclusiveMaximum: upper?.exclusive ?? false,\n integer: false,\n });\n};\n\nconst scalar = (props: {\n minimum: number;\n maximum: number;\n exclusiveMinimum: boolean;\n exclusiveMaximum: boolean;\n}): number => {\n if (\n props.minimum === props.maximum &&\n (props.exclusiveMinimum || props.exclusiveMaximum)\n )\n throw new Error(\"Exclusive numeric range is empty.\");\n const value: number =\n Math.random() * (props.maximum - props.minimum) + props.minimum;\n if (\n (props.exclusiveMinimum && value === props.minimum) ||\n (props.exclusiveMaximum && value === props.maximum)\n ) {\n const middle: number = props.minimum + (props.maximum - props.minimum) / 2;\n if (middle <= props.minimum || middle >= props.maximum)\n throw new Error(\"Exclusive numeric range has no representable value.\");\n return middle;\n }\n return value;\n};\n\nconst getLowerBoundary = (\n schema: OpenApi.IJsonSchema.INumber,\n): IBoundary | null =>\n selectBoundary(\n schema.minimum === undefined\n ? null\n : { value: schema.minimum, exclusive: false },\n schema.exclusiveMinimum === undefined\n ? null\n : { value: schema.exclusiveMinimum, exclusive: true },\n Math.max,\n );\n\nconst getUpperBoundary = (\n schema: OpenApi.IJsonSchema.INumber,\n): IBoundary | null =>\n selectBoundary(\n schema.maximum === undefined\n ? null\n : { value: schema.maximum, exclusive: false },\n schema.exclusiveMaximum === undefined\n ? null\n : { value: schema.exclusiveMaximum, exclusive: true },\n Math.min,\n );\n\nconst selectBoundary = (\n x: IBoundary | null,\n y: IBoundary | null,\n compare: (x: number, y: number) => number,\n): IBoundary | null => {\n if (x === null) return y;\n if (y === null) return x;\n if (x.value === y.value)\n return { value: x.value, exclusive: x.exclusive || y.exclusive };\n return compare(x.value, y.value) === x.value ? x : y;\n};\n\ninterface IBoundary {\n value: number;\n exclusive: boolean;\n}\n"],"mappings":";;AAIA,MAAa,iBAAiB,WAAgD;CAC5E,MAAM,QAA0B,iBAAiB,MAAM;CACvD,MAAM,QAA0B,iBAAiB,MAAM;CACvD,MAAM,UACJ,OAAO,UAAU,UAAU,OAAO,IAAI,MAAM,QAAQ;CACtD,MAAM,UACJ,OAAO,UAAU,UAAU,OAAO,MAAM,MAAM,QAAQ;CACxD,IAAI,UAAU,SACZ,MAAM,IAAI,MAAM,8CAA8C;CAChE,OAAO,OAAO,eAAe,KAAA,IACzB,OAAO;EACL;EACA;EACA,kBAAkB,OAAO,aAAa;EACtC,kBAAkB,OAAO,aAAa;CACxC,CAAC,IACD,gBAAgB;EACd;EACA;EACA,YAAY,OAAO;EACnB,kBAAkB,OAAO,aAAa;EACtC,kBAAkB,OAAO,aAAa;EACtC,SAAS;CACX,CAAC;AACP;AAEA,MAAM,UAAU,UAKF;CACZ,IACE,MAAM,YAAY,MAAM,YACvB,MAAM,oBAAoB,MAAM,mBAEjC,MAAM,IAAI,MAAM,mCAAmC;CACrD,MAAM,QACJ,KAAK,OAAO,KAAK,MAAM,UAAU,MAAM,WAAW,MAAM;CAC1D,IACG,MAAM,oBAAoB,UAAU,MAAM,WAC1C,MAAM,oBAAoB,UAAU,MAAM,SAC3C;EACA,MAAM,SAAiB,MAAM,WAAW,MAAM,UAAU,MAAM,WAAW;EACzE,IAAI,UAAU,MAAM,WAAW,UAAU,MAAM,SAC7C,MAAM,IAAI,MAAM,qDAAqD;EACvE,OAAO;CACT;CACA,OAAO;AACT;AAEA,MAAM,oBACJ,WAEA,eACE,OAAO,YAAY,KAAA,IACf,OACA;CAAE,OAAO,OAAO;CAAS,WAAW;AAAM,GAC9C,OAAO,qBAAqB,KAAA,IACxB,OACA;CAAE,OAAO,OAAO;CAAkB,WAAW;AAAK,GACtD,KAAK,GACP;AAEF,MAAM,oBACJ,WAEA,eACE,OAAO,YAAY,KAAA,IACf,OACA;CAAE,OAAO,OAAO;CAAS,WAAW;AAAM,GAC9C,OAAO,qBAAqB,KAAA,IACxB,OACA;CAAE,OAAO,OAAO;CAAkB,WAAW;AAAK,GACtD,KAAK,GACP;AAEF,MAAM,kBACJ,GACA,GACA,YACqB;CACrB,IAAI,MAAM,MAAM,OAAO;CACvB,IAAI,MAAM,MAAM,OAAO;CACvB,IAAI,EAAE,UAAU,EAAE,OAChB,OAAO;EAAE,OAAO,EAAE;EAAO,WAAW,EAAE,aAAa,EAAE;CAAU;CACjE,OAAO,QAAQ,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,QAAQ,IAAI;AACrD"}