persona-community-5/.pnpm-store/v3/files/6f/d64acffc1c85a8dc5322fb0fbf831bbb01f3d6777a2ab16fe62267a0332c7adbf50e93c3ba434b68dfde336c3690308136ba0aaed94fe584cb25b893d533b0
rdev-worker a1d0d1bf1c
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
build: /implement-feature community-ui --requirements 'Build the React commu...
2026-02-24 08:22:30 +00:00

76 lines
1.7 KiB
Plaintext

import type {
CodeKeywordDefinition,
ErrorObject,
KeywordErrorDefinition,
KeywordErrorCxt,
} from "../../../types"
import type {KeywordCxt} from "../../../compile/validate"
import {_, str, operators, Code} from "../../../compile/codegen"
const ops = operators
export type LimitKwd = "maximum" | "minimum"
export type ExclusiveLimitKwd = "exclusiveMaximum" | "exclusiveMinimum"
type Comparison = "<=" | ">=" | "<" | ">"
interface KwdOp {
okStr: Comparison
ok: Code
fail: Code
}
interface KwdDef {
exclusive: ExclusiveLimitKwd
ops: [KwdOp, KwdOp]
}
const KWDs: {[K in LimitKwd]: KwdDef} = {
maximum: {
exclusive: "exclusiveMaximum",
ops: [
{okStr: "<=", ok: ops.LTE, fail: ops.GT},
{okStr: "<", ok: ops.LT, fail: ops.GTE},
],
},
minimum: {
exclusive: "exclusiveMinimum",
ops: [
{okStr: ">=", ok: ops.GTE, fail: ops.LT},
{okStr: ">", ok: ops.GT, fail: ops.LTE},
],
},
}
export type LimitNumberError = ErrorObject<
LimitKwd,
{limit: number; comparison: Comparison},
number | {$data: string}
>
const error: KeywordErrorDefinition = {
message: (cxt) => str`must be ${kwdOp(cxt).okStr} ${cxt.schemaCode}`,
params: (cxt) => _`{comparison: ${kwdOp(cxt).okStr}, limit: ${cxt.schemaCode}}`,
}
const def: CodeKeywordDefinition = {
keyword: Object.keys(KWDs),
type: "number",
schemaType: "number",
$data: true,
error,
code(cxt: KeywordCxt) {
const {data, schemaCode} = cxt
cxt.fail$data(_`${data} ${kwdOp(cxt).fail} ${schemaCode} || isNaN(${data})`)
},
}
function kwdOp(cxt: KeywordErrorCxt): KwdOp {
const keyword = cxt.keyword as LimitKwd
const opsIdx = cxt.parentSchema?.[KWDs[keyword].exclusive] ? 1 : 0
return KWDs[keyword].ops[opsIdx]
}
export default def