Add an array Validator

This commit is contained in:
Michael B. Gale
2026-07-09 23:36:50 +01:00
parent fb5048ee88
commit 6a62e99aa7
2 changed files with 27 additions and 0 deletions

View File

@@ -68,6 +68,23 @@ test("validateSchema - optional properties are optional", async (t) => {
t.true(json.validateSchema(optionalSchema, { optionalKey: "foo" }));
});
const arraySchema = {
arrayKey: json.array(json.number),
};
test("validateSchema - validates arrays", async (t) => {
// Arrays of numeric elements are accepted.
t.true(json.validateSchema(arraySchema, { arrayKey: [] }));
t.true(json.validateSchema(arraySchema, { arrayKey: [4] }));
t.true(json.validateSchema(arraySchema, { arrayKey: [4, 8] }));
t.true(json.validateSchema(arraySchema, { arrayKey: [4, 8, 15] }));
// Other array elements are not accepted.
t.false(json.validateSchema(arraySchema, { arrayKey: [4, 8, 15, "bar"] }));
t.false(json.validateSchema(arraySchema, { arrayKey: [4, 8, undefined] }));
t.false(json.validateSchema(arraySchema, { arrayKey: [4, 8, 15, null] }));
});
test("validateSchema - checkSchema reports unknown keys", async (t) => {
const result = json.checkSchema(testSchema, {
requiredKey: "foo",

View File

@@ -66,6 +66,16 @@ export const number = {
required: true,
} as const satisfies Validator<number>;
/** A validator for arrays. */
export function array<T>(validator: Validator<T>) {
return {
validate: (val: unknown) => {
return isArray(val) && val.every((e) => validator.validate(e));
},
required: true,
} as const satisfies Validator<T[]>;
}
/**
* Transforms a validator to be optional, accepting `undefined` or `null` for an
* absent value.