fix(seed): rename reserved 'status' field to 'parity_status'
ci/woodpecker/push/container Pipeline was canceled

emdash reserves 'status' as a built-in entry field (publish state), so
'emdash seed' rejected the plugins collection's custom 'status' select
with 'Field slug status is reserved' — leaving the catalog empty. Rename
the domain field slug to parity_status (label stays 'Migration status')
across the seed field def + 39 entries, the collections type, and all
plugin-data reads. The public ?status= URL filter param and StatusBadge
prop name are unchanged.
This commit is contained in:
Oleks
2026-06-14 14:25:15 +03:00
parent 9b1090b614
commit 0072716733
5 changed files with 1044 additions and 1032 deletions
+55 -43
View File
@@ -16,7 +16,10 @@
"label": "CMS platforms",
"labelSingular": "CMS platform",
"urlPattern": "/cms/{slug}",
"supports": ["search", "seo"],
"supports": [
"search",
"seo"
],
"fields": [
{
"slug": "title",
@@ -43,7 +46,11 @@
"label": "Plugins",
"labelSingular": "Plugin",
"urlPattern": "/plugins/{slug}",
"supports": ["drafts", "search", "seo"],
"supports": [
"drafts",
"search",
"seo"
],
"fields": [
{
"slug": "title",
@@ -81,7 +88,7 @@
"description": "e-commerce, SEO, content, performance, etc."
},
{
"slug": "status",
"slug": "parity_status",
"label": "Migration status",
"type": "select",
"required": true,
@@ -141,7 +148,12 @@
"label": "Pages",
"labelSingular": "Page",
"urlPattern": "/{slug}",
"supports": ["drafts", "revisions", "search", "seo"],
"supports": [
"drafts",
"revisions",
"search",
"seo"
],
"fields": [
{
"slug": "title",
@@ -227,7 +239,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated",
"parity_status": "gated",
"source_repo_url": "https://wordpress.org/plugins/woocommerce/",
"notes": [
{
@@ -252,7 +264,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated",
"parity_status": "gated",
"notes": [
{
"_type": "block",
@@ -276,7 +288,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated",
"parity_status": "gated",
"notes": [
{
"_type": "block",
@@ -300,7 +312,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -312,7 +324,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -324,7 +336,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -336,7 +348,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -360,7 +372,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "marketing",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -372,7 +384,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "i18n",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -396,7 +408,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "i18n",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -420,7 +432,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "page-builder",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -444,7 +456,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "theme",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -468,7 +480,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "performance",
"status": "built-in",
"parity_status": "built-in",
"notes": [
{
"_type": "block",
@@ -492,7 +504,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "performance",
"status": "built-in",
"parity_status": "built-in",
"notes": [
{
"_type": "block",
@@ -516,7 +528,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "performance",
"status": "built-in",
"parity_status": "built-in",
"notes": [
{
"_type": "block",
@@ -540,7 +552,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "ops",
"status": "saas",
"parity_status": "saas",
"notes": [
{
"_type": "block",
@@ -564,7 +576,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "performance",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -588,7 +600,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "mail",
"status": "saas",
"parity_status": "saas",
"notes": [
{
"_type": "block",
@@ -612,7 +624,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "mail",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -636,7 +648,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "forms",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -660,7 +672,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "content",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -684,7 +696,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "content",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -708,7 +720,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "content",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -732,7 +744,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "editor",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -756,7 +768,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "analytics",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -780,7 +792,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "auth",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -804,7 +816,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "theme",
"status": "drop"
"parity_status": "drop"
}
},
{
@@ -816,7 +828,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "ops",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -840,7 +852,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "ops",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -864,7 +876,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "ops",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
@@ -888,7 +900,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -900,7 +912,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -912,7 +924,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -924,7 +936,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -936,7 +948,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -948,7 +960,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "e-commerce",
"status": "gated"
"parity_status": "gated"
}
},
{
@@ -960,7 +972,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "theme",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -984,7 +996,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "theme",
"status": "drop",
"parity_status": "drop",
"notes": [
{
"_type": "block",
@@ -1008,7 +1020,7 @@
"source_cms": "WordPress",
"target_cms": "Emdash",
"category": "security",
"status": "port",
"parity_status": "port",
"notes": [
{
"_type": "block",
+2 -2
View File
@@ -7,7 +7,7 @@ interface Props {
data: {
title: string;
purpose?: string | null;
status?: string | null;
parity_status?: string | null;
source_cms?: string | null;
target_cms?: string | null;
};
@@ -19,7 +19,7 @@ const d = entry.data;
<li class="plugin-card">
<h3><a href={`/plugins/${entry.id}`}>{d.title}</a></h3>
<div class="meta">
<StatusBadge status={d.status} />
<StatusBadge status={d.parity_status} />
{d.source_cms && <span>{d.source_cms}{d.target_cms ? ` → ${d.target_cms}` : ""}</span>}
</div>
{d.purpose && <p>{d.purpose}</p>}
+1 -1
View File
@@ -28,7 +28,7 @@ declare module "emdash" {
source_cms: string;
target_cms?: string | null;
category?: string | null;
status: string;
parity_status: string;
source_repo_url?: string | null;
target_repo_url?: string | null;
notes?: import("emdash").PortableTextBlock[] | null;
+2 -2
View File
@@ -20,13 +20,13 @@ const statusFilter = url.searchParams.get("status") ?? "";
const sourceFilter = url.searchParams.get("source") ?? "";
const sources = Array.from(new Set(plugins.map((p) => p.data.source_cms).filter(Boolean))).sort();
const present = new Set(plugins.map((p) => p.data.status).filter(Boolean));
const present = new Set(plugins.map((p) => p.data.parity_status).filter(Boolean));
const statuses = STATUSES.filter((s) => present.has(s.value));
const filtered = plugins.filter((p) => {
const d = p.data;
if (q && !(`${d.title} ${d.purpose ?? ""}`.toLowerCase().includes(q))) return false;
if (statusFilter && d.status !== statusFilter) return false;
if (statusFilter && d.parity_status !== statusFilter) return false;
if (sourceFilter && d.source_cms !== sourceFilter) return false;
return true;
});
+1 -1
View File
@@ -50,7 +50,7 @@ const targetCmsSlug = resolveCmsSlug(d?.target_cms, cmsIndex);
</p>
<h1>{d.title}</h1>
<p class="meta">
<StatusBadge status={d.status} />
<StatusBadge status={d.parity_status} />
{d.source_cms && <span class="source-target">{d.source_cms}{d.target_cms ? ` → ${d.target_cms}` : ""}</span>}
</p>
{d.purpose && <p class="lead">{d.purpose}</p>}