UNPKG

typia

Version:

Superfast runtime validators with only one line

1 lines 4.72 kB
{"version":3,"file":"_randomInteger.mjs","names":[],"sources":["../../src/internal/_randomInteger.ts"],"sourcesContent":["import { OpenApi } from \"@typia/interface\";\n\nimport { _randomMultiple } from \"./_randomMultiple\";\n\nexport const _randomInteger = (\n schema: OpenApi.IJsonSchema.IInteger,\n): 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({ minimum, maximum })\n : _randomMultiple({\n minimum,\n maximum,\n multipleOf: schema.multipleOf,\n exclusiveMinimum: lower?.exclusive ?? false,\n exclusiveMaximum: upper?.exclusive ?? false,\n integer: true,\n });\n};\n\nconst scalar = (props: { minimum: number; maximum: number }): number => {\n const minimum: number = Math.ceil(props.minimum);\n const maximum: number = Math.floor(props.maximum);\n if (minimum > maximum) throw new Error(\"The integer range is empty.\");\n return Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;\n};\n\nconst getLowerBoundary = (\n schema: OpenApi.IJsonSchema.IInteger,\n): IBoundary | null => {\n const inclusive: IBoundary | null =\n schema.minimum === undefined\n ? null\n : { value: schema.minimum, exclusive: false };\n const exclusive: IBoundary | null =\n schema.exclusiveMinimum === undefined\n ? null\n : { value: schema.exclusiveMinimum, exclusive: true };\n const selected: IBoundary | null = selectBoundary(\n inclusive,\n exclusive,\n Math.max,\n );\n if (selected === null) return null;\n return {\n value: selected.exclusive\n ? Math.floor(selected.value) + 1\n : Math.ceil(selected.value),\n exclusive: false,\n };\n};\n\nconst getUpperBoundary = (\n schema: OpenApi.IJsonSchema.IInteger,\n): IBoundary | null => {\n const inclusive: IBoundary | null =\n schema.maximum === undefined\n ? null\n : { value: schema.maximum, exclusive: false };\n const exclusive: IBoundary | null =\n schema.exclusiveMaximum === undefined\n ? null\n : { value: schema.exclusiveMaximum, exclusive: true };\n const selected: IBoundary | null = selectBoundary(\n inclusive,\n exclusive,\n Math.min,\n );\n if (selected === null) return null;\n return {\n value: selected.exclusive\n ? Math.ceil(selected.value) - 1\n : Math.floor(selected.value),\n exclusive: false,\n };\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,kBACX,WACW;CACX,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;EAAE;EAAS;CAAQ,CAAC,IAC3B,gBAAgB;EACd;EACA;EACA,YAAY,OAAO;EACnB,kBAAkB,OAAO,aAAa;EACtC,kBAAkB,OAAO,aAAa;EACtC,SAAS;CACX,CAAC;AACP;AAEA,MAAM,UAAU,UAAwD;CACtE,MAAM,UAAkB,KAAK,KAAK,MAAM,OAAO;CAC/C,MAAM,UAAkB,KAAK,MAAM,MAAM,OAAO;CAChD,IAAI,UAAU,SAAS,MAAM,IAAI,MAAM,6BAA6B;CACpE,OAAO,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU,UAAU,EAAE,IAAI;AAC/D;AAEA,MAAM,oBACJ,WACqB;CACrB,MAAM,YACJ,OAAO,YAAY,KAAA,IACf,OACA;EAAE,OAAO,OAAO;EAAS,WAAW;CAAM;CAChD,MAAM,YACJ,OAAO,qBAAqB,KAAA,IACxB,OACA;EAAE,OAAO,OAAO;EAAkB,WAAW;CAAK;CACxD,MAAM,WAA6B,eACjC,WACA,WACA,KAAK,GACP;CACA,IAAI,aAAa,MAAM,OAAO;CAC9B,OAAO;EACL,OAAO,SAAS,YACZ,KAAK,MAAM,SAAS,KAAK,IAAI,IAC7B,KAAK,KAAK,SAAS,KAAK;EAC5B,WAAW;CACb;AACF;AAEA,MAAM,oBACJ,WACqB;CACrB,MAAM,YACJ,OAAO,YAAY,KAAA,IACf,OACA;EAAE,OAAO,OAAO;EAAS,WAAW;CAAM;CAChD,MAAM,YACJ,OAAO,qBAAqB,KAAA,IACxB,OACA;EAAE,OAAO,OAAO;EAAkB,WAAW;CAAK;CACxD,MAAM,WAA6B,eACjC,WACA,WACA,KAAK,GACP;CACA,IAAI,aAAa,MAAM,OAAO;CAC9B,OAAO;EACL,OAAO,SAAS,YACZ,KAAK,KAAK,SAAS,KAAK,IAAI,IAC5B,KAAK,MAAM,SAAS,KAAK;EAC7B,WAAW;CACb;AACF;AAEA,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"}