92 lines
4.2 KiB
JavaScript
92 lines
4.2 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
const codegen_1 = require("../../compile/codegen");
|
||
|
const error = {
|
||
|
message: ({ schemaCode }) => (0, codegen_1.str) `must match format "${schemaCode}"`,
|
||
|
params: ({ schemaCode }) => (0, codegen_1._) `{format: ${schemaCode}}`,
|
||
|
};
|
||
|
const def = {
|
||
|
keyword: "format",
|
||
|
type: ["number", "string"],
|
||
|
schemaType: "string",
|
||
|
$data: true,
|
||
|
error,
|
||
|
code(cxt, ruleType) {
|
||
|
const { gen, data, $data, schema, schemaCode, it } = cxt;
|
||
|
const { opts, errSchemaPath, schemaEnv, self } = it;
|
||
|
if (!opts.validateFormats)
|
||
|
return;
|
||
|
if ($data)
|
||
|
validate$DataFormat();
|
||
|
else
|
||
|
validateFormat();
|
||
|
function validate$DataFormat() {
|
||
|
const fmts = gen.scopeValue("formats", {
|
||
|
ref: self.formats,
|
||
|
code: opts.code.formats,
|
||
|
});
|
||
|
const fDef = gen.const("fDef", (0, codegen_1._) `${fmts}[${schemaCode}]`);
|
||
|
const fType = gen.let("fType");
|
||
|
const format = gen.let("format");
|
||
|
// TODO simplify
|
||
|
gen.if((0, codegen_1._) `typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._) `${fDef}.type || "string"`).assign(format, (0, codegen_1._) `${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._) `"string"`).assign(format, fDef));
|
||
|
cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt()));
|
||
|
function unknownFmt() {
|
||
|
if (opts.strictSchema === false)
|
||
|
return codegen_1.nil;
|
||
|
return (0, codegen_1._) `${schemaCode} && !${format}`;
|
||
|
}
|
||
|
function invalidFmt() {
|
||
|
const callFormat = schemaEnv.$async
|
||
|
? (0, codegen_1._) `(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))`
|
||
|
: (0, codegen_1._) `${format}(${data})`;
|
||
|
const validData = (0, codegen_1._) `(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`;
|
||
|
return (0, codegen_1._) `${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`;
|
||
|
}
|
||
|
}
|
||
|
function validateFormat() {
|
||
|
const formatDef = self.formats[schema];
|
||
|
if (!formatDef) {
|
||
|
unknownFormat();
|
||
|
return;
|
||
|
}
|
||
|
if (formatDef === true)
|
||
|
return;
|
||
|
const [fmtType, format, fmtRef] = getFormat(formatDef);
|
||
|
if (fmtType === ruleType)
|
||
|
cxt.pass(validCondition());
|
||
|
function unknownFormat() {
|
||
|
if (opts.strictSchema === false) {
|
||
|
self.logger.warn(unknownMsg());
|
||
|
return;
|
||
|
}
|
||
|
throw new Error(unknownMsg());
|
||
|
function unknownMsg() {
|
||
|
return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`;
|
||
|
}
|
||
|
}
|
||
|
function getFormat(fmtDef) {
|
||
|
const code = fmtDef instanceof RegExp
|
||
|
? (0, codegen_1.regexpCode)(fmtDef)
|
||
|
: opts.code.formats
|
||
|
? (0, codegen_1._) `${opts.code.formats}${(0, codegen_1.getProperty)(schema)}`
|
||
|
: undefined;
|
||
|
const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code });
|
||
|
if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) {
|
||
|
return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._) `${fmt}.validate`];
|
||
|
}
|
||
|
return ["string", fmtDef, fmt];
|
||
|
}
|
||
|
function validCondition() {
|
||
|
if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) {
|
||
|
if (!schemaEnv.$async)
|
||
|
throw new Error("async format in sync schema");
|
||
|
return (0, codegen_1._) `await ${fmtRef}(${data})`;
|
||
|
}
|
||
|
return typeof format == "function" ? (0, codegen_1._) `${fmtRef}(${data})` : (0, codegen_1._) `${fmtRef}.test(${data})`;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
};
|
||
|
exports.default = def;
|
||
|
//# sourceMappingURL=format.js.map
|