@prenta/admin 1.12.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/dist/__tests__/lib/seo-service-errors.test.js +34 -1
- package/dist/__tests__/lib/seo-service-errors.test.js.map +1 -1
- package/dist/__tests__/lib/seo-service-proposals.test.d.ts +2 -0
- package/dist/__tests__/lib/seo-service-proposals.test.d.ts.map +1 -0
- package/dist/__tests__/lib/seo-service-proposals.test.js +71 -0
- package/dist/__tests__/lib/seo-service-proposals.test.js.map +1 -0
- package/dist/__tests__/router/seo-tab-for-path.test.js +1 -0
- package/dist/__tests__/router/seo-tab-for-path.test.js.map +1 -1
- package/dist/__tests__/views/seo-proposals-tab.render.test.d.ts +2 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.js +292 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.js.map +1 -0
- package/dist/__tests__/views/seo-settings.render.test.js +73 -6
- package/dist/__tests__/views/seo-settings.render.test.js.map +1 -1
- package/dist/components/seo/ChangePreview.d.ts +6 -0
- package/dist/components/seo/ChangePreview.d.ts.map +1 -0
- package/dist/components/seo/ChangePreview.js +18 -0
- package/dist/components/seo/ChangePreview.js.map +1 -0
- package/dist/components/seo/SeoIssueFixPanel.d.ts.map +1 -1
- package/dist/components/seo/SeoIssueFixPanel.js +1 -14
- package/dist/components/seo/SeoIssueFixPanel.js.map +1 -1
- package/dist/lib/seo-service.d.ts +106 -0
- package/dist/lib/seo-service.d.ts.map +1 -1
- package/dist/lib/seo-service.js +67 -0
- package/dist/lib/seo-service.js.map +1 -1
- package/dist/prenta-admin.css +1 -1
- package/dist/views/SEO.d.ts +5 -1
- package/dist/views/SEO.d.ts.map +1 -1
- package/dist/views/SEO.js +28 -9
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/seo/ProposalsTab.d.ts +7 -0
- package/dist/views/seo/ProposalsTab.d.ts.map +1 -0
- package/dist/views/seo/ProposalsTab.js +298 -0
- package/dist/views/seo/ProposalsTab.js.map +1 -0
- package/dist/views/settings/SeoDigestCard.d.ts +9 -0
- package/dist/views/settings/SeoDigestCard.d.ts.map +1 -0
- package/dist/views/settings/SeoDigestCard.js +77 -0
- package/dist/views/settings/SeoDigestCard.js.map +1 -0
- package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/SeoSettingsTab.js +2 -1
- package/dist/views/settings/SeoSettingsTab.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/lib/seo-service-errors.test.ts +38 -0
- package/src/__tests__/lib/seo-service-proposals.test.ts +79 -0
- package/src/__tests__/router/seo-tab-for-path.test.ts +1 -0
- package/src/__tests__/views/seo-proposals-tab.render.test.tsx +370 -0
- package/src/__tests__/views/seo-settings.render.test.tsx +104 -5
- package/src/components/seo/ChangePreview.tsx +47 -0
- package/src/components/seo/SeoIssueFixPanel.tsx +1 -44
- package/src/lib/seo-service.ts +168 -0
- package/src/views/SEO.tsx +40 -7
- package/src/views/seo/ProposalsTab.tsx +681 -0
- package/src/views/settings/SeoDigestCard.tsx +164 -0
- package/src/views/settings/SeoSettingsTab.tsx +2 -0
|
@@ -6,6 +6,7 @@ import { siteUrlMatchesAdminOrigin } from '../../lib/preview-link.js';
|
|
|
6
6
|
import { MediaPickerModal } from '../../components/MediaPickerModal.js';
|
|
7
7
|
import { SEOConfigPanel } from '../../components/SEOConfigPanel.js';
|
|
8
8
|
import { SearchDataCard } from './SearchDataCard.js';
|
|
9
|
+
import { SeoDigestCard } from './SeoDigestCard.js';
|
|
9
10
|
import { ConfirmDangerousSettingDialog, SettingsCard, SettingsSaveBar, SettingsSourceBadge, SettingsToggleRow, SettingsValidationSummary, } from './components.js';
|
|
10
11
|
import { META_DESCRIPTION_MAX, META_DESCRIPTION_MIN, useSeoSettings, validateTitleTemplateClient, } from './useSeoSettings.js';
|
|
11
12
|
const INPUT_CLASS = 'w-full rounded-md border border-border bg-input-background px-3 py-2 text-base text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-60';
|
|
@@ -46,7 +47,7 @@ export function SeoSettingsTab({ onNavigate, role }) {
|
|
|
46
47
|
if (seo.loading) {
|
|
47
48
|
return (_jsxs("div", { className: "space-y-4", "aria-busy": "true", "aria-live": "polite", children: [_jsx("span", { className: "sr-only", children: "Loading SEO settings\u2026" }), [0, 1, 2, 3].map((i) => (_jsxs("div", { className: "border-border bg-card rounded-lg border p-6", children: [_jsx("div", { className: "bg-muted mb-4 h-4 w-40 animate-pulse rounded" }), _jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "bg-muted h-9 w-full animate-pulse rounded" }), _jsx("div", { className: "bg-muted h-9 w-full animate-pulse rounded" })] })] }, i)))] }));
|
|
48
49
|
}
|
|
49
|
-
return (_jsxs("div", { className: "space-y-4", children: [_jsx(SeoWorkspaceCallout, { onNavigate: onNavigate }), seo.loadError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: seo.loadError }), _jsx("button", { type: "button", onClick: seo.refetch, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), !canEdit && (_jsxs("div", { className: "border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-4 text-sm", children: [_jsx(Info, { size: 16, className: "shrink-0", "aria-hidden": "true" }), "You have read-only access to SEO defaults. Only administrators can make changes."] })), _jsx(SettingsValidationSummary, { issues: seo.issues }), !seo.siteUrl ? (_jsxs("div", { role: "status", className: "border-warning/30 bg-warning/10 text-warning flex items-start gap-2 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), "Set the public site URL in Settings \u2192 General. View site and Share stay disabled until it is set."] })) : siteUrlMatchesAdminOrigin(seo.siteUrl) ? (_jsxs("div", { role: "status", className: "border-warning/30 bg-warning/10 text-warning flex items-start gap-2 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), "This origin is the admin, not the public site. Set the public site URL to the live apex \u2014 View site and Share stay disabled while it matches this CMS host."] })) : null, _jsx(MetaDefaultsCard, { seo: seo, canEdit: canEdit }), _jsx(OrganizationCard, { seo: seo, canEdit: canEdit }), _jsx(SearchEngineVerificationCard, { seo: seo, canEdit: canEdit }), _jsx(SearchDataCard, { canEdit: canEdit }), _jsx(SitemapDefaultsCard, { seo: seo, canEdit: canEdit, onNavigate: onNavigate }), _jsxs("details", { className: "border-border bg-card group rounded-lg border", children: [_jsxs("summary", { className: "text-foreground flex cursor-pointer list-none items-center justify-between p-4 text-base font-medium", children: [_jsx("span", { children: "Advanced & per-collection SEO" }), _jsx("span", { className: "text-muted-foreground text-sm font-normal group-open:hidden", children: "Show" }), _jsx("span", { className: "text-muted-foreground hidden text-sm font-normal group-open:inline", children: "Hide" })] }), _jsxs("div", { className: "border-border border-t p-4", children: [_jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: "Site name, social handle, per-collection schema, and route toggles. These share the same SEO configuration as the defaults above." }), _jsx(SEOConfigPanel, {})] })] }), seo.saveState === 'error' && seo.saveError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: seo.saveError }), _jsx("button", { type: "button", onClick: seo.save, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), _jsx(SettingsSaveBar, { dirty: seo.dirty, canEdit: canEdit, hasErrors: seo.hasErrors, saveState: seo.saveState, onSave: seo.save, onReset: seo.reset })] }));
|
|
50
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx(SeoWorkspaceCallout, { onNavigate: onNavigate }), seo.loadError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: seo.loadError }), _jsx("button", { type: "button", onClick: seo.refetch, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), !canEdit && (_jsxs("div", { className: "border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-4 text-sm", children: [_jsx(Info, { size: 16, className: "shrink-0", "aria-hidden": "true" }), "You have read-only access to SEO defaults. Only administrators can make changes."] })), _jsx(SettingsValidationSummary, { issues: seo.issues }), !seo.siteUrl ? (_jsxs("div", { role: "status", className: "border-warning/30 bg-warning/10 text-warning flex items-start gap-2 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), "Set the public site URL in Settings \u2192 General. View site and Share stay disabled until it is set."] })) : siteUrlMatchesAdminOrigin(seo.siteUrl) ? (_jsxs("div", { role: "status", className: "border-warning/30 bg-warning/10 text-warning flex items-start gap-2 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), "This origin is the admin, not the public site. Set the public site URL to the live apex \u2014 View site and Share stay disabled while it matches this CMS host."] })) : null, _jsx(MetaDefaultsCard, { seo: seo, canEdit: canEdit }), _jsx(OrganizationCard, { seo: seo, canEdit: canEdit }), _jsx(SearchEngineVerificationCard, { seo: seo, canEdit: canEdit }), _jsx(SearchDataCard, { canEdit: canEdit }), _jsx(SeoDigestCard, { canEdit: canEdit }), _jsx(SitemapDefaultsCard, { seo: seo, canEdit: canEdit, onNavigate: onNavigate }), _jsxs("details", { className: "border-border bg-card group rounded-lg border", children: [_jsxs("summary", { className: "text-foreground flex cursor-pointer list-none items-center justify-between p-4 text-base font-medium", children: [_jsx("span", { children: "Advanced & per-collection SEO" }), _jsx("span", { className: "text-muted-foreground text-sm font-normal group-open:hidden", children: "Show" }), _jsx("span", { className: "text-muted-foreground hidden text-sm font-normal group-open:inline", children: "Hide" })] }), _jsxs("div", { className: "border-border border-t p-4", children: [_jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: "Site name, social handle, per-collection schema, and route toggles. These share the same SEO configuration as the defaults above." }), _jsx(SEOConfigPanel, {})] })] }), seo.saveState === 'error' && seo.saveError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: seo.saveError }), _jsx("button", { type: "button", onClick: seo.save, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), _jsx(SettingsSaveBar, { dirty: seo.dirty, canEdit: canEdit, hasErrors: seo.hasErrors, saveState: seo.saveState, onSave: seo.save, onReset: seo.reset })] }));
|
|
50
51
|
}
|
|
51
52
|
// ---------------------------------------------------------------------------
|
|
52
53
|
// Full SEO workspace callout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeoSettingsTab.js","sourceRoot":"","sources":["../../../src/views/settings/SeoSettingsTab.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,CAAC,GACF,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EACL,6BAA6B,EAC7B,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,2BAA2B,GAG5B,MAAM,qBAAqB,CAAA;AAE5B,MAAM,WAAW,GACf,wNAAwN,CAAA;AAC1N,MAAM,WAAW,GAAG,kEAAkE,CAAA;AAEtF,MAAM,gBAAgB,GAAG;IACvB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,OAAO;CACR,CAAA;AAED,uDAAuD;AACvD,SAAS,YAAY,CAAC,QAAgB,EAAE,QAAgB;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAA;IACjE,MAAM,IAAI,GAA2B;QACnC,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,QAAQ,IAAI,WAAW;QAC7B,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3C,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,OAAO;KACb,CAAA;IACD,OAAO,GAAG;SACP,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,IAAI,EAAE,CAAA;AACX,CAAC;AAQD,MAAM,UAAU,cAAc,CAAC,EAAE,UAAU,EAAE,IAAI,EAAuB;IACtE,MAAM,OAAO,GAAG,IAAI,KAAK,OAAO,CAAA;IAChC,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAEnC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,eAAW,MAAM,eAAW,QAAQ,aAC5D,eAAM,SAAS,EAAC,SAAS,2CAA6B,EACrD,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACvB,eAAa,SAAS,EAAC,6CAA6C,aAClE,cAAK,SAAS,EAAC,8CAA8C,GAAG,EAChE,eAAK,SAAS,EAAC,WAAW,aACxB,cAAK,SAAS,EAAC,2CAA2C,GAAG,EAC7D,cAAK,SAAS,EAAC,2CAA2C,GAAG,IACzD,KALE,CAAC,CAML,CACP,CAAC,IACE,CACP,CAAA;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,mBAAmB,IAAC,UAAU,EAAE,UAAU,GAAI,EAE9C,GAAG,CAAC,SAAS,IAAI,CAChB,eACE,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,gHAAgH,aAE1H,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,UAAU,iBAAa,MAAM,GAAG,EACnE,eAAM,SAAS,EAAC,QAAQ,YAAE,GAAG,CAAC,SAAS,GAAQ,EAC/C,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,CAAC,OAAO,EACpB,SAAS,EAAC,sFAAsF,sBAGzF,IACL,CACP,EAEA,CAAC,OAAO,IAAI,CACX,eAAK,SAAS,EAAC,oGAAoG,aACjH,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,UAAU,iBAAa,MAAM,GAAG,wFAEtD,CACP,EAED,KAAC,yBAAyB,IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAI,EAEhD,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CACd,eACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mGAAmG,aAE7G,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,iBAAiB,iBAAa,MAAM,GAAG,8GAGtE,CACP,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAC3C,eACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mGAAmG,aAE7G,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,iBAAiB,iBAAa,MAAM,GAAG,wKAGtE,CACP,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,gBAAgB,IAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAI,EAChD,KAAC,gBAAgB,IAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAI,EAChD,KAAC,4BAA4B,IAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAI,EAC5D,KAAC,cAAc,IAAC,OAAO,EAAE,OAAO,GAAI,EACpC,KAAC,mBAAmB,IAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAI,EAE3E,mBAAS,SAAS,EAAC,+CAA+C,aAChE,mBAAS,SAAS,EAAC,sGAAsG,aACvH,2DAA8C,EAC9C,eAAM,SAAS,EAAC,6DAA6D,qBAAY,EACzF,eAAM,SAAS,EAAC,oEAAoE,qBAE7E,IACC,EACV,eAAK,SAAS,EAAC,4BAA4B,aACzC,YAAG,SAAS,EAAC,oCAAoC,kJAG7C,EACJ,KAAC,cAAc,KAAG,IACd,IACE,EAET,GAAG,CAAC,SAAS,KAAK,OAAO,IAAI,GAAG,CAAC,SAAS,IAAI,CAC7C,eACE,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,gHAAgH,aAE1H,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,UAAU,iBAAa,MAAM,GAAG,EACnE,eAAM,SAAS,EAAC,QAAQ,YAAE,GAAG,CAAC,SAAS,GAAQ,EAC/C,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,CAAC,IAAI,EACjB,SAAS,EAAC,sFAAsF,sBAGzF,IACL,CACP,EAED,KAAC,eAAe,IACd,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,MAAM,EAAE,GAAG,CAAC,IAAI,EAChB,OAAO,EAAE,GAAG,CAAC,KAAK,GAClB,IACE,CACP,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,SAAS,mBAAmB,CAAC,EAAE,UAAU,EAA2C;IAClF,OAAO,CACL,eAAK,SAAS,EAAC,0EAA0E,aACvF,eAAM,SAAS,EAAC,uFAAuF,YACrG,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,GAClC,EACP,eAAK,SAAS,EAAC,QAAQ,aACrB,YAAG,SAAS,EAAC,uCAAuC,oDAAwC,EAC5F,YAAG,SAAS,EAAC,+BAA+B,0HAGxC,IACA,EACN,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,EACnC,SAAS,EAAC,2JAA2J,aAErK,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,gBAEtC,IACL,CACP,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,EAA6C;IACnF,MAAM,UAAU,GAAG,KAAK,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,KAAK,EAAE,CAAA;IACtB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEnD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAA;IAC/C,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,CAAA;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,wBAAwB,CAAC,CAAA;IAC1E,MAAM,aAAa,GAAG,2BAA2B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAErE,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,MAAM,CAAA;IACzD,MAAM,cAAc,GAClB,OAAO,GAAG,oBAAoB,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,oBAAoB,CAAC;QAC/E,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,uBAAuB,CAAA;IAE7B,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,EAAE,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAA;IAC7E,MAAM,YAAY,GAAG,OAAO,CAAC,sBAAsB,EAAE,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAA;IAClF,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAA;IAE3E,OAAO,CACL,MAAC,YAAY,IACX,KAAK,EAAC,eAAe,EACrB,WAAW,EAAC,iGAAiG,aAE7G,eAAK,SAAS,EAAC,WAAW,aAExB,0BACE,iBAAO,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,+BAEhD,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,aAAa,GAAI,IAC9C,EACR,gBACE,EAAE,EAAE,UAAU,EACd,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,IAAI,CAAC,aAAa,EACzB,QAAQ,EAAE,CAAC,gBAAgB,EAC3B,WAAW,EAAC,sBAAiB,kBACf,aAAa,EAAE,QAAQ,KAAK,OAAO,EACjD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1D,SAAS,EAAE,WAAW,GACtB,EACF,aAAG,SAAS,EAAC,oCAAoC,yBACtC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,0DACjC,EACH,aAAa,CAAC,CAAC,CAAC,CACf,YAAG,SAAS,EAAC,+BAA+B,YAAE,aAAa,CAAC,OAAO,GAAK,CACzE,CAAC,CAAC,CAAC,CACF,aAAa,CAAC,KAAK,IAAI,CACrB,aAAG,SAAS,EAAC,oCAAoC,yBACtC,GAAG,EACZ,eAAM,SAAS,EAAC,6BAA6B,YAC1C,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,GAC1C,IACL,CACL,CACF,IACG,EAGN,0BACE,iBAAO,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,yCAE5C,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,sBAAsB,GAAI,IACvD,EACR,mBACE,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAClC,QAAQ,EAAE,CAAC,YAAY,sBACL,GAAG,MAAM,QAAQ,EACnC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACnE,SAAS,EAAE,GAAG,WAAW,WAAW,GACpC,EACF,eAAK,SAAS,EAAC,8CAA8C,aAC3D,YAAG,SAAS,EAAC,+BAA+B,4EAExC,EACJ,gBAAM,EAAE,EAAE,GAAG,MAAM,QAAQ,EAAE,SAAS,EAAE,WAAW,cAAc,EAAE,aAChE,OAAO,OAAG,oBAAoB,IAC1B,IACH,EACL,SAAS,IAAI,YAAG,SAAS,EAAC,2BAA2B,YAAE,SAAS,CAAC,OAAO,GAAK,IAC1E,EAGN,0BACE,gBAAM,SAAS,EAAE,WAAW,2CAE1B,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,cAAc,GAAI,IAChD,EACP,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,8GAA8G,YAC1H,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;wCACrB,qDAAqD;wCACrD,cACE,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,GAAG,EAAC,8BAA8B,EAClC,SAAS,EAAC,4BAA4B,GACtC,CACH,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,iBAAa,MAAM,GAAG,CAC7E,GACG,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,eAAK,SAAS,EAAC,yBAAyB,aACtC,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAClC,QAAQ,EAAE,CAAC,aAAa,EACxB,SAAS,EAAC,sLAAsL,aAEhM,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,EACtC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,IAC1C,EACR,IAAI,CAAC,cAAc,IAAI,aAAa,IAAI,CACvC,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;4DACZ,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;4DAC9B,QAAQ,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAA;wDAC3C,CAAC,EACD,SAAS,EAAC,8HAA8H,aAExI,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,cAE3B,CACV,IACG,EACN,YAAG,SAAS,EAAC,+BAA+B,0CAAyB,IACjE,IACF,IACF,IACF,EAGN,KAAC,cAAc,IACb,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,EACrD,GAAG,EAAE,GAAG,CAAC,OAAO,IAAI,qBAAqB,EACzC,WAAW,EACT,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,6CAA6C,EAErF,KAAK,EAAE,IAAI,CAAC,cAAc,EAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ,GACtB,EAEF,KAAC,gBAAgB,IACf,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EACnC,MAAM,EAAC,SAAS,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAClD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,2BAA2B,EAAE,IAAI,CAAC,EAAE,CAAC,GACtE,IACW,CAChB,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,KAAK,EACL,GAAG,EACH,WAAW,EACX,KAAK,EACL,QAAQ,GAOT;IACC,OAAO,CACL,eAAK,SAAS,EAAC,4DAA4D,aACzE,eAAK,SAAS,EAAC,qCAAqC,aAClD,YAAG,SAAS,EAAC,wEAAwE,+BAEjF,EACJ,YAAG,SAAS,EAAC,+BAA+B,YAAE,GAAG,GAAK,EACtD,YAAG,SAAS,EAAC,4CAA4C,YAAE,KAAK,GAAK,EACrE,YAAG,SAAS,EAAC,4CAA4C,YAAE,WAAW,GAAK,IACvE,EACN,eAAK,SAAS,EAAC,iDAAiD,aAC9D,cAAK,SAAS,EAAC,2DAA2D,YACvE,KAAK,CAAC,CAAC,CAAC;wBACP,qDAAqD;wBACrD,cAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAC,sBAAsB,EAAC,SAAS,EAAC,4BAA4B,GAAG,CACtF,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,iBAAa,MAAM,GAAG,CAC7E,GACG,EACN,eAAK,SAAS,EAAC,KAAK,aAClB,YAAG,SAAS,EAAC,kDAAkD,YAC5D,QAAQ,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,GAChC,EACJ,YAAG,SAAS,EAAC,8CAA8C,YAAE,KAAK,GAAK,EACvE,YAAG,SAAS,EAAC,4CAA4C,YAAE,WAAW,GAAK,IACvE,IACF,IACF,CACP,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,EAA6C;IACnF,MAAM,MAAM,GAAG,KAAK,EAAE,CAAA;IACtB,MAAM,KAAK,GAAG,KAAK,EAAE,CAAA;IACrB,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAA;IACxB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEnD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAA;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,kBAAkB,CAAC,CAAA;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,iBAAiB,CAAC,CAAA;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,kBAAkB,CAAC,CAAA;IACpE,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,oBAAoB,CAAC,CAAA;IAExE,MAAM,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAA;IAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAA;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAA;IAC5E,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAA;IAEhF,OAAO,CACL,MAAC,YAAY,IACX,KAAK,EAAC,cAAc,EACpB,WAAW,EAAC,0HAA0H,aAEtI,eAAK,SAAS,EAAC,WAAW,aACxB,0BACE,iBAAO,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,kCAE5C,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,GAAI,IACjD,EACR,gBACE,EAAE,EAAE,MAAM,EACV,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAC5B,QAAQ,EAAE,CAAC,YAAY,EACvB,WAAW,EAAE,QAAQ,IAAI,mBAAmB,EAC5C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7D,SAAS,EAAE,WAAW,GACtB,EACF,YAAG,SAAS,EAAC,oCAAoC,oDAAwC,EACxF,SAAS,IAAI,YAAG,SAAS,EAAC,+BAA+B,YAAE,SAAS,CAAC,OAAO,GAAK,IAC9E,EAEN,0BACE,iBAAO,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,iCAE3C,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,eAAe,GAAI,IAChD,EACR,gBACE,EAAE,EAAE,KAAK,EACT,IAAI,EAAC,KAAK,EACV,KAAK,EAAE,IAAI,CAAC,eAAe,EAC3B,QAAQ,EAAE,CAAC,WAAW,EACtB,WAAW,EAAE,OAAO,IAAI,qBAAqB,kBAC/B,QAAQ,EAAE,QAAQ,KAAK,OAAO,EAC5C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5D,SAAS,EAAE,WAAW,GACtB,EACF,YAAG,SAAS,EAAC,oCAAoC,oFAE7C,EACH,QAAQ,IAAI,YAAG,SAAS,EAAC,+BAA+B,YAAE,QAAQ,CAAC,OAAO,GAAK,IAC5E,EAEN,0BACE,gBAAM,SAAS,EAAE,WAAW,kCAE1B,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,GAAI,IAClD,EACP,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,8GAA8G,YAC1H,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;wCACvB,qDAAqD;wCACrD,cACE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAC1B,GAAG,EAAC,2BAA2B,EAC/B,SAAS,EAAC,kCAAkC,GAC5C,CACH,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,iBAAa,MAAM,GAAG,CAC7E,GACG,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,eAAK,SAAS,EAAC,yBAAyB,aACtC,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAClC,QAAQ,EAAE,CAAC,YAAY,EACvB,SAAS,EAAC,sLAAsL,aAEhM,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,EACtC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,IAChD,EACR,IAAI,CAAC,gBAAgB,IAAI,YAAY,IAAI,CACxC,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAC/C,SAAS,EAAC,8HAA8H,aAExI,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,cAE3B,CACV,IACG,EACN,YAAG,SAAS,EAAC,+BAA+B,+CAAmC,IAC3E,IACF,EACL,SAAS,IAAI,YAAG,SAAS,EAAC,+BAA+B,YAAE,SAAS,CAAC,OAAO,GAAK,IAC9E,EAEN,0BACE,iBAAO,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,yCAE9C,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,kBAAkB,GAAI,IACnD,EACR,mBACE,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAC9B,QAAQ,EAAE,CAAC,cAAc,EACzB,WAAW,EAAE,yEAAyE,kBACxE,WAAW,EAAE,QAAQ,KAAK,OAAO,EAC/C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/D,SAAS,EAAE,GAAG,WAAW,6BAA6B,GACtD,EACF,YAAG,SAAS,EAAC,oCAAoC,uFAE7C,EACH,WAAW,IAAI,YAAG,SAAS,EAAC,+BAA+B,YAAE,WAAW,CAAC,OAAO,GAAK,IAClF,IACF,EAEN,KAAC,gBAAgB,IACf,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EACnC,MAAM,EAAC,SAAS,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,CAAC,GACpD,IACW,CAChB,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,SAAS,iBAAiB,CAAC,EACzB,KAAK,EACL,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,GAQT;IACC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAA;IAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;IACxC,OAAO,CACL,0BACE,iBAAO,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,aACvC,KAAK,EACL,QAAQ,IAAI,CACX,gBAAM,SAAS,EAAC,qHAAqH,aACnI,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,iBAAa,MAAM,GAAG,aAEjE,CACR,IACK,EACR,gBACE,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,MAAM,EACX,YAAY,EAAC,KAAK,EAClB,UAAU,EAAE,KAAK,EACjB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAChD,SAAS,EAAE,WAAW,GACtB,IACE,CACP,CAAA;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,EAAE,GAAG,EAAE,OAAO,EAA6C;IAC/F,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAC9B,MAAM,QAAQ,GAAG,CAAC,GAA0B,EAAE,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAc,CAAC,CAAA;IAE7F,OAAO,CACL,MAAC,YAAY,IACX,KAAK,EAAC,4BAA4B,EAClC,WAAW,EAAC,mIAA8H,aAE1I,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,iBAAiB,IAChB,KAAK,EAAC,uBAAuB,EAC7B,KAAK,EAAC,oBAAoB,EAC1B,WAAW,EAAC,gCAA2B,EACvC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAC9B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,OAAO,GAClB,EACF,KAAC,iBAAiB,IAChB,KAAK,EAAC,sBAAsB,EAC5B,KAAK,EAAC,kBAAkB,EACxB,WAAW,EAAC,qBAAgB,EAC5B,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAC5B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,OAAO,GAClB,IACE,EAEN,mBAAS,SAAS,EAAC,YAAY,aAC7B,mBAAS,SAAS,EAAC,6DAA6D,aAC9E,eAAM,SAAS,EAAC,mBAAmB,+BAAsB,EACzD,eAAM,SAAS,EAAC,0BAA0B,gCAAuB,IACzD,EACV,eAAK,SAAS,EAAC,gBAAgB,aAC7B,KAAC,iBAAiB,IAChB,KAAK,EAAC,QAAQ,EACd,KAAK,EAAC,oBAAoB,EAC1B,WAAW,EAAC,2BAAsB,EAClC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAC9B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,OAAO,GAClB,EACF,KAAC,iBAAiB,IAChB,KAAK,EAAC,WAAW,EACjB,KAAK,EAAC,uBAAuB,EAC7B,WAAW,EAAC,uBAAkB,EAC9B,KAAK,EAAE,IAAI,CAAC,qBAAqB,EACjC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,OAAO,GAClB,EACF,KAAC,iBAAiB,IAChB,KAAK,EAAC,8BAA8B,EACpC,KAAK,EAAC,4BAA4B,EAClC,WAAW,EAAC,oCAA+B,EAC3C,KAAK,EAAE,IAAI,CAAC,0BAA0B,EACtC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,OAAO,GAClB,IACE,IACE,IACG,CAChB,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,mBAAmB,CAAC,EAC3B,GAAG,EACH,OAAO,EACP,UAAU,GAKX;IACC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3D,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,GAAG,GAAG,CAAA;IAE/F,SAAS,mBAAmB,CAAC,KAAc;QACzC,0EAA0E;QAC1E,IAAI,CAAC,KAAK,IAAI,YAAY,EAAE,CAAC;YAC3B,iBAAiB,CAAC,IAAI,CAAC,CAAA;YACvB,OAAM;QACR,CAAC;QACD,QAAQ,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,EAAE,eAAe;QAC5C,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,cAAc,EAAE;QACpD,CAAC,CAAC,OAAO,CAAA;IAEX,OAAO,CACL,MAAC,YAAY,IACX,KAAK,EAAC,SAAS,EACf,WAAW,EAAC,kFAAkF,aAE7F,CAAC,OAAO,IAAI,CACX,eAAK,SAAS,EAAC,wGAAwG,aACrH,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,iBAAiB,iBAAa,MAAM,GAAG,oGAEtE,CACP,EAED,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,iBAAiB,IAChB,KAAK,EAAC,2BAA2B,EACjC,WAAW,EAAC,oDAAoD,EAChE,OAAO,EAAE,IAAI,CAAC,mBAAmB,EACjC,QAAQ,EAAE,CAAC,OAAO,EAClB,QAAQ,EAAE,mBAAmB,GAC7B,EACF,KAAC,iBAAiB,IAChB,KAAK,EAAC,gCAAgC,EACtC,WAAW,EAAC,kDAAkD,EAC9D,OAAO,EAAE,IAAI,CAAC,aAAa,EAC3B,QAAQ,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAC/C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,GAC7C,IACE,EAEN,eAAK,SAAS,EAAC,4CAA4C,aACzD,eAAK,SAAS,EAAC,iDAAiD,aAC9D,eAAM,SAAS,EAAC,uBAAuB,4BAAmB,EACzD,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CACrB,aACE,IAAI,EAAE,OAAO,CAAC,UAAU,EACxB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,EAChB,SAAS,EAAC,uEAAuE,6BAGjF,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,IAC3C,CACL,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,6BAA6B,6BAAoB,CAClE,IACG,EACN,KAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,EAAC,KAAK,EAAE,aAAa,GAAI,EAC3D,KAAC,UAAU,IAAC,KAAK,EAAC,eAAe,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,IAAI,GAAG,CAAC,GAAI,EAClF,KAAC,UAAU,IAAC,KAAK,EAAC,eAAe,EAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,IAAI,GAAG,CAAC,GAAI,EAClF,eAAK,SAAS,EAAC,8CAA8C,aAC3D,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,CAAC,OAAO,IAAI,YAAY,EAClC,SAAS,EAAC,sLAAsL,aAE/L,YAAY,CAAC,CAAC,CAAC,CACd,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,iBAAa,MAAM,GAAG,CAClE,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,CAC3C,sBAEM,EACR,UAAU,IAAI,CACb,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAC/C,SAAS,EAAC,oCAAoC,+CAGvC,CACV,IACG,IACF,EAEN,KAAC,6BAA6B,IAC5B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAC,iDAAiD,EACvD,WAAW,EAAC,6GAA6G,EACzH,YAAY,EAAC,UAAU,EACvB,SAAS,EAAE,GAAG,EAAE;oBACd,QAAQ,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAA;oBACtC,iBAAiB,CAAC,KAAK,CAAC,CAAA;gBAC1B,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,GACxC,IACW,CAChB,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAoC;IACpE,OAAO,CACL,eAAK,SAAS,EAAC,iDAAiD,aAC9D,eAAM,SAAS,EAAC,uBAAuB,YAAE,KAAK,GAAQ,EACtD,eAAM,SAAS,EAAC,6BAA6B,YAAE,KAAK,GAAQ,IACxD,CACP,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"SeoSettingsTab.js","sourceRoot":"","sources":["../../../src/views/settings/SeoSettingsTab.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prenta/admin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"typescript": "^5.7.0",
|
|
100
100
|
"vitest": "^4.1.0",
|
|
101
101
|
"@prenta/component-blocks": "0.3.1",
|
|
102
|
-
"@prenta/core": "5.
|
|
102
|
+
"@prenta/core": "5.6.0",
|
|
103
103
|
"@prenta/plugin-ai": "1.0.0",
|
|
104
104
|
"@prenta/plugin-blocks": "0.2.0",
|
|
105
105
|
"@prenta/plugin-commerce": "0.2.1",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"@prenta/plugin-media": "0.2.0",
|
|
108
108
|
"@prenta/plugin-navigation": "0.3.0",
|
|
109
109
|
"@prenta/plugin-seo": "0.1.2",
|
|
110
|
-
"@prenta/sections-react": "0.17.
|
|
110
|
+
"@prenta/sections-react": "0.17.35"
|
|
111
111
|
},
|
|
112
112
|
"scripts": {
|
|
113
113
|
"build": "tsc --project tsconfig.json && npx @tailwindcss/cli -i src/styles/build-input.css -o dist/prenta-admin.css --minify",
|
|
@@ -10,6 +10,7 @@ vi.mock('../../lib/api.js', () => ({
|
|
|
10
10
|
const {
|
|
11
11
|
applySeoInternalLink,
|
|
12
12
|
explainSeoIssue,
|
|
13
|
+
fetchDigestSettings,
|
|
13
14
|
fetchSeoOverview,
|
|
14
15
|
fetchSeoContentRecords,
|
|
15
16
|
fetchSeoIssues,
|
|
@@ -178,6 +179,43 @@ describe('generate404RecoverySuggestions governance passthrough', () => {
|
|
|
178
179
|
})
|
|
179
180
|
})
|
|
180
181
|
|
|
182
|
+
/**
|
|
183
|
+
* Regression tests for the digest-settings shape crash: a response body that
|
|
184
|
+
* isn't the expected settings object (e.g. a catch-all `{}` mock, or a future
|
|
185
|
+
* server drift) must resolve to null — which SeoDigestCard renders as its
|
|
186
|
+
* error state — instead of leaking a malformed object that crashes on
|
|
187
|
+
* `recipients.join`.
|
|
188
|
+
*/
|
|
189
|
+
describe('fetchDigestSettings response validation', () => {
|
|
190
|
+
it('returns null when the response body is not a digest settings object', async () => {
|
|
191
|
+
cmsApi.mockResolvedValue({ data: {}, status: 200 })
|
|
192
|
+
await expect(fetchDigestSettings()).resolves.toBeNull()
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
it('returns null when recipients is missing', async () => {
|
|
196
|
+
cmsApi.mockResolvedValue({ data: { enabled: true }, status: 200 })
|
|
197
|
+
await expect(fetchDigestSettings()).resolves.toBeNull()
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
it('returns null on request failure', async () => {
|
|
201
|
+
cmsApi.mockResolvedValue({ error: 'Request failed (500)', status: 500 })
|
|
202
|
+
await expect(fetchDigestSettings()).resolves.toBeNull()
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
it('normalizes a valid payload, defaulting absent nullable fields to null', async () => {
|
|
206
|
+
cmsApi.mockResolvedValue({
|
|
207
|
+
data: { enabled: true, recipients: ['owner@example.com'] },
|
|
208
|
+
status: 200,
|
|
209
|
+
})
|
|
210
|
+
await expect(fetchDigestSettings()).resolves.toEqual({
|
|
211
|
+
enabled: true,
|
|
212
|
+
recipients: ['owner@example.com'],
|
|
213
|
+
lastSentAt: null,
|
|
214
|
+
lastError: null,
|
|
215
|
+
})
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
|
|
181
219
|
describe('inline SEO fix issue types', () => {
|
|
182
220
|
it('treats orphan-page as an inline Approve issue', () => {
|
|
183
221
|
expect(isInlineSeoFixIssue('orphan-page')).toBe(true)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
|
|
3
|
+
const cmsApi = vi.fn()
|
|
4
|
+
vi.mock('../../lib/api.js', () => ({ cmsApi: (...args: unknown[]) => cmsApi(...args) }))
|
|
5
|
+
|
|
6
|
+
const svc = await import('../../lib/seo-service.js')
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
// Block body on purpose: `mockReset()` returns the mock, and vitest would
|
|
10
|
+
// run a returned function as after-test cleanup.
|
|
11
|
+
cmsApi.mockReset()
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
describe('proposal service helpers', () => {
|
|
15
|
+
it('fetchSeoProposals GETs /seo/proposals and throws on error', async () => {
|
|
16
|
+
cmsApi.mockResolvedValueOnce({ status: 500, error: 'boom' })
|
|
17
|
+
await expect(svc.fetchSeoProposals()).rejects.toThrow('boom')
|
|
18
|
+
cmsApi.mockResolvedValueOnce({
|
|
19
|
+
status: 200,
|
|
20
|
+
data: {
|
|
21
|
+
proposals: [],
|
|
22
|
+
counts: { issueFixes: 0, redirects: 0, stale: 0, eligibleForGeneration: 0 },
|
|
23
|
+
governance: { issueFixBulk: false, redirectBulk: false },
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
await expect(svc.fetchSeoProposals()).resolves.toMatchObject({ proposals: [] })
|
|
27
|
+
expect(cmsApi).toHaveBeenLastCalledWith('/seo/proposals')
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('generateSeoProposals POSTs confirm: true and returns the result or error', async () => {
|
|
31
|
+
cmsApi.mockResolvedValueOnce({
|
|
32
|
+
status: 200,
|
|
33
|
+
data: { generated: 3, skipped: 1, failed: 0, remaining: 2, haltedReason: null },
|
|
34
|
+
})
|
|
35
|
+
await expect(svc.generateSeoProposals()).resolves.toEqual({
|
|
36
|
+
result: { generated: 3, skipped: 1, failed: 0, remaining: 2, haltedReason: null },
|
|
37
|
+
})
|
|
38
|
+
expect(cmsApi).toHaveBeenCalledWith('/seo/proposals/generate', {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
body: JSON.stringify({ confirm: true }),
|
|
41
|
+
})
|
|
42
|
+
cmsApi.mockResolvedValueOnce({ status: 429, error: 'AI rate limit reached.' })
|
|
43
|
+
await expect(svc.generateSeoProposals()).resolves.toEqual({ error: 'AI rate limit reached.' })
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('bulkApplySeoProposals flags governance_blocked distinctly', async () => {
|
|
47
|
+
cmsApi.mockResolvedValueOnce({
|
|
48
|
+
status: 403,
|
|
49
|
+
error: 'Enable "Allow bulk apply"',
|
|
50
|
+
code: 'governance_blocked',
|
|
51
|
+
})
|
|
52
|
+
await expect(
|
|
53
|
+
svc.bulkApplySeoProposals([{ kind: 'issue-fix', id: 'i1', fingerprint: 'f' }]),
|
|
54
|
+
).resolves.toEqual({ error: 'Enable "Allow bulk apply"', governanceBlocked: true })
|
|
55
|
+
cmsApi.mockResolvedValueOnce({
|
|
56
|
+
status: 200,
|
|
57
|
+
data: {
|
|
58
|
+
results: [{ kind: 'issue-fix', id: 'i1', status: 'applied' }],
|
|
59
|
+
applied: 1,
|
|
60
|
+
failed: 0,
|
|
61
|
+
pending: 0,
|
|
62
|
+
},
|
|
63
|
+
})
|
|
64
|
+
await expect(svc.bulkApplySeoProposals([{ kind: 'issue-fix', id: 'i1' }])).resolves.toEqual({
|
|
65
|
+
result: {
|
|
66
|
+
results: [{ kind: 'issue-fix', id: 'i1', status: 'applied' }],
|
|
67
|
+
applied: 1,
|
|
68
|
+
failed: 0,
|
|
69
|
+
pending: 0,
|
|
70
|
+
},
|
|
71
|
+
})
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it('dismissSeoIssueFix POSTs to the encoded issue path', async () => {
|
|
75
|
+
cmsApi.mockResolvedValueOnce({ status: 200, data: { dismissed: true } })
|
|
76
|
+
await expect(svc.dismissSeoIssueFix('a/b')).resolves.toEqual({})
|
|
77
|
+
expect(cmsApi).toHaveBeenCalledWith('/seo/issues/a%2Fb/dismiss-fix', { method: 'POST' })
|
|
78
|
+
})
|
|
79
|
+
})
|
|
@@ -18,6 +18,7 @@ describe('seoTabForPath', () => {
|
|
|
18
18
|
expect(seoTabForPath('/seo/links')).toBe('technical')
|
|
19
19
|
expect(seoTabForPath('/seo/redirects')).toBe('redirects')
|
|
20
20
|
expect(seoTabForPath('/seo/audit')).toBe('audit')
|
|
21
|
+
expect(seoTabForPath('/seo/proposals')).toBe('proposals')
|
|
21
22
|
})
|
|
22
23
|
|
|
23
24
|
it('returns null for non-SEO paths so they fall through', () => {
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
3
|
+
import { fireEvent, render, screen, waitFor } from '@testing-library/react'
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
SeoProposal,
|
|
7
|
+
SeoProposalBulkApplyResult,
|
|
8
|
+
SeoProposalsPayload,
|
|
9
|
+
} from '../../lib/seo-service.js'
|
|
10
|
+
|
|
11
|
+
function proposal(over: Partial<SeoProposal> = {}): SeoProposal {
|
|
12
|
+
return {
|
|
13
|
+
id: 'issue:i1',
|
|
14
|
+
kind: 'issue-fix',
|
|
15
|
+
title: 'Duplicate meta title',
|
|
16
|
+
entity: { type: 'page', id: 'd1', title: 'Pricing', url: '/pricing' },
|
|
17
|
+
changes: [{ field: 'metaTitle', label: 'Meta title', before: 'Dup', after: 'Unique Pricing' }],
|
|
18
|
+
justification: 'AI drafted a unique title.',
|
|
19
|
+
source: 'ai',
|
|
20
|
+
confidence: null,
|
|
21
|
+
brandAlignment: 88,
|
|
22
|
+
generatedAt: new Date(Date.now() - 3600_000).toISOString(),
|
|
23
|
+
fingerprint: 'fp-1',
|
|
24
|
+
stale: false,
|
|
25
|
+
issueType: 'duplicate-meta-title',
|
|
26
|
+
severity: 'warning',
|
|
27
|
+
issueId: 'i1',
|
|
28
|
+
suggestionId: null,
|
|
29
|
+
...over,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function payload(over: Partial<SeoProposalsPayload> = {}): SeoProposalsPayload {
|
|
34
|
+
return {
|
|
35
|
+
proposals: [
|
|
36
|
+
proposal(),
|
|
37
|
+
proposal({
|
|
38
|
+
id: 'issue:i2',
|
|
39
|
+
issueId: 'i2',
|
|
40
|
+
fingerprint: 'fp-2',
|
|
41
|
+
title: 'Missing description',
|
|
42
|
+
brandAlignment: 60,
|
|
43
|
+
}),
|
|
44
|
+
proposal({
|
|
45
|
+
id: 'redirect:s1',
|
|
46
|
+
kind: 'redirect',
|
|
47
|
+
title: 'Redirect /old → /new',
|
|
48
|
+
source: 'ai-404-recovery',
|
|
49
|
+
confidence: 0.82,
|
|
50
|
+
brandAlignment: null,
|
|
51
|
+
fingerprint: null,
|
|
52
|
+
issueId: null,
|
|
53
|
+
suggestionId: 's1',
|
|
54
|
+
severity: null,
|
|
55
|
+
changes: [{ field: 'redirect', label: 'Redirect', before: '/old', after: '/new' }],
|
|
56
|
+
}),
|
|
57
|
+
],
|
|
58
|
+
counts: { issueFixes: 2, redirects: 1, stale: 0, eligibleForGeneration: 5 },
|
|
59
|
+
governance: { issueFixBulk: true, redirectBulk: true },
|
|
60
|
+
...over,
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const fetchSeoProposals = vi.fn(async () => payload())
|
|
65
|
+
const generateSeoProposals = vi.fn(async () => ({
|
|
66
|
+
result: { generated: 2, skipped: 0, failed: 0, remaining: 0, haltedReason: null },
|
|
67
|
+
}))
|
|
68
|
+
const bulkApplySeoProposals = vi.fn(
|
|
69
|
+
async (_items: unknown): Promise<{ result?: SeoProposalBulkApplyResult; error?: string }> => ({
|
|
70
|
+
result: { results: [], applied: 0, failed: 0, pending: 0 },
|
|
71
|
+
}),
|
|
72
|
+
)
|
|
73
|
+
const dismissSeoIssueFix = vi.fn(async (_id: string): Promise<{ error?: string }> => ({}))
|
|
74
|
+
const dismissRedirectSuggestion = vi.fn(async (_id: string): Promise<{ error?: string }> => ({}))
|
|
75
|
+
|
|
76
|
+
vi.mock('../../lib/seo-service.js', () => ({
|
|
77
|
+
fetchSeoProposals: () => fetchSeoProposals(),
|
|
78
|
+
generateSeoProposals: () => generateSeoProposals(),
|
|
79
|
+
bulkApplySeoProposals: (items: unknown) => bulkApplySeoProposals(items),
|
|
80
|
+
dismissSeoIssueFix: (id: string) => dismissSeoIssueFix(id),
|
|
81
|
+
dismissRedirectSuggestion: (id: string) => dismissRedirectSuggestion(id),
|
|
82
|
+
}))
|
|
83
|
+
vi.mock('sonner', () => ({
|
|
84
|
+
toast: { success: vi.fn(), error: vi.fn(), info: vi.fn(), loading: vi.fn() },
|
|
85
|
+
}))
|
|
86
|
+
|
|
87
|
+
const { ProposalsTab } = await import('../../views/seo/ProposalsTab.js')
|
|
88
|
+
const { toast } = await import('sonner')
|
|
89
|
+
|
|
90
|
+
function deferred<T>() {
|
|
91
|
+
let resolve!: (value: T) => void
|
|
92
|
+
let reject!: (reason: unknown) => void
|
|
93
|
+
const promise = new Promise<T>((res, rej) => {
|
|
94
|
+
resolve = res
|
|
95
|
+
reject = rej
|
|
96
|
+
})
|
|
97
|
+
return { promise, resolve, reject }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Let any already-settled promise continuations run. */
|
|
101
|
+
async function flushMicrotasks() {
|
|
102
|
+
await new Promise((r) => setTimeout(r, 0))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
beforeEach(() => {
|
|
106
|
+
fetchSeoProposals.mockClear()
|
|
107
|
+
fetchSeoProposals.mockImplementation(async () => payload())
|
|
108
|
+
generateSeoProposals.mockClear()
|
|
109
|
+
bulkApplySeoProposals.mockClear()
|
|
110
|
+
dismissSeoIssueFix.mockClear()
|
|
111
|
+
dismissRedirectSuggestion.mockClear()
|
|
112
|
+
vi.mocked(toast.success).mockClear()
|
|
113
|
+
vi.mocked(toast.error).mockClear()
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
describe('ProposalsTab', () => {
|
|
117
|
+
it('renders rows with kind, badges, and expandable change preview', async () => {
|
|
118
|
+
render(<ProposalsTab planInfo={null} />)
|
|
119
|
+
expect(await screen.findByText('Duplicate meta title')).toBeTruthy()
|
|
120
|
+
expect(screen.getByText('82%')).toBeTruthy()
|
|
121
|
+
expect(screen.getByLabelText('Brand voice score 88 out of 100')).toBeTruthy()
|
|
122
|
+
fireEvent.click(screen.getByRole('button', { name: 'Show changes for Duplicate meta title' }))
|
|
123
|
+
expect(screen.getByRole('table', { name: 'Proposed SEO changes' })).toBeTruthy()
|
|
124
|
+
expect(screen.getByText('Unique Pricing')).toBeTruthy()
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
it('select-all selects only live rows and shows the bulk bar', async () => {
|
|
128
|
+
fetchSeoProposals.mockImplementationOnce(async () =>
|
|
129
|
+
payload({
|
|
130
|
+
proposals: [
|
|
131
|
+
proposal(),
|
|
132
|
+
proposal({ id: 'issue:stale', issueId: 'stale', stale: true, title: 'Stale one' }),
|
|
133
|
+
],
|
|
134
|
+
counts: { issueFixes: 1, redirects: 0, stale: 1, eligibleForGeneration: 1 },
|
|
135
|
+
}),
|
|
136
|
+
)
|
|
137
|
+
render(<ProposalsTab planInfo={null} />)
|
|
138
|
+
await screen.findByText('Stale one')
|
|
139
|
+
expect(screen.getByText('Stale — regenerate')).toBeTruthy()
|
|
140
|
+
expect(screen.queryByLabelText('Select proposal Stale one')).toBeNull()
|
|
141
|
+
fireEvent.click(screen.getByLabelText('Select all proposals'))
|
|
142
|
+
expect(screen.getByRole('region', { name: 'Bulk actions' }).textContent).toContain('1 selected')
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
it('disables batch approve with a settings callout when governance forbids bulk apply', async () => {
|
|
146
|
+
fetchSeoProposals.mockImplementationOnce(async () =>
|
|
147
|
+
payload({ governance: { issueFixBulk: false, redirectBulk: true } }),
|
|
148
|
+
)
|
|
149
|
+
const onNavigate = vi.fn()
|
|
150
|
+
render(<ProposalsTab planInfo={null} onNavigate={onNavigate} />)
|
|
151
|
+
await screen.findByText('Duplicate meta title')
|
|
152
|
+
fireEvent.click(screen.getByLabelText('Select proposal Duplicate meta title'))
|
|
153
|
+
fireEvent.click(screen.getByLabelText('Select proposal Missing description'))
|
|
154
|
+
const approve = screen.getByRole('button', { name: 'Approve selected' })
|
|
155
|
+
expect(approve).toHaveProperty('disabled', true)
|
|
156
|
+
expect(screen.getByText(/Allow bulk apply/)).toBeTruthy()
|
|
157
|
+
expect(screen.queryByRole('link')).toBeNull()
|
|
158
|
+
fireEvent.click(screen.getByRole('button', { name: 'Open Settings → AI' }))
|
|
159
|
+
expect(onNavigate).toHaveBeenCalledWith('/settings?tab=ai')
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
it('renders the governance callout without a settings control when onNavigate is absent', async () => {
|
|
163
|
+
fetchSeoProposals.mockImplementationOnce(async () =>
|
|
164
|
+
payload({ governance: { issueFixBulk: false, redirectBulk: true } }),
|
|
165
|
+
)
|
|
166
|
+
render(<ProposalsTab planInfo={null} />)
|
|
167
|
+
await screen.findByText('Duplicate meta title')
|
|
168
|
+
fireEvent.click(screen.getByLabelText('Select all proposals'))
|
|
169
|
+
expect(screen.getByText(/Allow bulk apply/)).toBeTruthy()
|
|
170
|
+
expect(screen.queryByRole('button', { name: 'Open Settings → AI' })).toBeNull()
|
|
171
|
+
expect(screen.queryByRole('link')).toBeNull()
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
it('issues a single bulk-apply request when approve is triggered twice while in flight', async () => {
|
|
175
|
+
const inflight = deferred<{ result?: SeoProposalBulkApplyResult; error?: string }>()
|
|
176
|
+
bulkApplySeoProposals.mockImplementationOnce(() => inflight.promise)
|
|
177
|
+
render(<ProposalsTab planInfo={null} />)
|
|
178
|
+
await screen.findByText('Duplicate meta title')
|
|
179
|
+
const approve = screen.getByRole('button', { name: 'Approve Duplicate meta title' })
|
|
180
|
+
fireEvent.click(approve)
|
|
181
|
+
fireEvent.click(approve)
|
|
182
|
+
fireEvent.click(screen.getByRole('button', { name: 'Approve Missing description' }))
|
|
183
|
+
await flushMicrotasks()
|
|
184
|
+
expect(bulkApplySeoProposals).toHaveBeenCalledTimes(1)
|
|
185
|
+
expect(approve).toHaveProperty('disabled', true)
|
|
186
|
+
inflight.resolve({ result: { results: [], applied: 0, failed: 0, pending: 0 } })
|
|
187
|
+
await waitFor(() =>
|
|
188
|
+
expect(screen.getByRole('button', { name: 'Approve Duplicate meta title' })).toHaveProperty(
|
|
189
|
+
'disabled',
|
|
190
|
+
false,
|
|
191
|
+
),
|
|
192
|
+
)
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
it('disables every other mutation control while an apply is in flight', async () => {
|
|
196
|
+
const inflight = deferred<{ result?: SeoProposalBulkApplyResult; error?: string }>()
|
|
197
|
+
bulkApplySeoProposals.mockImplementationOnce(() => inflight.promise)
|
|
198
|
+
render(<ProposalsTab planInfo={null} />)
|
|
199
|
+
await screen.findByText('Duplicate meta title')
|
|
200
|
+
fireEvent.click(screen.getByLabelText('Select all proposals'))
|
|
201
|
+
fireEvent.click(screen.getByRole('button', { name: 'Approve selected' }))
|
|
202
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Apply 3 proposals' }))
|
|
203
|
+
await waitFor(() => expect(bulkApplySeoProposals).toHaveBeenCalledTimes(1))
|
|
204
|
+
expect(screen.getByRole('button', { name: 'Dismiss selected' })).toHaveProperty(
|
|
205
|
+
'disabled',
|
|
206
|
+
true,
|
|
207
|
+
)
|
|
208
|
+
expect(screen.getByRole('button', { name: 'Approve selected' })).toHaveProperty(
|
|
209
|
+
'disabled',
|
|
210
|
+
true,
|
|
211
|
+
)
|
|
212
|
+
expect(screen.getByRole('button', { name: 'Dismiss Duplicate meta title' })).toHaveProperty(
|
|
213
|
+
'disabled',
|
|
214
|
+
true,
|
|
215
|
+
)
|
|
216
|
+
expect(screen.getByRole('button', { name: 'Generate proposals (5 eligible)' })).toHaveProperty(
|
|
217
|
+
'disabled',
|
|
218
|
+
true,
|
|
219
|
+
)
|
|
220
|
+
fireEvent.click(screen.getByRole('button', { name: 'Dismiss selected' }))
|
|
221
|
+
expect(dismissSeoIssueFix).not.toHaveBeenCalled()
|
|
222
|
+
inflight.resolve({ result: { results: [], applied: 0, failed: 0, pending: 0 } })
|
|
223
|
+
await waitFor(() =>
|
|
224
|
+
expect(
|
|
225
|
+
screen.getByRole('button', { name: 'Generate proposals (5 eligible)' }),
|
|
226
|
+
).toHaveProperty('disabled', false),
|
|
227
|
+
)
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
it('re-enables controls and toasts when the apply request throws', async () => {
|
|
231
|
+
bulkApplySeoProposals.mockRejectedValueOnce(new Error('network down'))
|
|
232
|
+
render(<ProposalsTab planInfo={null} />)
|
|
233
|
+
await screen.findByText('Duplicate meta title')
|
|
234
|
+
fireEvent.click(screen.getByRole('button', { name: 'Approve Duplicate meta title' }))
|
|
235
|
+
await waitFor(() => expect(toast.error).toHaveBeenCalledWith('network down'))
|
|
236
|
+
await waitFor(() =>
|
|
237
|
+
expect(screen.getByRole('button', { name: 'Approve Duplicate meta title' })).toHaveProperty(
|
|
238
|
+
'disabled',
|
|
239
|
+
false,
|
|
240
|
+
),
|
|
241
|
+
)
|
|
242
|
+
expect(screen.getByRole('button', { name: 'Dismiss Duplicate meta title' })).toHaveProperty(
|
|
243
|
+
'disabled',
|
|
244
|
+
false,
|
|
245
|
+
)
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
it('stops the generate loop and stays silent after unmount', async () => {
|
|
249
|
+
const firstPass = deferred<{
|
|
250
|
+
result: {
|
|
251
|
+
generated: number
|
|
252
|
+
skipped: number
|
|
253
|
+
failed: number
|
|
254
|
+
remaining: number
|
|
255
|
+
haltedReason: null
|
|
256
|
+
}
|
|
257
|
+
}>()
|
|
258
|
+
generateSeoProposals.mockImplementationOnce(() => firstPass.promise)
|
|
259
|
+
const { unmount } = render(<ProposalsTab planInfo={null} />)
|
|
260
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Generate proposals (5 eligible)' }))
|
|
261
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Generate' }))
|
|
262
|
+
await waitFor(() => expect(generateSeoProposals).toHaveBeenCalledTimes(1))
|
|
263
|
+
unmount()
|
|
264
|
+
firstPass.resolve({
|
|
265
|
+
result: { generated: 1, skipped: 0, failed: 0, remaining: 1, haltedReason: null },
|
|
266
|
+
})
|
|
267
|
+
await flushMicrotasks()
|
|
268
|
+
await flushMicrotasks()
|
|
269
|
+
expect(generateSeoProposals).toHaveBeenCalledTimes(1)
|
|
270
|
+
expect(toast.success).not.toHaveBeenCalled()
|
|
271
|
+
expect(toast.error).not.toHaveBeenCalled()
|
|
272
|
+
})
|
|
273
|
+
|
|
274
|
+
it('confirming batch approve calls bulkApplySeoProposals with selected items and reports partial results', async () => {
|
|
275
|
+
bulkApplySeoProposals.mockResolvedValueOnce({
|
|
276
|
+
result: {
|
|
277
|
+
results: [
|
|
278
|
+
{ kind: 'issue-fix', id: 'i1', status: 'applied' },
|
|
279
|
+
{ kind: 'issue-fix', id: 'i2', status: 'stale', reason: 'stale' },
|
|
280
|
+
],
|
|
281
|
+
applied: 1,
|
|
282
|
+
failed: 1,
|
|
283
|
+
pending: 0,
|
|
284
|
+
},
|
|
285
|
+
})
|
|
286
|
+
const { toast } = await import('sonner')
|
|
287
|
+
render(<ProposalsTab planInfo={null} />)
|
|
288
|
+
await screen.findByText('Duplicate meta title')
|
|
289
|
+
fireEvent.click(screen.getByLabelText('Select proposal Duplicate meta title'))
|
|
290
|
+
fireEvent.click(screen.getByLabelText('Select proposal Missing description'))
|
|
291
|
+
fireEvent.click(screen.getByRole('button', { name: 'Approve selected' }))
|
|
292
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Apply 2 proposals' }))
|
|
293
|
+
await waitFor(() =>
|
|
294
|
+
expect(bulkApplySeoProposals).toHaveBeenCalledWith([
|
|
295
|
+
{ kind: 'issue-fix', id: 'i1', fingerprint: 'fp-1' },
|
|
296
|
+
{ kind: 'issue-fix', id: 'i2', fingerprint: 'fp-2' },
|
|
297
|
+
]),
|
|
298
|
+
)
|
|
299
|
+
await waitFor(() => expect(toast.success).toHaveBeenCalledWith('1 proposal applied.'))
|
|
300
|
+
expect(toast.error).toHaveBeenCalledWith(expect.stringContaining('1 could not be applied'))
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
it('offers "Apply remaining" when the server reports pending items', async () => {
|
|
304
|
+
bulkApplySeoProposals.mockResolvedValueOnce({
|
|
305
|
+
result: {
|
|
306
|
+
results: [
|
|
307
|
+
{ kind: 'issue-fix', id: 'i1', status: 'applied' },
|
|
308
|
+
{ kind: 'issue-fix', id: 'i2', status: 'pending' },
|
|
309
|
+
],
|
|
310
|
+
applied: 1,
|
|
311
|
+
failed: 0,
|
|
312
|
+
pending: 1,
|
|
313
|
+
},
|
|
314
|
+
})
|
|
315
|
+
render(<ProposalsTab planInfo={null} />)
|
|
316
|
+
await screen.findByText('Duplicate meta title')
|
|
317
|
+
fireEvent.click(screen.getByLabelText('Select all proposals'))
|
|
318
|
+
fireEvent.click(screen.getByRole('button', { name: 'Approve selected' }))
|
|
319
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Apply 3 proposals' }))
|
|
320
|
+
expect(await screen.findByRole('button', { name: 'Apply remaining (1)' })).toBeTruthy()
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
it('dismiss selected fans out to the per-kind dismiss helpers', async () => {
|
|
324
|
+
render(<ProposalsTab planInfo={null} />)
|
|
325
|
+
await screen.findByText('Duplicate meta title')
|
|
326
|
+
fireEvent.click(screen.getByLabelText('Select all proposals'))
|
|
327
|
+
fireEvent.click(screen.getByRole('button', { name: 'Dismiss selected' }))
|
|
328
|
+
await waitFor(() => expect(dismissSeoIssueFix).toHaveBeenCalledTimes(2))
|
|
329
|
+
expect(dismissRedirectSuggestion).toHaveBeenCalledWith('s1')
|
|
330
|
+
})
|
|
331
|
+
|
|
332
|
+
it('generate loops while remaining > 0 and shows the eligible count', async () => {
|
|
333
|
+
generateSeoProposals
|
|
334
|
+
.mockResolvedValueOnce({
|
|
335
|
+
result: { generated: 10, skipped: 0, failed: 0, remaining: 3, haltedReason: null },
|
|
336
|
+
})
|
|
337
|
+
.mockResolvedValueOnce({
|
|
338
|
+
result: { generated: 3, skipped: 0, failed: 0, remaining: 0, haltedReason: null },
|
|
339
|
+
})
|
|
340
|
+
const { toast } = await import('sonner')
|
|
341
|
+
render(<ProposalsTab planInfo={null} />)
|
|
342
|
+
const button = await screen.findByRole('button', { name: 'Generate proposals (5 eligible)' })
|
|
343
|
+
fireEvent.click(button)
|
|
344
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Generate' }))
|
|
345
|
+
await waitFor(() => expect(generateSeoProposals).toHaveBeenCalledTimes(2))
|
|
346
|
+
await waitFor(() => expect(toast.success).toHaveBeenCalledWith('13 proposals generated.'))
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
it('disables Generate when nothing is eligible and shows the empty state', async () => {
|
|
350
|
+
fetchSeoProposals.mockImplementationOnce(async () =>
|
|
351
|
+
payload({
|
|
352
|
+
proposals: [],
|
|
353
|
+
counts: { issueFixes: 0, redirects: 0, stale: 0, eligibleForGeneration: 0 },
|
|
354
|
+
}),
|
|
355
|
+
)
|
|
356
|
+
render(<ProposalsTab planInfo={null} />)
|
|
357
|
+
expect(await screen.findByText('No proposals yet')).toBeTruthy()
|
|
358
|
+
expect(screen.getByRole('button', { name: 'Generate proposals (0 eligible)' })).toHaveProperty(
|
|
359
|
+
'disabled',
|
|
360
|
+
true,
|
|
361
|
+
)
|
|
362
|
+
})
|
|
363
|
+
|
|
364
|
+
it('hides Generate behind the plan callout when seo.inlineApply is off', async () => {
|
|
365
|
+
render(<ProposalsTab planInfo={{ tier: 'starter', features: [], upgradeUrl: null }} />)
|
|
366
|
+
await screen.findByText('Duplicate meta title')
|
|
367
|
+
expect(screen.queryByRole('button', { name: /Generate proposals/ })).toBeNull()
|
|
368
|
+
expect(screen.getByText(/Upgrade to unlock SEO inline apply/)).toBeTruthy()
|
|
369
|
+
})
|
|
370
|
+
})
|