--- /dev/null
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const codegen_1 = require("../../compile/codegen");
+const error = {
+ message: ({ schemaCode }) => codegen_1.str `must 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.strictSchema === 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.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 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
\ No newline at end of file