blob: bce677bf88a206ae08137c8f707679799cf8b77f [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("ajv/dist/compile/codegen");
const _util_1 = require("./_util");
const error = {
message: ({ params: { schemaProp } }) => schemaProp
? (0, codegen_1.str) `should match case "${schemaProp}" schema`
: (0, codegen_1.str) `should match default case schema`,
params: ({ params: { schemaProp } }) => schemaProp ? (0, codegen_1._) `{failingCase: ${schemaProp}}` : (0, codegen_1._) `{failingDefault: true}`,
};
function getDef(opts) {
const metaSchema = (0, _util_1.metaSchemaRef)(opts);
return [
{
keyword: "select",
schemaType: ["string", "number", "boolean", "null"],
$data: true,
error,
dependencies: ["selectCases"],
code(cxt) {
const { gen, schemaCode, parentSchema } = cxt;
cxt.block$data(codegen_1.nil, () => {
const valid = gen.let("valid", true);
const schValid = gen.name("_valid");
const value = gen.const("value", (0, codegen_1._) `${schemaCode} === null ? "null" : ${schemaCode}`);
gen.if(false); // optimizer should remove it from generated code
for (const schemaProp in parentSchema.selectCases) {
cxt.setParams({ schemaProp });
gen.elseIf((0, codegen_1._) `"" + ${value} == ${schemaProp}`); // intentional ==, to match numbers and booleans
const schCxt = cxt.subschema({ keyword: "selectCases", schemaProp }, schValid);
cxt.mergeEvaluated(schCxt, codegen_1.Name);
gen.assign(valid, schValid);
}
gen.else();
if (parentSchema.selectDefault !== undefined) {
cxt.setParams({ schemaProp: undefined });
const schCxt = cxt.subschema({ keyword: "selectDefault" }, schValid);
cxt.mergeEvaluated(schCxt, codegen_1.Name);
gen.assign(valid, schValid);
}
gen.endIf();
cxt.pass(valid);
});
},
},
{
keyword: "selectCases",
dependencies: ["select"],
metaSchema: {
type: "object",
additionalProperties: metaSchema,
},
},
{
keyword: "selectDefault",
dependencies: ["select", "selectCases"],
metaSchema,
},
];
}
exports.default = getDef;
module.exports = getDef;
//# sourceMappingURL=select.js.map