sanity-advanced-validators
Version:
Advanced input validation tools for Sanity CMS.
172 lines (160 loc) • 6.84 kB
JavaScript
// src/referencedDocumentRequires.ts
var referencedDocumentRequires = (documentType, field, message = `{documentType}\u2019s {field} must be filled.`) => async (value, context) => {
if (!(value == null ? void 0 : value._ref)) {
return true;
}
const client = context.getClient({ apiVersion: "2022-08-12" });
const data = await client.fetch(`
*[_type == "${documentType}" && _id == "${value._ref}"]{
${field}
}[0]
`);
if (!data[field]) {
return message.replace("{documentType}", documentType).replace("{field}", field);
}
return true;
};
// src/fileExtension.ts
import { getExtension } from "@sanity/asset-utils";
var fileExtension = (validFileExtension, message = `Image must be of type {validFileExtension}`) => (value) => {
if (!value || !value.asset) {
return true;
}
const validExtensions = typeof validFileExtension === "string" ? [validFileExtension] : validFileExtension;
const filetype = getExtension(value.asset._ref);
if (!validExtensions.includes(filetype)) {
return message.replace("{validFileExtension}", validExtensions.join(", or "));
}
return true;
};
// src/minCount.ts
var minCount = (n, message) => (value) => {
if (!value) {
return true;
}
if (value.length < n) {
return message ? message.replace("{n}", n.toString()) : `Array must contain at least ${n} items.`;
}
return true;
};
// src/maxCount.ts
var maxCount = (n, message) => (value) => {
if (!value) {
return true;
}
if (value.length > n) {
return message ? message.replace("{n}", n.toString()) : `Array must contain at most ${n} items.`;
}
return true;
};
// src/minDimensions.ts
import { getImageDimensions } from "@sanity/asset-utils";
var minDimensions = ({ x, y }, message) => (value) => {
if (!value || !value.asset) {
return true;
}
const { width, height } = getImageDimensions(value.asset._ref);
if (!!x && width < x) {
return message ? message.replace("{width}", width.toString()).replace("{height}", height.toString()).replace("{x}", x.toString()).replace("{y}", !y ? "(any)" : y.toString()) : `Image must be at least ${x} pixels wide.`;
}
if (!!y && height < y) {
return message ? message.replace("{width}", width.toString()).replace("{height}", height.toString()).replace("{x}", !x ? "(any)" : x.toString()).replace("{y}", y.toString()) : `Image must be at least ${y} pixels tall.`;
}
return true;
};
// src/maxDimensions.ts
import { getImageDimensions as getImageDimensions2 } from "@sanity/asset-utils";
var maxDimensions = ({ x, y }, message) => (value) => {
if (!value || !value.asset) {
return true;
}
const { width, height } = getImageDimensions2(value.asset._ref);
if (!!x && width > x) {
return message ? message.replace("{width}", width.toString()).replace("{height}", height.toString()).replace("{x}", x.toString()).replace("{y}", !y ? "(any)" : y.toString()) : `Image must be at most ${x} pixels wide.`;
}
if (!!y && height > y) {
return message ? message.replace("{width}", width.toString()).replace("{height}", height.toString()).replace("{x}", !x ? "(any)" : x.toString()).replace("{y}", y.toString()) : `Image must be at most ${y} pixels tall.`;
}
return true;
};
// src/maxDepth.ts
var maxDepth = (maxDepth2, key, message = `Error: You can only nest {key} {maxDepth} levels deep.`) => (_, context) => {
let regex2 = new RegExp(String.raw`topLevelItems|${key}`);
const paths = context.path.filter((e) => typeof e === "string" && e.match(regex2));
if (paths.length > maxDepth2) {
return message.replace("{key}", key).replace("{nestedValueName}", key).replace("{maxDepth}", maxDepth2.toString());
}
return true;
};
// src/requiredIfSlugEq.ts
var requiredIfSlugEq = (slug, slugKey = "slug", message = `This is a required field.`) => (value, context) => {
var _a, _b;
const slugs = typeof slug === "string" ? [slug] : slug;
const slugValue = (_b = (_a = context.parent) == null ? void 0 : _a[slugKey]) == null ? void 0 : _b.current;
if (!value && !!slugValue && slugs.includes(slugValue)) {
return message.replace("{slugKey}", slugKey).replace("{operand}", slugs.join(", or ")).replace("{siblingSlugValue}", slugValue);
}
return true;
};
// src/requiredIfSlugNeq.ts
var requiredIfSlugNeq = (slug, slugKey = "slug", message = `This is a required field.`) => (value, context) => {
var _a, _b;
const slugs = typeof slug === "string" ? [slug] : slug;
const slugValue = (_b = (_a = context.parent) == null ? void 0 : _a[slugKey]) == null ? void 0 : _b.current;
if (!value && !slugs.includes(slugValue)) {
return message.replace("{slugKey}", slugKey).replace("{operand}", slugs.join(", or ")).replace("{siblingSlugValue}", slugValue);
}
return true;
};
// src/requiredIfSiblingEq.ts
var requiredIfSiblingEq = (key, operand, message = "Required if {key} equals {operand}.") => (value, context) => {
var _a, _b;
const siblingValue = getSibling(key, context);
const operands = Array.isArray(operand) ? operand : [operand];
if (!value && operands.includes(siblingValue)) {
return message.replace("{key}", key).replace("{operand}", (_a = operands.join(", or ")) != null ? _a : "null").replace("{value}", (_b = operands.join(", or ")) != null ? _b : "null").replace("{siblingValue}", siblingValue);
}
return true;
};
// src/requiredIfSiblingNeq.ts
var requiredIfSiblingNeq = (key, operand, message = "Required if {key} does not equal {operand}.") => (value, context) => {
var _a, _b;
const siblingValue = getSibling(key, context);
const operands = Array.isArray(operand) ? operand : [operand];
if (!value && !operands.includes(siblingValue)) {
return message.replace("{key}", key).replace("{operand}", (_a = operands.join(", or ")) != null ? _a : "null").replace("{value}", (_b = operands.join(", or ")) != null ? _b : "null").replace("{siblingValue}", siblingValue);
}
return true;
};
// src/lib/getSibling.ts
import { get } from "lodash-es";
var getSibling = (key, context) => {
if (!context.path) return void 0;
const pathToParentObject = context.path.slice(0, -1);
const sibling = get(context.document, [...pathToParentObject, key]);
return sibling;
};
// src/regex.ts
var regex = (pattern, message = `\u201C{value}\u201D does not match the pattern {pattern}.`) => (value) => {
if (!value) {
return true;
}
const valueAsString = typeof value !== "string" ? value.toString() : value;
return pattern.test(valueAsString) ? true : message.replace("{value}", valueAsString).replace("{pattern}", pattern.toString());
};
export {
fileExtension,
getSibling,
maxCount,
maxDepth,
maxDimensions,
minCount,
minDimensions,
referencedDocumentRequires,
regex,
requiredIfSiblingEq,
requiredIfSiblingNeq,
requiredIfSlugEq,
requiredIfSlugNeq
};
//# sourceMappingURL=index.js.map