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.
		
		
		
		
		
			
		
			
				
					32 lines
				
				1.1 KiB
			
		
		
			
		
	
	
					32 lines
				
				1.1 KiB
			| 
											3 years ago
										 | import type {CodeKeywordDefinition} from "../../types" | ||
|  | import type {KeywordCxt} from "../../compile/validate" | ||
|  | import {_, getProperty, Code} from "../../compile/codegen" | ||
|  | import N from "../../compile/names" | ||
|  | import {SchemaEnv, compileSchema} from "../../compile" | ||
|  | import {getValidate} from "../core/ref" | ||
|  | 
 | ||
|  | const def: CodeKeywordDefinition = { | ||
|  |   keyword: "$dynamicAnchor", | ||
|  |   schemaType: "string", | ||
|  |   code: (cxt) => dynamicAnchor(cxt, cxt.schema), | ||
|  | } | ||
|  | 
 | ||
|  | export function dynamicAnchor(cxt: KeywordCxt, anchor: string): void { | ||
|  |   const {gen, it} = cxt | ||
|  |   it.schemaEnv.root.dynamicAnchors[anchor] = true | ||
|  |   const v = _`${N.dynamicAnchors}${getProperty(anchor)}` | ||
|  |   const validate = it.errSchemaPath === "#" ? it.validateName : _getValidate(cxt) | ||
|  |   gen.if(_`!${v}`, () => gen.assign(v, validate)) | ||
|  | } | ||
|  | 
 | ||
|  | function _getValidate(cxt: KeywordCxt): Code { | ||
|  |   const {schemaEnv, schema, self} = cxt.it | ||
|  |   const {root, baseId, localRefs, meta} = schemaEnv.root | ||
|  |   const {schemaId} = self.opts | ||
|  |   const sch = new SchemaEnv({schema, schemaId, root, baseId, localRefs, meta}) | ||
|  |   compileSchema.call(self, sch) | ||
|  |   return getValidate(cxt, sch) | ||
|  | } | ||
|  | 
 | ||
|  | export default def |