50 lines
1.2 KiB
TypeScript
Executable file
50 lines
1.2 KiB
TypeScript
Executable file
import type {
|
|
CodeKeywordDefinition,
|
|
ErrorObject,
|
|
KeywordErrorDefinition,
|
|
AnySchema,
|
|
} from "../../types"
|
|
import type {KeywordCxt} from "../../compile/validate"
|
|
import {_, not} from "../../compile/codegen"
|
|
import {alwaysValidSchema} from "../../compile/util"
|
|
|
|
export type PropertyNamesError = ErrorObject<"propertyNames", {propertyName: string}, AnySchema>
|
|
|
|
const error: KeywordErrorDefinition = {
|
|
message: "property name must be valid",
|
|
params: ({params}) => _`{propertyName: ${params.propertyName}}`,
|
|
}
|
|
|
|
const def: CodeKeywordDefinition = {
|
|
keyword: "propertyNames",
|
|
type: "object",
|
|
schemaType: ["object", "boolean"],
|
|
error,
|
|
code(cxt: KeywordCxt) {
|
|
const {gen, schema, data, it} = cxt
|
|
if (alwaysValidSchema(it, schema)) return
|
|
const valid = gen.name("valid")
|
|
|
|
gen.forIn("key", data, (key) => {
|
|
cxt.setParams({propertyName: key})
|
|
cxt.subschema(
|
|
{
|
|
keyword: "propertyNames",
|
|
data: key,
|
|
dataTypes: ["string"],
|
|
propertyName: key,
|
|
compositeRule: true,
|
|
},
|
|
valid
|
|
)
|
|
gen.if(not(valid), () => {
|
|
cxt.error(true)
|
|
if (!it.allErrors) gen.break()
|
|
})
|
|
})
|
|
|
|
cxt.ok(valid)
|
|
},
|
|
}
|
|
|
|
export default def
|