payload
Version:
Node, React, Headless CMS and Application Framework built on Next.js
84 lines (83 loc) • 3.66 kB
JavaScript
import { hasAutosaveEnabled } from '../../../utilities/getVersionsConfig.js';
import { slugify as defaultSlugify } from '../../../utilities/slugify.js';
import { countVersions } from './countVersions.js';
const slugify = ({ customSlugify, data, req, valueToSlugify })=>{
if (customSlugify) {
return customSlugify({
data,
req,
valueToSlugify
});
}
return defaultSlugify(valueToSlugify);
};
/**
* This is a `BeforeChange` field hook used to auto-generate the `slug` field.
* See `slugField` for more details.
*/ export const generateSlug = ({ slugFieldName, slugify: customSlugify, useAsSlug })=>async ({ collection, data, global, operation, originalDoc, req, value: isChecked })=>{
if (operation === 'create') {
if (data) {
data[slugFieldName] = slugify({
customSlugify,
data,
req,
// Ensure user-defined slugs are not overwritten during create
// Use a generic falsy check here to include empty strings
valueToSlugify: data?.[slugFieldName] || data?.[useAsSlug]
});
}
return Boolean(!data?.[slugFieldName]);
}
if (operation === 'update') {
// Early return to avoid additional processing
if (!isChecked) {
return false;
}
if (!hasAutosaveEnabled(collection || global)) {
// We can generate the slug at this point
if (data) {
data[slugFieldName] = slugify({
customSlugify,
data,
req,
valueToSlugify: data?.[useAsSlug]
});
}
return Boolean(!data?.[slugFieldName]);
} else {
// If we're publishing, we can avoid querying as we can safely assume we've exceeded the version threshold (2)
const isPublishing = data?._status === 'published';
// Ensure the user can take over the generated slug themselves without it ever being overridden back
const userOverride = data?.[slugFieldName] !== originalDoc?.[slugFieldName];
if (!userOverride) {
if (data) {
// If the fallback is an empty string, we want the slug to return to `null`
// This will ensure that live preview conditions continue to run as expected
data[slugFieldName] = data?.[useAsSlug] ? slugify({
customSlugify,
data,
req,
valueToSlugify: data?.[useAsSlug]
}) : null;
}
}
if (isPublishing || userOverride) {
return false;
}
// Important: ensure `countVersions` is not called unnecessarily often
// That is why this is buried beneath all these conditions
const versionCount = await countVersions({
collectionSlug: collection?.slug,
globalSlug: global?.slug,
parentID: originalDoc?.id,
req
});
if (versionCount <= 2) {
return true;
} else {
return false;
}
}
}
};
//# sourceMappingURL=generateSlug.js.map