4e789663a1
Memind CI / Test, build, and release guards (push) Failing after 5m19s
Drop the user_confirmed_at gate so public, online, unexpired pages can enter sitemap/llms and receive SEO/GEO tags. Defaults now enable all discovery switches; stored all-off config is still preserved until admin saves. Co-authored-by: Cursor <cursoragent@cursor.com>
87 lines
2.6 KiB
JavaScript
87 lines
2.6 KiB
JavaScript
const INDEXABLE_ACCESS_MODE = 'public';
|
|
|
|
export function normalizePublicationSnapshot(input = {}) {
|
|
if (!input || typeof input !== 'object') return null;
|
|
const accessMode = String(
|
|
input.accessMode ?? input.access_mode ?? '',
|
|
).trim();
|
|
if (!accessMode) return null;
|
|
const status = String(input.status ?? 'online').trim() || 'online';
|
|
const userConfirmedRaw =
|
|
input.userConfirmedAt ?? input.user_confirmed_at;
|
|
const userConfirmedAt =
|
|
userConfirmedRaw == null || userConfirmedRaw === ''
|
|
? null
|
|
: Number(userConfirmedRaw);
|
|
const expiresRaw = input.expiresAt ?? input.expires_at;
|
|
const expiresAt =
|
|
expiresRaw == null || expiresRaw === ''
|
|
? null
|
|
: Number(expiresRaw);
|
|
return {
|
|
id: String(input.id ?? input.publicationId ?? '').trim() || null,
|
|
pageId: String(input.pageId ?? input.page_id ?? '').trim() || null,
|
|
status,
|
|
accessMode,
|
|
userConfirmedAt:
|
|
Number.isFinite(userConfirmedAt) ? userConfirmedAt : null,
|
|
expiresAt: Number.isFinite(expiresAt) ? expiresAt : null,
|
|
publicUrl: String(input.publicUrl ?? input.public_url ?? '').trim() || null,
|
|
title: String(input.title ?? '').trim() || null,
|
|
summary: String(input.summary ?? '').trim() || null,
|
|
updatedAt:
|
|
Number(input.updatedAt ?? input.updated_at ?? input.publishedAt ?? input.published_at) ||
|
|
null,
|
|
};
|
|
}
|
|
|
|
export function isPublicationIndexable(publication, { now = Date.now() } = {}) {
|
|
const snapshot = normalizePublicationSnapshot(publication);
|
|
if (!snapshot) return false;
|
|
if (snapshot.status !== 'online') return false;
|
|
if (snapshot.accessMode !== INDEXABLE_ACCESS_MODE) return false;
|
|
if (snapshot.expiresAt != null && snapshot.expiresAt <= now) return false;
|
|
return true;
|
|
}
|
|
|
|
export function resolveIndexPolicy({
|
|
seoGeoConfig = null,
|
|
publication = null,
|
|
embed = false,
|
|
} = {}) {
|
|
if (embed) {
|
|
return {
|
|
mode: 'off',
|
|
injectNoindex: false,
|
|
reason: 'embed',
|
|
};
|
|
}
|
|
if (!seoGeoConfig?.enabled) {
|
|
return {
|
|
mode: 'off',
|
|
injectNoindex: false,
|
|
reason: 'disabled',
|
|
};
|
|
}
|
|
if (!isPublicationIndexable(publication)) {
|
|
return {
|
|
mode: 'noindex',
|
|
injectNoindex: true,
|
|
reason: publication ? 'not_indexable_publication' : 'missing_publication',
|
|
};
|
|
}
|
|
return {
|
|
mode: 'indexable',
|
|
injectNoindex: false,
|
|
reason: 'public_online',
|
|
seoEnabled: Boolean(seoGeoConfig.seo?.enabled),
|
|
geoEnabled: Boolean(seoGeoConfig.geo?.enabled),
|
|
canonicalEnabled: seoGeoConfig.seo?.canonical !== false,
|
|
jsonLdEnabled: seoGeoConfig.geo?.jsonLd !== false,
|
|
};
|
|
}
|
|
|
|
export const indexPolicyInternals = {
|
|
INDEXABLE_ACCESS_MODE,
|
|
};
|