You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							51 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							51 lines
						
					
					
						
							1.9 KiB
						
					
					
				"use strict";
 | 
						|
Object.defineProperty(exports, "__esModule", { value: true });
 | 
						|
exports.dynamicRef = void 0;
 | 
						|
const codegen_1 = require("../../compile/codegen");
 | 
						|
const names_1 = require("../../compile/names");
 | 
						|
const ref_1 = require("../core/ref");
 | 
						|
const def = {
 | 
						|
    keyword: "$dynamicRef",
 | 
						|
    schemaType: "string",
 | 
						|
    code: (cxt) => dynamicRef(cxt, cxt.schema),
 | 
						|
};
 | 
						|
function dynamicRef(cxt, ref) {
 | 
						|
    const { gen, keyword, it } = cxt;
 | 
						|
    if (ref[0] !== "#")
 | 
						|
        throw new Error(`"${keyword}" only supports hash fragment reference`);
 | 
						|
    const anchor = ref.slice(1);
 | 
						|
    if (it.allErrors) {
 | 
						|
        _dynamicRef();
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        const valid = gen.let("valid", false);
 | 
						|
        _dynamicRef(valid);
 | 
						|
        cxt.ok(valid);
 | 
						|
    }
 | 
						|
    function _dynamicRef(valid) {
 | 
						|
        // TODO the assumption here is that `recursiveRef: #` always points to the root
 | 
						|
        // of the schema object, which is not correct, because there may be $id that
 | 
						|
        // makes # point to it, and the target schema may not contain dynamic/recursiveAnchor.
 | 
						|
        // Because of that 2 tests in recursiveRef.json fail.
 | 
						|
        // This is a similar problem to #815 (`$id` doesn't alter resolution scope for `{ "$ref": "#" }`).
 | 
						|
        // (This problem is not tested in JSON-Schema-Test-Suite)
 | 
						|
        if (it.schemaEnv.root.dynamicAnchors[anchor]) {
 | 
						|
            const v = gen.let("_v", (0, codegen_1._) `${names_1.default.dynamicAnchors}${(0, codegen_1.getProperty)(anchor)}`);
 | 
						|
            gen.if(v, _callRef(v, valid), _callRef(it.validateName, valid));
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            _callRef(it.validateName, valid)();
 | 
						|
        }
 | 
						|
    }
 | 
						|
    function _callRef(validate, valid) {
 | 
						|
        return valid
 | 
						|
            ? () => gen.block(() => {
 | 
						|
                (0, ref_1.callRef)(cxt, validate);
 | 
						|
                gen.let(valid, true);
 | 
						|
            })
 | 
						|
            : () => (0, ref_1.callRef)(cxt, validate);
 | 
						|
    }
 | 
						|
}
 | 
						|
exports.dynamicRef = dynamicRef;
 | 
						|
exports.default = def;
 | 
						|
//# sourceMappingURL=dynamicRef.js.map
 |