import type {CodeKeywordDefinition, KeywordCxt, JSONSchemaType, Name} from "ajv" import {_} from "ajv/dist/compile/codegen" import {usePattern} from "./_util" interface RegexpSchema { pattern: string flags?: string } const regexpMetaSchema: JSONSchemaType = { type: "object", properties: { pattern: {type: "string"}, flags: {type: "string", nullable: true}, }, required: ["pattern"], additionalProperties: false, } const metaRegexp = /^\/(.*)\/([gimuy]*)$/ export default function getDef(): CodeKeywordDefinition { return { keyword: "regexp", type: "string", schemaType: ["string", "object"], code(cxt: KeywordCxt) { const {data, schema} = cxt const regx = getRegExp(schema) cxt.pass(_`${regx}.test(${data})`) function getRegExp(sch: string | RegexpSchema): Name { if (typeof sch == "object") return usePattern(cxt, sch.pattern, sch.flags) const rx = metaRegexp.exec(sch) if (rx) return usePattern(cxt, rx[1], rx[2]) throw new Error("cannot parse string into RegExp") } }, metaSchema: { anyOf: [{type: "string"}, regexpMetaSchema], }, } } module.exports = getDef