Spaces:
Running
Running
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<RegexpSchema> = { | |
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 | |