12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- const codegen_1 = require("../../compile/codegen");
- const error = {
- message: ({ schemaCode }) => codegen_1.str `should match format "${schemaCode}"`,
- params: ({ schemaCode }) => 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", codegen_1._ `${fmts}[${schemaCode}]`);
- const fType = gen.let("fType");
- const format = gen.let("format");
- // TODO simplify
- gen.if(codegen_1._ `typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, codegen_1._ `${fDef}.type || "string"`).assign(format, codegen_1._ `${fDef}.validate`), () => gen.assign(fType, codegen_1._ `"string"`).assign(format, fDef));
- cxt.fail$data(codegen_1.or(unknownFmt(), invalidFmt()));
- function unknownFmt() {
- if (opts.strict === false)
- return codegen_1.nil;
- return codegen_1._ `${schemaCode} && !${format}`;
- }
- function invalidFmt() {
- const callFormat = schemaEnv.$async
- ? codegen_1._ `(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))`
- : codegen_1._ `${format}(${data})`;
- const validData = codegen_1._ `(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`;
- return 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.strict === 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 fmt = gen.scopeValue("formats", {
- key: schema,
- ref: fmtDef,
- code: opts.code.formats ? codegen_1._ `${opts.code.formats}${codegen_1.getProperty(schema)}` : undefined,
- });
- if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) {
- return [fmtDef.type || "string", fmtDef.validate, 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 codegen_1._ `await ${fmtRef}(${data})`;
- }
- return typeof format == "function" ? codegen_1._ `${fmtRef}(${data})` : codegen_1._ `${fmtRef}.test(${data})`;
- }
- }
- },
- };
- exports.default = def;
- //# sourceMappingURL=format.js.map
|