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.
		
		
		
		
		
			
		
			
				
					58 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					58 lines
				
				1.8 KiB
			| 
											3 years ago
										 | import type {CodeKeywordDefinition} from "../../types" | ||
|  | import {KeywordCxt} from "../../compile/validate" | ||
|  | import {propertyInData, allSchemaProperties} from "../code" | ||
|  | import {alwaysValidSchema, toHash, mergeEvaluated} from "../../compile/util" | ||
|  | import apDef from "./additionalProperties" | ||
|  | 
 | ||
|  | const def: CodeKeywordDefinition = { | ||
|  |   keyword: "properties", | ||
|  |   type: "object", | ||
|  |   schemaType: "object", | ||
|  |   code(cxt: KeywordCxt) { | ||
|  |     const {gen, schema, parentSchema, data, it} = cxt | ||
|  |     if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === undefined) { | ||
|  |       apDef.code(new KeywordCxt(it, apDef, "additionalProperties")) | ||
|  |     } | ||
|  |     const allProps = allSchemaProperties(schema) | ||
|  |     for (const prop of allProps) { | ||
|  |       it.definedProperties.add(prop) | ||
|  |     } | ||
|  |     if (it.opts.unevaluated && allProps.length && it.props !== true) { | ||
|  |       it.props = mergeEvaluated.props(gen, toHash(allProps), it.props) | ||
|  |     } | ||
|  |     const properties = allProps.filter((p) => !alwaysValidSchema(it, schema[p])) | ||
|  |     if (properties.length === 0) return | ||
|  |     const valid = gen.name("valid") | ||
|  | 
 | ||
|  |     for (const prop of properties) { | ||
|  |       if (hasDefault(prop)) { | ||
|  |         applyPropertySchema(prop) | ||
|  |       } else { | ||
|  |         gen.if(propertyInData(gen, data, prop, it.opts.ownProperties)) | ||
|  |         applyPropertySchema(prop) | ||
|  |         if (!it.allErrors) gen.else().var(valid, true) | ||
|  |         gen.endIf() | ||
|  |       } | ||
|  |       cxt.it.definedProperties.add(prop) | ||
|  |       cxt.ok(valid) | ||
|  |     } | ||
|  | 
 | ||
|  |     function hasDefault(prop: string): boolean | undefined { | ||
|  |       return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== undefined | ||
|  |     } | ||
|  | 
 | ||
|  |     function applyPropertySchema(prop: string): void { | ||
|  |       cxt.subschema( | ||
|  |         { | ||
|  |           keyword: "properties", | ||
|  |           schemaProp: prop, | ||
|  |           dataProp: prop, | ||
|  |         }, | ||
|  |         valid | ||
|  |       ) | ||
|  |     } | ||
|  |   }, | ||
|  | } | ||
|  | 
 | ||
|  | export default def |