@growth-labs/cms 0.1.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/README.md +165 -0
- package/dist/engine/activity-log.d.ts +17 -0
- package/dist/engine/activity-log.d.ts.map +1 -0
- package/dist/engine/activity-log.js +17 -0
- package/dist/engine/activity-log.js.map +1 -0
- package/dist/engine/ai-prompts.d.ts +57 -0
- package/dist/engine/ai-prompts.d.ts.map +1 -0
- package/dist/engine/ai-prompts.js +90 -0
- package/dist/engine/ai-prompts.js.map +1 -0
- package/dist/engine/ai-writeback.d.ts +36 -0
- package/dist/engine/ai-writeback.d.ts.map +1 -0
- package/dist/engine/ai-writeback.js +45 -0
- package/dist/engine/ai-writeback.js.map +1 -0
- package/dist/engine/api-keys.d.ts +76 -0
- package/dist/engine/api-keys.d.ts.map +1 -0
- package/dist/engine/api-keys.js +165 -0
- package/dist/engine/api-keys.js.map +1 -0
- package/dist/engine/content-insights.d.ts +36 -0
- package/dist/engine/content-insights.d.ts.map +1 -0
- package/dist/engine/content-insights.js +114 -0
- package/dist/engine/content-insights.js.map +1 -0
- package/dist/engine/contributors.d.ts +25 -0
- package/dist/engine/contributors.d.ts.map +1 -0
- package/dist/engine/contributors.js +59 -0
- package/dist/engine/contributors.js.map +1 -0
- package/dist/engine/cron.d.ts +15 -0
- package/dist/engine/cron.d.ts.map +1 -0
- package/dist/engine/cron.js +33 -0
- package/dist/engine/cron.js.map +1 -0
- package/dist/engine/d1.d.ts +16 -0
- package/dist/engine/d1.d.ts.map +1 -0
- package/dist/engine/d1.js +13 -0
- package/dist/engine/d1.js.map +1 -0
- package/dist/engine/foundry-dispatch.d.ts +52 -0
- package/dist/engine/foundry-dispatch.d.ts.map +1 -0
- package/dist/engine/foundry-dispatch.js +290 -0
- package/dist/engine/foundry-dispatch.js.map +1 -0
- package/dist/engine/import-parsers.d.ts +11 -0
- package/dist/engine/import-parsers.d.ts.map +1 -0
- package/dist/engine/import-parsers.js +373 -0
- package/dist/engine/import-parsers.js.map +1 -0
- package/dist/engine/index.d.ts +28 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +57 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/invites.d.ts +78 -0
- package/dist/engine/invites.d.ts.map +1 -0
- package/dist/engine/invites.js +158 -0
- package/dist/engine/invites.js.map +1 -0
- package/dist/engine/members.d.ts +59 -0
- package/dist/engine/members.d.ts.map +1 -0
- package/dist/engine/members.js +124 -0
- package/dist/engine/members.js.map +1 -0
- package/dist/engine/membership-rules.d.ts +25 -0
- package/dist/engine/membership-rules.d.ts.map +1 -0
- package/dist/engine/membership-rules.js +44 -0
- package/dist/engine/membership-rules.js.map +1 -0
- package/dist/engine/og-render.d.ts +40 -0
- package/dist/engine/og-render.d.ts.map +1 -0
- package/dist/engine/og-render.js +26 -0
- package/dist/engine/og-render.js.map +1 -0
- package/dist/engine/publish-guard.d.ts +58 -0
- package/dist/engine/publish-guard.d.ts.map +1 -0
- package/dist/engine/publish-guard.js +80 -0
- package/dist/engine/publish-guard.js.map +1 -0
- package/dist/engine/publisher.d.ts +171 -0
- package/dist/engine/publisher.d.ts.map +1 -0
- package/dist/engine/publisher.js +597 -0
- package/dist/engine/publisher.js.map +1 -0
- package/dist/engine/revisions.d.ts +39 -0
- package/dist/engine/revisions.d.ts.map +1 -0
- package/dist/engine/revisions.js +203 -0
- package/dist/engine/revisions.js.map +1 -0
- package/dist/engine/sanitize.d.ts +52 -0
- package/dist/engine/sanitize.d.ts.map +1 -0
- package/dist/engine/sanitize.js +155 -0
- package/dist/engine/sanitize.js.map +1 -0
- package/dist/engine/seed-membership.d.ts +29 -0
- package/dist/engine/seed-membership.d.ts.map +1 -0
- package/dist/engine/seed-membership.js +65 -0
- package/dist/engine/seed-membership.js.map +1 -0
- package/dist/engine/seo.d.ts +20 -0
- package/dist/engine/seo.d.ts.map +1 -0
- package/dist/engine/seo.js +50 -0
- package/dist/engine/seo.js.map +1 -0
- package/dist/engine/slug-redirects.d.ts +8 -0
- package/dist/engine/slug-redirects.d.ts.map +1 -0
- package/dist/engine/slug-redirects.js +26 -0
- package/dist/engine/slug-redirects.js.map +1 -0
- package/dist/engine/slug.d.ts +6 -0
- package/dist/engine/slug.d.ts.map +1 -0
- package/dist/engine/slug.js +28 -0
- package/dist/engine/slug.js.map +1 -0
- package/dist/engine/soft-delete.d.ts +8 -0
- package/dist/engine/soft-delete.d.ts.map +1 -0
- package/dist/engine/soft-delete.js +28 -0
- package/dist/engine/soft-delete.js.map +1 -0
- package/dist/engine/tags.d.ts +14 -0
- package/dist/engine/tags.d.ts.map +1 -0
- package/dist/engine/tags.js +79 -0
- package/dist/engine/tags.js.map +1 -0
- package/dist/engine/topics.d.ts +10 -0
- package/dist/engine/topics.d.ts.map +1 -0
- package/dist/engine/topics.js +140 -0
- package/dist/engine/topics.js.map +1 -0
- package/dist/engine/url-guard.d.ts +12 -0
- package/dist/engine/url-guard.d.ts.map +1 -0
- package/dist/engine/url-guard.js +129 -0
- package/dist/engine/url-guard.js.map +1 -0
- package/dist/engine/validator/checks/bare-url-not-autolinked.d.ts +20 -0
- package/dist/engine/validator/checks/bare-url-not-autolinked.d.ts.map +1 -0
- package/dist/engine/validator/checks/bare-url-not-autolinked.js +54 -0
- package/dist/engine/validator/checks/bare-url-not-autolinked.js.map +1 -0
- package/dist/engine/validator/checks/broken-footnote-label.d.ts +16 -0
- package/dist/engine/validator/checks/broken-footnote-label.d.ts.map +1 -0
- package/dist/engine/validator/checks/broken-footnote-label.js +17 -0
- package/dist/engine/validator/checks/broken-footnote-label.js.map +1 -0
- package/dist/engine/validator/checks/double-encoded-entities.d.ts +18 -0
- package/dist/engine/validator/checks/double-encoded-entities.d.ts.map +1 -0
- package/dist/engine/validator/checks/double-encoded-entities.js +23 -0
- package/dist/engine/validator/checks/double-encoded-entities.js.map +1 -0
- package/dist/engine/validator/checks/empty-alt-text.d.ts +14 -0
- package/dist/engine/validator/checks/empty-alt-text.d.ts.map +1 -0
- package/dist/engine/validator/checks/empty-alt-text.js +23 -0
- package/dist/engine/validator/checks/empty-alt-text.js.map +1 -0
- package/dist/engine/validator/checks/heading-hierarchy-skip.d.ts +11 -0
- package/dist/engine/validator/checks/heading-hierarchy-skip.d.ts.map +1 -0
- package/dist/engine/validator/checks/heading-hierarchy-skip.js +20 -0
- package/dist/engine/validator/checks/heading-hierarchy-skip.js.map +1 -0
- package/dist/engine/validator/checks/html-comment-leak.d.ts +20 -0
- package/dist/engine/validator/checks/html-comment-leak.d.ts.map +1 -0
- package/dist/engine/validator/checks/html-comment-leak.js +30 -0
- package/dist/engine/validator/checks/html-comment-leak.js.map +1 -0
- package/dist/engine/validator/checks/iframe-missing-dims-and-wrapper.d.ts +12 -0
- package/dist/engine/validator/checks/iframe-missing-dims-and-wrapper.d.ts.map +1 -0
- package/dist/engine/validator/checks/iframe-missing-dims-and-wrapper.js +17 -0
- package/dist/engine/validator/checks/iframe-missing-dims-and-wrapper.js.map +1 -0
- package/dist/engine/validator/checks/invisible-control-chars.d.ts +24 -0
- package/dist/engine/validator/checks/invisible-control-chars.d.ts.map +1 -0
- package/dist/engine/validator/checks/invisible-control-chars.js +30 -0
- package/dist/engine/validator/checks/invisible-control-chars.js.map +1 -0
- package/dist/engine/validator/checks/paywall-marker-leak.d.ts +17 -0
- package/dist/engine/validator/checks/paywall-marker-leak.d.ts.map +1 -0
- package/dist/engine/validator/checks/paywall-marker-leak.js +22 -0
- package/dist/engine/validator/checks/paywall-marker-leak.js.map +1 -0
- package/dist/engine/validator/checks/raw-block-html.d.ts +28 -0
- package/dist/engine/validator/checks/raw-block-html.d.ts.map +1 -0
- package/dist/engine/validator/checks/raw-block-html.js +38 -0
- package/dist/engine/validator/checks/raw-block-html.js.map +1 -0
- package/dist/engine/validator/checks/stale-body-html.d.ts +28 -0
- package/dist/engine/validator/checks/stale-body-html.d.ts.map +1 -0
- package/dist/engine/validator/checks/stale-body-html.js +15 -0
- package/dist/engine/validator/checks/stale-body-html.js.map +1 -0
- package/dist/engine/validator/checks/unresolved-footnote-anchor.d.ts +11 -0
- package/dist/engine/validator/checks/unresolved-footnote-anchor.d.ts.map +1 -0
- package/dist/engine/validator/checks/unresolved-footnote-anchor.js +48 -0
- package/dist/engine/validator/checks/unresolved-footnote-anchor.js.map +1 -0
- package/dist/engine/validator/checks/word-gdocs-paste-artifacts.d.ts +23 -0
- package/dist/engine/validator/checks/word-gdocs-paste-artifacts.d.ts.map +1 -0
- package/dist/engine/validator/checks/word-gdocs-paste-artifacts.js +47 -0
- package/dist/engine/validator/checks/word-gdocs-paste-artifacts.js.map +1 -0
- package/dist/engine/validator/index.d.ts +75 -0
- package/dist/engine/validator/index.d.ts.map +1 -0
- package/dist/engine/validator/index.js +313 -0
- package/dist/engine/validator/index.js.map +1 -0
- package/dist/engine/validator/scan.d.ts +28 -0
- package/dist/engine/validator/scan.d.ts.map +1 -0
- package/dist/engine/validator/scan.js +97 -0
- package/dist/engine/validator/scan.js.map +1 -0
- package/dist/engine/validator/types.d.ts +50 -0
- package/dist/engine/validator/types.d.ts.map +1 -0
- package/dist/engine/validator/types.js +51 -0
- package/dist/engine/validator/types.js.map +1 -0
- package/dist/engine/webhook-signer.d.ts +39 -0
- package/dist/engine/webhook-signer.d.ts.map +1 -0
- package/dist/engine/webhook-signer.js +117 -0
- package/dist/engine/webhook-signer.js.map +1 -0
- package/dist/engine/webhooks.d.ts +75 -0
- package/dist/engine/webhooks.d.ts.map +1 -0
- package/dist/engine/webhooks.js +139 -0
- package/dist/engine/webhooks.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/index.d.ts +6 -0
- package/dist/integration/index.d.ts.map +1 -0
- package/dist/integration/index.js +294 -0
- package/dist/integration/index.js.map +1 -0
- package/dist/integration/options.d.ts +105 -0
- package/dist/integration/options.d.ts.map +1 -0
- package/dist/integration/options.js +25 -0
- package/dist/integration/options.js.map +1 -0
- package/dist/integration/vite-plugin.d.ts +4 -0
- package/dist/integration/vite-plugin.d.ts.map +1 -0
- package/dist/integration/vite-plugin.js +37 -0
- package/dist/integration/vite-plugin.js.map +1 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/null.d.ts +9 -0
- package/dist/providers/null.d.ts.map +1 -0
- package/dist/providers/null.js +144 -0
- package/dist/providers/null.js.map +1 -0
- package/dist/providers/types.d.ts +277 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/routes/ai.d.ts +25 -0
- package/dist/routes/ai.d.ts.map +1 -0
- package/dist/routes/ai.js +381 -0
- package/dist/routes/ai.js.map +1 -0
- package/dist/routes/analytics.d.ts +15 -0
- package/dist/routes/analytics.d.ts.map +1 -0
- package/dist/routes/analytics.js +61 -0
- package/dist/routes/analytics.js.map +1 -0
- package/dist/routes/api-keys.d.ts +13 -0
- package/dist/routes/api-keys.d.ts.map +1 -0
- package/dist/routes/api-keys.js +109 -0
- package/dist/routes/api-keys.js.map +1 -0
- package/dist/routes/authors.d.ts +19 -0
- package/dist/routes/authors.d.ts.map +1 -0
- package/dist/routes/authors.js +202 -0
- package/dist/routes/authors.js.map +1 -0
- package/dist/routes/authz-matrix.d.ts +78 -0
- package/dist/routes/authz-matrix.d.ts.map +1 -0
- package/dist/routes/authz-matrix.js +170 -0
- package/dist/routes/authz-matrix.js.map +1 -0
- package/dist/routes/calendar.d.ts +19 -0
- package/dist/routes/calendar.d.ts.map +1 -0
- package/dist/routes/calendar.js +89 -0
- package/dist/routes/calendar.js.map +1 -0
- package/dist/routes/config.d.ts +70 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +23 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/content-insights.d.ts +18 -0
- package/dist/routes/content-insights.d.ts.map +1 -0
- package/dist/routes/content-insights.js +137 -0
- package/dist/routes/content-insights.js.map +1 -0
- package/dist/routes/content.d.ts +145 -0
- package/dist/routes/content.d.ts.map +1 -0
- package/dist/routes/content.js +1374 -0
- package/dist/routes/content.js.map +1 -0
- package/dist/routes/context.d.ts +104 -0
- package/dist/routes/context.d.ts.map +1 -0
- package/dist/routes/context.js +26 -0
- package/dist/routes/context.js.map +1 -0
- package/dist/routes/cron.d.ts +8 -0
- package/dist/routes/cron.d.ts.map +1 -0
- package/dist/routes/cron.js +20 -0
- package/dist/routes/cron.js.map +1 -0
- package/dist/routes/dashboard.d.ts +12 -0
- package/dist/routes/dashboard.d.ts.map +1 -0
- package/dist/routes/dashboard.js +113 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/imports.d.ts +10 -0
- package/dist/routes/imports.d.ts.map +1 -0
- package/dist/routes/imports.js +149 -0
- package/dist/routes/imports.js.map +1 -0
- package/dist/routes/index.d.ts +75 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +141 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/media-lib.d.ts +75 -0
- package/dist/routes/media-lib.d.ts.map +1 -0
- package/dist/routes/media-lib.js +305 -0
- package/dist/routes/media-lib.js.map +1 -0
- package/dist/routes/media.d.ts +32 -0
- package/dist/routes/media.d.ts.map +1 -0
- package/dist/routes/media.js +756 -0
- package/dist/routes/media.js.map +1 -0
- package/dist/routes/preview.d.ts +19 -0
- package/dist/routes/preview.d.ts.map +1 -0
- package/dist/routes/preview.js +150 -0
- package/dist/routes/preview.js.map +1 -0
- package/dist/routes/rbac-invites.d.ts +31 -0
- package/dist/routes/rbac-invites.d.ts.map +1 -0
- package/dist/routes/rbac-invites.js +174 -0
- package/dist/routes/rbac-invites.js.map +1 -0
- package/dist/routes/rbac.d.ts +12 -0
- package/dist/routes/rbac.d.ts.map +1 -0
- package/dist/routes/rbac.js +126 -0
- package/dist/routes/rbac.js.map +1 -0
- package/dist/routes/shell.d.ts +22 -0
- package/dist/routes/shell.d.ts.map +1 -0
- package/dist/routes/shell.js +123 -0
- package/dist/routes/shell.js.map +1 -0
- package/dist/routes/subscriptions.d.ts +21 -0
- package/dist/routes/subscriptions.d.ts.map +1 -0
- package/dist/routes/subscriptions.js +127 -0
- package/dist/routes/subscriptions.js.map +1 -0
- package/dist/routes/tags.d.ts +23 -0
- package/dist/routes/tags.d.ts.map +1 -0
- package/dist/routes/tags.js +68 -0
- package/dist/routes/tags.js.map +1 -0
- package/dist/routes/topics.d.ts +12 -0
- package/dist/routes/topics.d.ts.map +1 -0
- package/dist/routes/topics.js +49 -0
- package/dist/routes/topics.js.map +1 -0
- package/dist/routes/webhooks.d.ts +31 -0
- package/dist/routes/webhooks.d.ts.map +1 -0
- package/dist/routes/webhooks.js +173 -0
- package/dist/routes/webhooks.js.map +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/insights-ingest.d.ts +959 -0
- package/dist/schema/insights-ingest.d.ts.map +1 -0
- package/dist/schema/insights-ingest.js +112 -0
- package/dist/schema/insights-ingest.js.map +1 -0
- package/dist/schema/migrations.d.ts +63 -0
- package/dist/schema/migrations.d.ts.map +1 -0
- package/dist/schema/migrations.js +589 -0
- package/dist/schema/migrations.js.map +1 -0
- package/dist/schema/tables.d.ts +11 -0
- package/dist/schema/tables.d.ts.map +1 -0
- package/dist/schema/tables.js +56 -0
- package/dist/schema/tables.js.map +1 -0
- package/dist/schema/types.d.ts +476 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +37 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/ui/api/_authz.d.ts +6 -0
- package/dist/ui/api/_authz.d.ts.map +1 -0
- package/dist/ui/api/_authz.js +74 -0
- package/dist/ui/api/_authz.js.map +1 -0
- package/dist/ui/api/_content-config.d.ts +22 -0
- package/dist/ui/api/_content-config.d.ts.map +1 -0
- package/dist/ui/api/_content-config.js +50 -0
- package/dist/ui/api/_content-config.js.map +1 -0
- package/dist/ui/api/activity.d.ts +3 -0
- package/dist/ui/api/activity.d.ts.map +1 -0
- package/dist/ui/api/activity.js +28 -0
- package/dist/ui/api/activity.js.map +1 -0
- package/dist/ui/api/analytics.d.ts +3 -0
- package/dist/ui/api/analytics.d.ts.map +1 -0
- package/dist/ui/api/analytics.js +36 -0
- package/dist/ui/api/analytics.js.map +1 -0
- package/dist/ui/api/authors/[id].d.ts +4 -0
- package/dist/ui/api/authors/[id].d.ts.map +1 -0
- package/dist/ui/api/authors/[id].js +17 -0
- package/dist/ui/api/authors/[id].js.map +1 -0
- package/dist/ui/api/authors.d.ts +4 -0
- package/dist/ui/api/authors.d.ts.map +1 -0
- package/dist/ui/api/authors.js +12 -0
- package/dist/ui/api/authors.js.map +1 -0
- package/dist/ui/api/calendar.d.ts +3 -0
- package/dist/ui/api/calendar.d.ts.map +1 -0
- package/dist/ui/api/calendar.js +16 -0
- package/dist/ui/api/calendar.js.map +1 -0
- package/dist/ui/api/content/[id]/ai/headlines.d.ts +3 -0
- package/dist/ui/api/content/[id]/ai/headlines.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/ai/headlines.js +7 -0
- package/dist/ui/api/content/[id]/ai/headlines.js.map +1 -0
- package/dist/ui/api/content/[id]/ai/meta-description.d.ts +3 -0
- package/dist/ui/api/content/[id]/ai/meta-description.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/ai/meta-description.js +6 -0
- package/dist/ui/api/content/[id]/ai/meta-description.js.map +1 -0
- package/dist/ui/api/content/[id]/ai/og-image.d.ts +3 -0
- package/dist/ui/api/content/[id]/ai/og-image.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/ai/og-image.js +7 -0
- package/dist/ui/api/content/[id]/ai/og-image.js.map +1 -0
- package/dist/ui/api/content/[id]/ai/proofread.d.ts +3 -0
- package/dist/ui/api/content/[id]/ai/proofread.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/ai/proofread.js +7 -0
- package/dist/ui/api/content/[id]/ai/proofread.js.map +1 -0
- package/dist/ui/api/content/[id]/ai/takeaways.d.ts +3 -0
- package/dist/ui/api/content/[id]/ai/takeaways.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/ai/takeaways.js +6 -0
- package/dist/ui/api/content/[id]/ai/takeaways.js.map +1 -0
- package/dist/ui/api/content/[id]/contributors.d.ts +4 -0
- package/dist/ui/api/content/[id]/contributors.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/contributors.js +8 -0
- package/dist/ui/api/content/[id]/contributors.js.map +1 -0
- package/dist/ui/api/content/[id]/preview-token.d.ts +3 -0
- package/dist/ui/api/content/[id]/preview-token.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/preview-token.js +16 -0
- package/dist/ui/api/content/[id]/preview-token.js.map +1 -0
- package/dist/ui/api/content/[id]/revisions/[rev]/restore.d.ts +3 -0
- package/dist/ui/api/content/[id]/revisions/[rev]/restore.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/revisions/[rev]/restore.js +7 -0
- package/dist/ui/api/content/[id]/revisions/[rev]/restore.js.map +1 -0
- package/dist/ui/api/content/[id]/revisions/[rev].d.ts +3 -0
- package/dist/ui/api/content/[id]/revisions/[rev].d.ts.map +1 -0
- package/dist/ui/api/content/[id]/revisions/[rev].js +6 -0
- package/dist/ui/api/content/[id]/revisions/[rev].js.map +1 -0
- package/dist/ui/api/content/[id]/revisions.d.ts +3 -0
- package/dist/ui/api/content/[id]/revisions.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/revisions.js +6 -0
- package/dist/ui/api/content/[id]/revisions.js.map +1 -0
- package/dist/ui/api/content/[id]/seo-score.d.ts +3 -0
- package/dist/ui/api/content/[id]/seo-score.d.ts.map +1 -0
- package/dist/ui/api/content/[id]/seo-score.js +7 -0
- package/dist/ui/api/content/[id]/seo-score.js.map +1 -0
- package/dist/ui/api/content/[id].d.ts +5 -0
- package/dist/ui/api/content/[id].d.ts.map +1 -0
- package/dist/ui/api/content/[id].js +17 -0
- package/dist/ui/api/content/[id].js.map +1 -0
- package/dist/ui/api/content/bulk.d.ts +3 -0
- package/dist/ui/api/content/bulk.d.ts.map +1 -0
- package/dist/ui/api/content/bulk.js +7 -0
- package/dist/ui/api/content/bulk.js.map +1 -0
- package/dist/ui/api/content/counts.d.ts +3 -0
- package/dist/ui/api/content/counts.d.ts.map +1 -0
- package/dist/ui/api/content/counts.js +8 -0
- package/dist/ui/api/content/counts.js.map +1 -0
- package/dist/ui/api/content/foundry-callback.d.ts +3 -0
- package/dist/ui/api/content/foundry-callback.d.ts.map +1 -0
- package/dist/ui/api/content/foundry-callback.js +8 -0
- package/dist/ui/api/content/foundry-callback.js.map +1 -0
- package/dist/ui/api/content/import/confirm.d.ts +3 -0
- package/dist/ui/api/content/import/confirm.d.ts.map +1 -0
- package/dist/ui/api/content/import/confirm.js +11 -0
- package/dist/ui/api/content/import/confirm.js.map +1 -0
- package/dist/ui/api/content/import/parse.d.ts +3 -0
- package/dist/ui/api/content/import/parse.d.ts.map +1 -0
- package/dist/ui/api/content/import/parse.js +11 -0
- package/dist/ui/api/content/import/parse.js.map +1 -0
- package/dist/ui/api/content/insights-ingest.d.ts +3 -0
- package/dist/ui/api/content/insights-ingest.d.ts.map +1 -0
- package/dist/ui/api/content/insights-ingest.js +15 -0
- package/dist/ui/api/content/insights-ingest.js.map +1 -0
- package/dist/ui/api/content-insights/dismiss.d.ts +3 -0
- package/dist/ui/api/content-insights/dismiss.d.ts.map +1 -0
- package/dist/ui/api/content-insights/dismiss.js +16 -0
- package/dist/ui/api/content-insights/dismiss.js.map +1 -0
- package/dist/ui/api/content-insights/index.d.ts +3 -0
- package/dist/ui/api/content-insights/index.d.ts.map +1 -0
- package/dist/ui/api/content-insights/index.js +12 -0
- package/dist/ui/api/content-insights/index.js.map +1 -0
- package/dist/ui/api/content-insights/undismiss.d.ts +3 -0
- package/dist/ui/api/content-insights/undismiss.d.ts.map +1 -0
- package/dist/ui/api/content-insights/undismiss.js +16 -0
- package/dist/ui/api/content-insights/undismiss.js.map +1 -0
- package/dist/ui/api/content.d.ts +4 -0
- package/dist/ui/api/content.d.ts.map +1 -0
- package/dist/ui/api/content.js +16 -0
- package/dist/ui/api/content.js.map +1 -0
- package/dist/ui/api/dashboard.d.ts +3 -0
- package/dist/ui/api/dashboard.d.ts.map +1 -0
- package/dist/ui/api/dashboard.js +22 -0
- package/dist/ui/api/dashboard.js.map +1 -0
- package/dist/ui/api/me.d.ts +3 -0
- package/dist/ui/api/me.d.ts.map +1 -0
- package/dist/ui/api/me.js +18 -0
- package/dist/ui/api/me.js.map +1 -0
- package/dist/ui/api/media/[id].d.ts +3 -0
- package/dist/ui/api/media/[id].d.ts.map +1 -0
- package/dist/ui/api/media/[id].js +17 -0
- package/dist/ui/api/media/[id].js.map +1 -0
- package/dist/ui/api/media/images.d.ts +3 -0
- package/dist/ui/api/media/images.d.ts.map +1 -0
- package/dist/ui/api/media/images.js +6 -0
- package/dist/ui/api/media/images.js.map +1 -0
- package/dist/ui/api/media/library/[id].d.ts +3 -0
- package/dist/ui/api/media/library/[id].d.ts.map +1 -0
- package/dist/ui/api/media/library/[id].js +6 -0
- package/dist/ui/api/media/library/[id].js.map +1 -0
- package/dist/ui/api/media/library.d.ts +3 -0
- package/dist/ui/api/media/library.d.ts.map +1 -0
- package/dist/ui/api/media/library.js +17 -0
- package/dist/ui/api/media/library.js.map +1 -0
- package/dist/ui/api/media/podcast/abort.d.ts +3 -0
- package/dist/ui/api/media/podcast/abort.d.ts.map +1 -0
- package/dist/ui/api/media/podcast/abort.js +4 -0
- package/dist/ui/api/media/podcast/abort.js.map +1 -0
- package/dist/ui/api/media/podcast/complete.d.ts +3 -0
- package/dist/ui/api/media/podcast/complete.d.ts.map +1 -0
- package/dist/ui/api/media/podcast/complete.js +4 -0
- package/dist/ui/api/media/podcast/complete.js.map +1 -0
- package/dist/ui/api/media/podcast/init.d.ts +3 -0
- package/dist/ui/api/media/podcast/init.d.ts.map +1 -0
- package/dist/ui/api/media/podcast/init.js +4 -0
- package/dist/ui/api/media/podcast/init.js.map +1 -0
- package/dist/ui/api/media/podcast/part.d.ts +3 -0
- package/dist/ui/api/media/podcast/part.d.ts.map +1 -0
- package/dist/ui/api/media/podcast/part.js +4 -0
- package/dist/ui/api/media/podcast/part.js.map +1 -0
- package/dist/ui/api/media/podcast.d.ts +3 -0
- package/dist/ui/api/media/podcast.d.ts.map +1 -0
- package/dist/ui/api/media/podcast.js +6 -0
- package/dist/ui/api/media/podcast.js.map +1 -0
- package/dist/ui/api/media/videos/abort.d.ts +3 -0
- package/dist/ui/api/media/videos/abort.d.ts.map +1 -0
- package/dist/ui/api/media/videos/abort.js +6 -0
- package/dist/ui/api/media/videos/abort.js.map +1 -0
- package/dist/ui/api/media/videos/complete.d.ts +3 -0
- package/dist/ui/api/media/videos/complete.d.ts.map +1 -0
- package/dist/ui/api/media/videos/complete.js +6 -0
- package/dist/ui/api/media/videos/complete.js.map +1 -0
- package/dist/ui/api/media/videos/init.d.ts +3 -0
- package/dist/ui/api/media/videos/init.d.ts.map +1 -0
- package/dist/ui/api/media/videos/init.js +6 -0
- package/dist/ui/api/media/videos/init.js.map +1 -0
- package/dist/ui/api/media/videos/part.d.ts +3 -0
- package/dist/ui/api/media/videos/part.d.ts.map +1 -0
- package/dist/ui/api/media/videos/part.js +6 -0
- package/dist/ui/api/media/videos/part.js.map +1 -0
- package/dist/ui/api/notifications.d.ts +4 -0
- package/dist/ui/api/notifications.d.ts.map +1 -0
- package/dist/ui/api/notifications.js +20 -0
- package/dist/ui/api/notifications.js.map +1 -0
- package/dist/ui/api/search.d.ts +3 -0
- package/dist/ui/api/search.d.ts.map +1 -0
- package/dist/ui/api/search.js +18 -0
- package/dist/ui/api/search.js.map +1 -0
- package/dist/ui/api/settings/api-keys/[id].d.ts +3 -0
- package/dist/ui/api/settings/api-keys/[id].d.ts.map +1 -0
- package/dist/ui/api/settings/api-keys/[id].js +22 -0
- package/dist/ui/api/settings/api-keys/[id].js.map +1 -0
- package/dist/ui/api/settings/api-keys.d.ts +4 -0
- package/dist/ui/api/settings/api-keys.d.ts.map +1 -0
- package/dist/ui/api/settings/api-keys.js +19 -0
- package/dist/ui/api/settings/api-keys.js.map +1 -0
- package/dist/ui/api/settings/domains.d.ts +3 -0
- package/dist/ui/api/settings/domains.d.ts.map +1 -0
- package/dist/ui/api/settings/domains.js +32 -0
- package/dist/ui/api/settings/domains.js.map +1 -0
- package/dist/ui/api/settings/integrations.d.ts +3 -0
- package/dist/ui/api/settings/integrations.d.ts.map +1 -0
- package/dist/ui/api/settings/integrations.js +32 -0
- package/dist/ui/api/settings/integrations.js.map +1 -0
- package/dist/ui/api/settings/members/[userId].d.ts +4 -0
- package/dist/ui/api/settings/members/[userId].d.ts.map +1 -0
- package/dist/ui/api/settings/members/[userId].js +26 -0
- package/dist/ui/api/settings/members/[userId].js.map +1 -0
- package/dist/ui/api/settings/members/invite.d.ts +3 -0
- package/dist/ui/api/settings/members/invite.d.ts.map +1 -0
- package/dist/ui/api/settings/members/invite.js +21 -0
- package/dist/ui/api/settings/members/invite.js.map +1 -0
- package/dist/ui/api/settings/members.d.ts +3 -0
- package/dist/ui/api/settings/members.d.ts.map +1 -0
- package/dist/ui/api/settings/members.js +17 -0
- package/dist/ui/api/settings/members.js.map +1 -0
- package/dist/ui/api/settings/webhooks/[id]/test.d.ts +3 -0
- package/dist/ui/api/settings/webhooks/[id]/test.d.ts.map +1 -0
- package/dist/ui/api/settings/webhooks/[id]/test.js +24 -0
- package/dist/ui/api/settings/webhooks/[id]/test.js.map +1 -0
- package/dist/ui/api/settings/webhooks/[id].d.ts +3 -0
- package/dist/ui/api/settings/webhooks/[id].d.ts.map +1 -0
- package/dist/ui/api/settings/webhooks/[id].js +23 -0
- package/dist/ui/api/settings/webhooks/[id].js.map +1 -0
- package/dist/ui/api/settings/webhooks.d.ts +4 -0
- package/dist/ui/api/settings/webhooks.d.ts.map +1 -0
- package/dist/ui/api/settings/webhooks.js +21 -0
- package/dist/ui/api/settings/webhooks.js.map +1 -0
- package/dist/ui/api/subscriptions.d.ts +4 -0
- package/dist/ui/api/subscriptions.d.ts.map +1 -0
- package/dist/ui/api/subscriptions.js +47 -0
- package/dist/ui/api/subscriptions.js.map +1 -0
- package/dist/ui/api/tags/[id].d.ts +4 -0
- package/dist/ui/api/tags/[id].d.ts.map +1 -0
- package/dist/ui/api/tags/[id].js +18 -0
- package/dist/ui/api/tags/[id].js.map +1 -0
- package/dist/ui/api/tags/index.d.ts +4 -0
- package/dist/ui/api/tags/index.d.ts.map +1 -0
- package/dist/ui/api/tags/index.js +13 -0
- package/dist/ui/api/tags/index.js.map +1 -0
- package/dist/ui/api/topics/[id].d.ts +3 -0
- package/dist/ui/api/topics/[id].d.ts.map +1 -0
- package/dist/ui/api/topics/[id].js +15 -0
- package/dist/ui/api/topics/[id].js.map +1 -0
- package/dist/ui/api/topics/index.d.ts +4 -0
- package/dist/ui/api/topics/index.d.ts.map +1 -0
- package/dist/ui/api/topics/index.js +12 -0
- package/dist/ui/api/topics/index.js.map +1 -0
- package/dist/ui/api/workspace-settings.d.ts +4 -0
- package/dist/ui/api/workspace-settings.d.ts.map +1 -0
- package/dist/ui/api/workspace-settings.js +20 -0
- package/dist/ui/api/workspace-settings.js.map +1 -0
- package/dist/ui/client/boot-state.d.ts +15 -0
- package/dist/ui/client/boot-state.d.ts.map +1 -0
- package/dist/ui/client/boot-state.js +36 -0
- package/dist/ui/client/boot-state.js.map +1 -0
- package/dist/ui/client/mount.d.ts +3 -0
- package/dist/ui/client/mount.d.ts.map +1 -0
- package/dist/ui/client/mount.js +37 -0
- package/dist/ui/client/mount.js.map +1 -0
- package/dist/ui/commands.d.ts +23 -0
- package/dist/ui/commands.d.ts.map +1 -0
- package/dist/ui/commands.js +48 -0
- package/dist/ui/commands.js.map +1 -0
- package/dist/ui/components/CmsApp.d.ts +16 -0
- package/dist/ui/components/CmsApp.d.ts.map +1 -0
- package/dist/ui/components/CmsApp.js +74 -0
- package/dist/ui/components/CmsApp.js.map +1 -0
- package/dist/ui/components/CommandPalette.d.ts +7 -0
- package/dist/ui/components/CommandPalette.d.ts.map +1 -0
- package/dist/ui/components/CommandPalette.js +61 -0
- package/dist/ui/components/CommandPalette.js.map +1 -0
- package/dist/ui/components/NoAccessScreen.d.ts +2 -0
- package/dist/ui/components/NoAccessScreen.d.ts.map +1 -0
- package/dist/ui/components/NoAccessScreen.js +42 -0
- package/dist/ui/components/NoAccessScreen.js.map +1 -0
- package/dist/ui/components/ShareModal.d.ts +27 -0
- package/dist/ui/components/ShareModal.d.ts.map +1 -0
- package/dist/ui/components/ShareModal.js +208 -0
- package/dist/ui/components/ShareModal.js.map +1 -0
- package/dist/ui/components/SharePickers.d.ts +39 -0
- package/dist/ui/components/SharePickers.d.ts.map +1 -0
- package/dist/ui/components/SharePickers.js +352 -0
- package/dist/ui/components/SharePickers.js.map +1 -0
- package/dist/ui/components/ShareStatsPanel.d.ts +22 -0
- package/dist/ui/components/ShareStatsPanel.d.ts.map +1 -0
- package/dist/ui/components/ShareStatsPanel.js +317 -0
- package/dist/ui/components/ShareStatsPanel.js.map +1 -0
- package/dist/ui/components/Sidebar.d.ts +7 -0
- package/dist/ui/components/Sidebar.d.ts.map +1 -0
- package/dist/ui/components/Sidebar.js +20 -0
- package/dist/ui/components/Sidebar.js.map +1 -0
- package/dist/ui/components/SiteSwitcher.d.ts +4 -0
- package/dist/ui/components/SiteSwitcher.d.ts.map +1 -0
- package/dist/ui/components/SiteSwitcher.js +35 -0
- package/dist/ui/components/SiteSwitcher.js.map +1 -0
- package/dist/ui/components/Topbar.d.ts +9 -0
- package/dist/ui/components/Topbar.d.ts.map +1 -0
- package/dist/ui/components/Topbar.js +20 -0
- package/dist/ui/components/Topbar.js.map +1 -0
- package/dist/ui/editor/AiAssistPanel.d.ts +8 -0
- package/dist/ui/editor/AiAssistPanel.d.ts.map +1 -0
- package/dist/ui/editor/AiAssistPanel.js +221 -0
- package/dist/ui/editor/AiAssistPanel.js.map +1 -0
- package/dist/ui/editor/ContentForm.d.ts +46 -0
- package/dist/ui/editor/ContentForm.d.ts.map +1 -0
- package/dist/ui/editor/ContentForm.js +821 -0
- package/dist/ui/editor/ContentForm.js.map +1 -0
- package/dist/ui/editor/Rte.d.ts +16 -0
- package/dist/ui/editor/Rte.d.ts.map +1 -0
- package/dist/ui/editor/Rte.js +272 -0
- package/dist/ui/editor/Rte.js.map +1 -0
- package/dist/ui/editor/ai-assist.d.ts +43 -0
- package/dist/ui/editor/ai-assist.d.ts.map +1 -0
- package/dist/ui/editor/ai-assist.js +114 -0
- package/dist/ui/editor/ai-assist.js.map +1 -0
- package/dist/ui/editor/autosave.d.ts +18 -0
- package/dist/ui/editor/autosave.d.ts.map +1 -0
- package/dist/ui/editor/autosave.js +23 -0
- package/dist/ui/editor/autosave.js.map +1 -0
- package/dist/ui/editor/content-payload.d.ts +19 -0
- package/dist/ui/editor/content-payload.d.ts.map +1 -0
- package/dist/ui/editor/content-payload.js +97 -0
- package/dist/ui/editor/content-payload.js.map +1 -0
- package/dist/ui/editor/editor-media-upload.d.ts +6 -0
- package/dist/ui/editor/editor-media-upload.d.ts.map +1 -0
- package/dist/ui/editor/editor-media-upload.js +20 -0
- package/dist/ui/editor/editor-media-upload.js.map +1 -0
- package/dist/ui/editor/serialize.d.ts +6 -0
- package/dist/ui/editor/serialize.d.ts.map +1 -0
- package/dist/ui/editor/serialize.js +479 -0
- package/dist/ui/editor/serialize.js.map +1 -0
- package/dist/ui/editor/tweet-embed.d.ts +4 -0
- package/dist/ui/editor/tweet-embed.d.ts.map +1 -0
- package/dist/ui/editor/tweet-embed.js +49 -0
- package/dist/ui/editor/tweet-embed.js.map +1 -0
- package/dist/ui/hash-router.d.ts +5 -0
- package/dist/ui/hash-router.d.ts.map +1 -0
- package/dist/ui/hash-router.js +25 -0
- package/dist/ui/hash-router.js.map +1 -0
- package/dist/ui/icons.d.ts +32 -0
- package/dist/ui/icons.d.ts.map +1 -0
- package/dist/ui/icons.js +86 -0
- package/dist/ui/icons.js.map +1 -0
- package/dist/ui/inspector/Field.d.ts +12 -0
- package/dist/ui/inspector/Field.d.ts.map +1 -0
- package/dist/ui/inspector/Field.js +8 -0
- package/dist/ui/inspector/Field.js.map +1 -0
- package/dist/ui/inspector/FoundryTab.d.ts +9 -0
- package/dist/ui/inspector/FoundryTab.d.ts.map +1 -0
- package/dist/ui/inspector/FoundryTab.js +362 -0
- package/dist/ui/inspector/FoundryTab.js.map +1 -0
- package/dist/ui/inspector/HistoryTab.d.ts +7 -0
- package/dist/ui/inspector/HistoryTab.d.ts.map +1 -0
- package/dist/ui/inspector/HistoryTab.js +289 -0
- package/dist/ui/inspector/HistoryTab.js.map +1 -0
- package/dist/ui/inspector/Inspector.d.ts +13 -0
- package/dist/ui/inspector/Inspector.d.ts.map +1 -0
- package/dist/ui/inspector/Inspector.js +163 -0
- package/dist/ui/inspector/Inspector.js.map +1 -0
- package/dist/ui/inspector/OrganizeTab.d.ts +15 -0
- package/dist/ui/inspector/OrganizeTab.d.ts.map +1 -0
- package/dist/ui/inspector/OrganizeTab.js +319 -0
- package/dist/ui/inspector/OrganizeTab.js.map +1 -0
- package/dist/ui/inspector/PublishTab.d.ts +18 -0
- package/dist/ui/inspector/PublishTab.d.ts.map +1 -0
- package/dist/ui/inspector/PublishTab.js +339 -0
- package/dist/ui/inspector/PublishTab.js.map +1 -0
- package/dist/ui/inspector/Section.d.ts +10 -0
- package/dist/ui/inspector/Section.d.ts.map +1 -0
- package/dist/ui/inspector/Section.js +40 -0
- package/dist/ui/inspector/Section.js.map +1 -0
- package/dist/ui/inspector/SeoTab.d.ts +19 -0
- package/dist/ui/inspector/SeoTab.d.ts.map +1 -0
- package/dist/ui/inspector/SeoTab.js +328 -0
- package/dist/ui/inspector/SeoTab.js.map +1 -0
- package/dist/ui/inspector/foundry-stages.d.ts +36 -0
- package/dist/ui/inspector/foundry-stages.d.ts.map +1 -0
- package/dist/ui/inspector/foundry-stages.js +101 -0
- package/dist/ui/inspector/foundry-stages.js.map +1 -0
- package/dist/ui/inspector/inspector-data.d.ts +80 -0
- package/dist/ui/inspector/inspector-data.d.ts.map +1 -0
- package/dist/ui/inspector/inspector-data.js +172 -0
- package/dist/ui/inspector/inspector-data.js.map +1 -0
- package/dist/ui/inspector/organize-data.d.ts +23 -0
- package/dist/ui/inspector/organize-data.d.ts.map +1 -0
- package/dist/ui/inspector/organize-data.js +28 -0
- package/dist/ui/inspector/organize-data.js.map +1 -0
- package/dist/ui/inspector/revision-diff.d.ts +49 -0
- package/dist/ui/inspector/revision-diff.d.ts.map +1 -0
- package/dist/ui/inspector/revision-diff.js +166 -0
- package/dist/ui/inspector/revision-diff.js.map +1 -0
- package/dist/ui/inspector/seo-helpers.d.ts +37 -0
- package/dist/ui/inspector/seo-helpers.d.ts.map +1 -0
- package/dist/ui/inspector/seo-helpers.js +37 -0
- package/dist/ui/inspector/seo-helpers.js.map +1 -0
- package/dist/ui/inspector/tab-visibility.d.ts +14 -0
- package/dist/ui/inspector/tab-visibility.d.ts.map +1 -0
- package/dist/ui/inspector/tab-visibility.js +28 -0
- package/dist/ui/inspector/tab-visibility.js.map +1 -0
- package/dist/ui/nav.d.ts +16 -0
- package/dist/ui/nav.d.ts.map +1 -0
- package/dist/ui/nav.js +33 -0
- package/dist/ui/nav.js.map +1 -0
- package/dist/ui/pages/admin.astro +32 -0
- package/dist/ui/preview/draft-page.d.ts +37 -0
- package/dist/ui/preview/draft-page.d.ts.map +1 -0
- package/dist/ui/preview/draft-page.js +212 -0
- package/dist/ui/preview/draft-page.js.map +1 -0
- package/dist/ui/preview/preview-layout.d.ts +23 -0
- package/dist/ui/preview/preview-layout.d.ts.map +1 -0
- package/dist/ui/preview/preview-layout.js +30 -0
- package/dist/ui/preview/preview-layout.js.map +1 -0
- package/dist/ui/screens/AnalyticsScreen.d.ts +2 -0
- package/dist/ui/screens/AnalyticsScreen.d.ts.map +1 -0
- package/dist/ui/screens/AnalyticsScreen.js +408 -0
- package/dist/ui/screens/AnalyticsScreen.js.map +1 -0
- package/dist/ui/screens/AuthorsScreen.d.ts +2 -0
- package/dist/ui/screens/AuthorsScreen.d.ts.map +1 -0
- package/dist/ui/screens/AuthorsScreen.js +225 -0
- package/dist/ui/screens/AuthorsScreen.js.map +1 -0
- package/dist/ui/screens/CalendarScreen.d.ts +6 -0
- package/dist/ui/screens/CalendarScreen.d.ts.map +1 -0
- package/dist/ui/screens/CalendarScreen.js +327 -0
- package/dist/ui/screens/CalendarScreen.js.map +1 -0
- package/dist/ui/screens/ContentInsightsScreen.d.ts +2 -0
- package/dist/ui/screens/ContentInsightsScreen.d.ts.map +1 -0
- package/dist/ui/screens/ContentInsightsScreen.js +129 -0
- package/dist/ui/screens/ContentInsightsScreen.js.map +1 -0
- package/dist/ui/screens/ContentRoute.d.ts +2 -0
- package/dist/ui/screens/ContentRoute.d.ts.map +1 -0
- package/dist/ui/screens/ContentRoute.js +32 -0
- package/dist/ui/screens/ContentRoute.js.map +1 -0
- package/dist/ui/screens/DashboardScreen.d.ts +6 -0
- package/dist/ui/screens/DashboardScreen.d.ts.map +1 -0
- package/dist/ui/screens/DashboardScreen.js +273 -0
- package/dist/ui/screens/DashboardScreen.js.map +1 -0
- package/dist/ui/screens/EditorScreen.d.ts +7 -0
- package/dist/ui/screens/EditorScreen.d.ts.map +1 -0
- package/dist/ui/screens/EditorScreen.js +426 -0
- package/dist/ui/screens/EditorScreen.js.map +1 -0
- package/dist/ui/screens/LibraryScreen.d.ts +6 -0
- package/dist/ui/screens/LibraryScreen.d.ts.map +1 -0
- package/dist/ui/screens/LibraryScreen.js +580 -0
- package/dist/ui/screens/LibraryScreen.js.map +1 -0
- package/dist/ui/screens/MediaScreen.d.ts +2 -0
- package/dist/ui/screens/MediaScreen.d.ts.map +1 -0
- package/dist/ui/screens/MediaScreen.js +173 -0
- package/dist/ui/screens/MediaScreen.js.map +1 -0
- package/dist/ui/screens/SettingsScreen.d.ts +4 -0
- package/dist/ui/screens/SettingsScreen.d.ts.map +1 -0
- package/dist/ui/screens/SettingsScreen.js +751 -0
- package/dist/ui/screens/SettingsScreen.js.map +1 -0
- package/dist/ui/screens/SocialShareScreen.d.ts +2 -0
- package/dist/ui/screens/SocialShareScreen.d.ts.map +1 -0
- package/dist/ui/screens/SocialShareScreen.js +224 -0
- package/dist/ui/screens/SocialShareScreen.js.map +1 -0
- package/dist/ui/screens/SubscriptionsScreen.d.ts +2 -0
- package/dist/ui/screens/SubscriptionsScreen.d.ts.map +1 -0
- package/dist/ui/screens/SubscriptionsScreen.js +441 -0
- package/dist/ui/screens/SubscriptionsScreen.js.map +1 -0
- package/dist/ui/screens/TopicsScreen.d.ts +2 -0
- package/dist/ui/screens/TopicsScreen.d.ts.map +1 -0
- package/dist/ui/screens/TopicsScreen.js +360 -0
- package/dist/ui/screens/TopicsScreen.js.map +1 -0
- package/dist/ui/screens/analytics-data.d.ts +19 -0
- package/dist/ui/screens/analytics-data.d.ts.map +1 -0
- package/dist/ui/screens/analytics-data.js +42 -0
- package/dist/ui/screens/analytics-data.js.map +1 -0
- package/dist/ui/screens/calendar-data.d.ts +45 -0
- package/dist/ui/screens/calendar-data.d.ts.map +1 -0
- package/dist/ui/screens/calendar-data.js +70 -0
- package/dist/ui/screens/calendar-data.js.map +1 -0
- package/dist/ui/screens/content-insights-data.d.ts +54 -0
- package/dist/ui/screens/content-insights-data.d.ts.map +1 -0
- package/dist/ui/screens/content-insights-data.js +82 -0
- package/dist/ui/screens/content-insights-data.js.map +1 -0
- package/dist/ui/screens/content-view.d.ts +21 -0
- package/dist/ui/screens/content-view.d.ts.map +1 -0
- package/dist/ui/screens/content-view.js +17 -0
- package/dist/ui/screens/content-view.js.map +1 -0
- package/dist/ui/screens/library-data.d.ts +76 -0
- package/dist/ui/screens/library-data.d.ts.map +1 -0
- package/dist/ui/screens/library-data.js +116 -0
- package/dist/ui/screens/library-data.js.map +1 -0
- package/dist/ui/screens/media-upload.d.ts +19 -0
- package/dist/ui/screens/media-upload.d.ts.map +1 -0
- package/dist/ui/screens/media-upload.js +187 -0
- package/dist/ui/screens/media-upload.js.map +1 -0
- package/dist/ui/screens/public-url.d.ts +24 -0
- package/dist/ui/screens/public-url.d.ts.map +1 -0
- package/dist/ui/screens/public-url.js +74 -0
- package/dist/ui/screens/public-url.js.map +1 -0
- package/dist/ui/screens/registry.d.ts +3 -0
- package/dist/ui/screens/registry.d.ts.map +1 -0
- package/dist/ui/screens/registry.js +38 -0
- package/dist/ui/screens/registry.js.map +1 -0
- package/dist/ui/screens/render-state.d.ts +105 -0
- package/dist/ui/screens/render-state.d.ts.map +1 -0
- package/dist/ui/screens/render-state.js +127 -0
- package/dist/ui/screens/render-state.js.map +1 -0
- package/dist/ui/screens/settings-data.d.ts +55 -0
- package/dist/ui/screens/settings-data.d.ts.map +1 -0
- package/dist/ui/screens/settings-data.js +89 -0
- package/dist/ui/screens/settings-data.js.map +1 -0
- package/dist/ui/screens/settings-panels-data.d.ts +58 -0
- package/dist/ui/screens/settings-panels-data.d.ts.map +1 -0
- package/dist/ui/screens/settings-panels-data.js +88 -0
- package/dist/ui/screens/settings-panels-data.js.map +1 -0
- package/dist/ui/screens/social-share-data.d.ts +307 -0
- package/dist/ui/screens/social-share-data.d.ts.map +1 -0
- package/dist/ui/screens/social-share-data.js +447 -0
- package/dist/ui/screens/social-share-data.js.map +1 -0
- package/dist/ui/screens/topics-data.d.ts +38 -0
- package/dist/ui/screens/topics-data.d.ts.map +1 -0
- package/dist/ui/screens/topics-data.js +50 -0
- package/dist/ui/screens/topics-data.js.map +1 -0
- package/dist/ui/styles/broadsheet.css +394 -0
- package/dist/ui/theme.d.ts +23 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +87 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/tweaks.d.ts +7 -0
- package/dist/ui/tweaks.d.ts.map +1 -0
- package/dist/ui/tweaks.js +31 -0
- package/dist/ui/tweaks.js.map +1 -0
- package/dist/ui/use-hash-router.d.ts +6 -0
- package/dist/ui/use-hash-router.d.ts.map +1 -0
- package/dist/ui/use-hash-router.js +15 -0
- package/dist/ui/use-hash-router.js.map +1 -0
- package/dist/ui/use-tweaks.d.ts +6 -0
- package/dist/ui/use-tweaks.d.ts.map +1 -0
- package/dist/ui/use-tweaks.js +24 -0
- package/dist/ui/use-tweaks.js.map +1 -0
- package/dist/ui/workspace-context.d.ts +34 -0
- package/dist/ui/workspace-context.d.ts.map +1 -0
- package/dist/ui/workspace-context.js +32 -0
- package/dist/ui/workspace-context.js.map +1 -0
- package/migrations/0001_create_cms_tables.sql +200 -0
- package/migrations/0002_review_softdelete_board.sql +112 -0
- package/migrations/0003_content_contributors.sql +16 -0
- package/migrations/0004_seo_faq_columns.sql +6 -0
- package/migrations/0005_revision_delta_columns.sql +5 -0
- package/migrations/0006_processing_trigger_token.sql +4 -0
- package/migrations/0007_content_slug_redirects.sql +9 -0
- package/migrations/0008_workspace_settings.sql +17 -0
- package/migrations/0009_workspace_memberships.sql +36 -0
- package/migrations/0010_api_keys_webhooks.sql +21 -0
- package/migrations/0011_notifications_activity.sql +22 -0
- package/migrations/0012_content_imports.sql +10 -0
- package/migrations/0013_media_normalization.sql +4 -0
- package/migrations/0014_api_key_prefix.sql +3 -0
- package/migrations/0015_cms_topics.sql +7 -0
- package/migrations/0016_content_insights.sql +53 -0
- package/package.json +82 -0
- package/src/engine/activity-log.ts +39 -0
- package/src/engine/ai-prompts.ts +124 -0
- package/src/engine/ai-writeback.ts +62 -0
- package/src/engine/api-keys.ts +239 -0
- package/src/engine/content-insights.ts +198 -0
- package/src/engine/contributors.ts +95 -0
- package/src/engine/cron.ts +62 -0
- package/src/engine/d1.ts +29 -0
- package/src/engine/foundry-dispatch.ts +417 -0
- package/src/engine/import-parsers.ts +478 -0
- package/src/engine/index.ts +230 -0
- package/src/engine/invites.ts +271 -0
- package/src/engine/members.ts +216 -0
- package/src/engine/membership-rules.ts +63 -0
- package/src/engine/og-render.ts +59 -0
- package/src/engine/publish-guard.ts +123 -0
- package/src/engine/publisher.ts +1032 -0
- package/src/engine/revisions.ts +292 -0
- package/src/engine/sanitize.ts +183 -0
- package/src/engine/seed-membership.ts +92 -0
- package/src/engine/seo.ts +72 -0
- package/src/engine/slug-redirects.ts +34 -0
- package/src/engine/slug.ts +33 -0
- package/src/engine/soft-delete.ts +42 -0
- package/src/engine/tags.ts +95 -0
- package/src/engine/topics.ts +158 -0
- package/src/engine/url-guard.ts +136 -0
- package/src/engine/validator/checks/bare-url-not-autolinked.ts +78 -0
- package/src/engine/validator/checks/broken-footnote-label.ts +33 -0
- package/src/engine/validator/checks/double-encoded-entities.ts +46 -0
- package/src/engine/validator/checks/empty-alt-text.ts +35 -0
- package/src/engine/validator/checks/heading-hierarchy-skip.ts +33 -0
- package/src/engine/validator/checks/html-comment-leak.ts +58 -0
- package/src/engine/validator/checks/iframe-missing-dims-and-wrapper.ts +34 -0
- package/src/engine/validator/checks/invisible-control-chars.ts +58 -0
- package/src/engine/validator/checks/paywall-marker-leak.ts +43 -0
- package/src/engine/validator/checks/raw-block-html.ts +65 -0
- package/src/engine/validator/checks/stale-body-html.ts +39 -0
- package/src/engine/validator/checks/unresolved-footnote-anchor.ts +61 -0
- package/src/engine/validator/checks/word-gdocs-paste-artifacts.ts +72 -0
- package/src/engine/validator/index.ts +385 -0
- package/src/engine/validator/scan.ts +103 -0
- package/src/engine/validator/types.ts +114 -0
- package/src/engine/webhook-signer.ts +139 -0
- package/src/engine/webhooks.ts +224 -0
- package/src/index.ts +79 -0
- package/src/integration/index.ts +298 -0
- package/src/integration/options.ts +30 -0
- package/src/integration/vite-plugin.ts +37 -0
- package/src/providers/index.ts +2 -0
- package/src/providers/null.ts +160 -0
- package/src/providers/types.ts +284 -0
- package/src/routes/ai.ts +461 -0
- package/src/routes/analytics.ts +78 -0
- package/src/routes/api-keys.ts +133 -0
- package/src/routes/authors.ts +282 -0
- package/src/routes/authz-matrix.ts +239 -0
- package/src/routes/calendar.ts +127 -0
- package/src/routes/config.ts +99 -0
- package/src/routes/content-insights.ts +159 -0
- package/src/routes/content.ts +1753 -0
- package/src/routes/context.ts +146 -0
- package/src/routes/cron.ts +27 -0
- package/src/routes/dashboard.ts +174 -0
- package/src/routes/imports.ts +190 -0
- package/src/routes/index.ts +295 -0
- package/src/routes/media-lib.ts +405 -0
- package/src/routes/media.ts +944 -0
- package/src/routes/preview.ts +182 -0
- package/src/routes/rbac-invites.ts +220 -0
- package/src/routes/rbac.ts +155 -0
- package/src/routes/shell.ts +163 -0
- package/src/routes/subscriptions.ts +167 -0
- package/src/routes/tags.ts +93 -0
- package/src/routes/topics.ts +58 -0
- package/src/routes/webhooks.ts +233 -0
- package/src/schema/index.ts +45 -0
- package/src/schema/insights-ingest.ts +126 -0
- package/src/schema/migrations.ts +599 -0
- package/src/schema/tables.ts +59 -0
- package/src/schema/types.ts +576 -0
- package/src/ui/api/_authz.ts +100 -0
- package/src/ui/api/_content-config.ts +75 -0
- package/src/ui/api/activity.ts +33 -0
- package/src/ui/api/analytics.ts +42 -0
- package/src/ui/api/authors/[id].ts +23 -0
- package/src/ui/api/authors.ts +19 -0
- package/src/ui/api/calendar.ts +21 -0
- package/src/ui/api/content/[id]/ai/headlines.ts +10 -0
- package/src/ui/api/content/[id]/ai/meta-description.ts +11 -0
- package/src/ui/api/content/[id]/ai/og-image.ts +10 -0
- package/src/ui/api/content/[id]/ai/proofread.ts +10 -0
- package/src/ui/api/content/[id]/ai/takeaways.ts +11 -0
- package/src/ui/api/content/[id]/contributors.ts +13 -0
- package/src/ui/api/content/[id]/preview-token.ts +21 -0
- package/src/ui/api/content/[id]/revisions/[rev]/restore.ts +12 -0
- package/src/ui/api/content/[id]/revisions/[rev].ts +11 -0
- package/src/ui/api/content/[id]/revisions.ts +9 -0
- package/src/ui/api/content/[id]/seo-score.ts +10 -0
- package/src/ui/api/content/[id].ts +23 -0
- package/src/ui/api/content/bulk.ts +10 -0
- package/src/ui/api/content/counts.ts +11 -0
- package/src/ui/api/content/foundry-callback.ts +11 -0
- package/src/ui/api/content/import/confirm.ts +16 -0
- package/src/ui/api/content/import/parse.ts +16 -0
- package/src/ui/api/content/insights-ingest.ts +24 -0
- package/src/ui/api/content-insights/dismiss.ts +23 -0
- package/src/ui/api/content-insights/index.ts +21 -0
- package/src/ui/api/content-insights/undismiss.ts +23 -0
- package/src/ui/api/content.ts +21 -0
- package/src/ui/api/dashboard.ts +28 -0
- package/src/ui/api/me.ts +23 -0
- package/src/ui/api/media/[id].ts +22 -0
- package/src/ui/api/media/images.ts +9 -0
- package/src/ui/api/media/library/[id].ts +9 -0
- package/src/ui/api/media/library.ts +22 -0
- package/src/ui/api/media/podcast/abort.ts +6 -0
- package/src/ui/api/media/podcast/complete.ts +6 -0
- package/src/ui/api/media/podcast/init.ts +6 -0
- package/src/ui/api/media/podcast/part.ts +6 -0
- package/src/ui/api/media/podcast.ts +9 -0
- package/src/ui/api/media/videos/abort.ts +9 -0
- package/src/ui/api/media/videos/complete.ts +9 -0
- package/src/ui/api/media/videos/init.ts +9 -0
- package/src/ui/api/media/videos/part.ts +9 -0
- package/src/ui/api/notifications.ts +26 -0
- package/src/ui/api/search.ts +23 -0
- package/src/ui/api/settings/api-keys/[id].ts +28 -0
- package/src/ui/api/settings/api-keys.ts +25 -0
- package/src/ui/api/settings/domains.ts +37 -0
- package/src/ui/api/settings/integrations.ts +40 -0
- package/src/ui/api/settings/members/[userId].ts +33 -0
- package/src/ui/api/settings/members/invite.ts +27 -0
- package/src/ui/api/settings/members.ts +23 -0
- package/src/ui/api/settings/webhooks/[id]/test.ts +30 -0
- package/src/ui/api/settings/webhooks/[id].ts +29 -0
- package/src/ui/api/settings/webhooks.ts +27 -0
- package/src/ui/api/subscriptions.ts +56 -0
- package/src/ui/api/tags/[id].ts +24 -0
- package/src/ui/api/tags/index.ts +18 -0
- package/src/ui/api/topics/[id].ts +20 -0
- package/src/ui/api/topics/index.ts +17 -0
- package/src/ui/api/workspace-settings.ts +26 -0
- package/src/ui/client/boot-state.ts +42 -0
- package/src/ui/client/mount.tsx +41 -0
- package/src/ui/commands.ts +62 -0
- package/src/ui/components/CmsApp.tsx +149 -0
- package/src/ui/components/CommandPalette.tsx +118 -0
- package/src/ui/components/NoAccessScreen.tsx +79 -0
- package/src/ui/components/ShareModal.tsx +650 -0
- package/src/ui/components/SharePickers.tsx +790 -0
- package/src/ui/components/ShareStatsPanel.tsx +721 -0
- package/src/ui/components/Sidebar.tsx +86 -0
- package/src/ui/components/SiteSwitcher.tsx +100 -0
- package/src/ui/components/Topbar.tsx +93 -0
- package/src/ui/editor/AiAssistPanel.tsx +407 -0
- package/src/ui/editor/ContentForm.tsx +1462 -0
- package/src/ui/editor/Rte.tsx +382 -0
- package/src/ui/editor/ai-assist.ts +139 -0
- package/src/ui/editor/autosave.ts +36 -0
- package/src/ui/editor/content-payload.ts +125 -0
- package/src/ui/editor/editor-media-upload.ts +26 -0
- package/src/ui/editor/serialize.ts +522 -0
- package/src/ui/editor/tweet-embed.ts +60 -0
- package/src/ui/hash-router.ts +30 -0
- package/src/ui/icons.tsx +208 -0
- package/src/ui/inspector/Field.tsx +30 -0
- package/src/ui/inspector/FoundryTab.tsx +613 -0
- package/src/ui/inspector/HistoryTab.tsx +482 -0
- package/src/ui/inspector/Inspector.tsx +328 -0
- package/src/ui/inspector/OrganizeTab.tsx +534 -0
- package/src/ui/inspector/PublishTab.tsx +626 -0
- package/src/ui/inspector/Section.tsx +81 -0
- package/src/ui/inspector/SeoTab.tsx +573 -0
- package/src/ui/inspector/foundry-stages.ts +140 -0
- package/src/ui/inspector/inspector-data.ts +232 -0
- package/src/ui/inspector/organize-data.ts +51 -0
- package/src/ui/inspector/revision-diff.ts +213 -0
- package/src/ui/inspector/seo-helpers.ts +71 -0
- package/src/ui/inspector/tab-visibility.ts +37 -0
- package/src/ui/nav.ts +48 -0
- package/src/ui/pages/admin.astro +32 -0
- package/src/ui/preview/draft-page.tsx +395 -0
- package/src/ui/preview/preview-layout.ts +49 -0
- package/src/ui/screens/AnalyticsScreen.tsx +938 -0
- package/src/ui/screens/AuthorsScreen.tsx +524 -0
- package/src/ui/screens/CalendarScreen.tsx +694 -0
- package/src/ui/screens/ContentInsightsScreen.tsx +417 -0
- package/src/ui/screens/ContentRoute.tsx +35 -0
- package/src/ui/screens/DashboardScreen.tsx +654 -0
- package/src/ui/screens/EditorScreen.tsx +673 -0
- package/src/ui/screens/LibraryScreen.tsx +1350 -0
- package/src/ui/screens/MediaScreen.tsx +357 -0
- package/src/ui/screens/SettingsScreen.tsx +1841 -0
- package/src/ui/screens/SocialShareScreen.tsx +670 -0
- package/src/ui/screens/SubscriptionsScreen.tsx +1240 -0
- package/src/ui/screens/TopicsScreen.tsx +912 -0
- package/src/ui/screens/analytics-data.ts +68 -0
- package/src/ui/screens/calendar-data.ts +126 -0
- package/src/ui/screens/content-insights-data.ts +127 -0
- package/src/ui/screens/content-view.ts +30 -0
- package/src/ui/screens/library-data.ts +177 -0
- package/src/ui/screens/media-upload.ts +283 -0
- package/src/ui/screens/public-url.ts +81 -0
- package/src/ui/screens/registry.tsx +53 -0
- package/src/ui/screens/render-state.ts +228 -0
- package/src/ui/screens/settings-data.ts +140 -0
- package/src/ui/screens/settings-panels-data.ts +142 -0
- package/src/ui/screens/social-share-data.ts +753 -0
- package/src/ui/screens/topics-data.ts +75 -0
- package/src/ui/styles/broadsheet.css +394 -0
- package/src/ui/theme.ts +104 -0
- package/src/ui/tweaks.ts +37 -0
- package/src/ui/use-hash-router.ts +17 -0
- package/src/ui/use-tweaks.ts +31 -0
- package/src/ui/workspace-context.tsx +62 -0
- package/src/virtual.d.ts +4 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `word-gdocs-paste-artifacts`
|
|
3
|
+
*
|
|
4
|
+
* Detect Microsoft Word / Google Docs paste residue that the import
|
|
5
|
+
* pipeline failed to strip. These markers either render as visible junk
|
|
6
|
+
* (the comment markers) or burn unused class attributes into the DOM
|
|
7
|
+
* (Mso* class names, mso-* style properties).
|
|
8
|
+
*
|
|
9
|
+
* Block-severity: when these appear, the body is not safe to publish
|
|
10
|
+
* raw — they have triggered measurable layout regressions in the past
|
|
11
|
+
* (the `Mso*` classes inherit Word's default font stack, which leaks
|
|
12
|
+
* Times New Roman into the prose font).
|
|
13
|
+
*/
|
|
14
|
+
import type { ArticleBodyInput, ValidationError } from '../types.js';
|
|
15
|
+
export declare function check(input: ArticleBodyInput): ValidationError[];
|
|
16
|
+
/**
|
|
17
|
+
* Pure repair: drop Mso* class attributes, Start* fragment comments,
|
|
18
|
+
* and mso-* CSS rules. The repair is conservative — we keep the
|
|
19
|
+
* surrounding element and strip the offending attribute / declaration
|
|
20
|
+
* rather than removing the whole node.
|
|
21
|
+
*/
|
|
22
|
+
export declare function repair(value: string): string;
|
|
23
|
+
//# sourceMappingURL=word-gdocs-paste-artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-gdocs-paste-artifacts.d.ts","sourceRoot":"","sources":["../../../../src/engine/validator/checks/word-gdocs-paste-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAMpE,wBAAgB,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,EAAE,CAmBhE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyB5C"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { makeError } from '../types.js';
|
|
2
|
+
const PATTERN = /\sclass\s*=\s*"?Mso\w+|<!--\s*Start(?:Fragment|HTML|Selection)\s*-->|mso-(?:margin|para|list|ascii|fareast|hansi|bidi)-/i;
|
|
3
|
+
export function check(input) {
|
|
4
|
+
const errors = [];
|
|
5
|
+
const checkField = (value, fieldName) => {
|
|
6
|
+
if (!value)
|
|
7
|
+
return;
|
|
8
|
+
const match = PATTERN.exec(value);
|
|
9
|
+
if (!match)
|
|
10
|
+
return;
|
|
11
|
+
errors.push(makeError('word-gdocs-paste-artifacts', `${fieldName} contains Word/Google Docs paste residue (matched '${match[0]}'). Strip Mso* classes and mso-* styles before publishing.`, { start: match.index, end: match.index + match[0].length }));
|
|
12
|
+
};
|
|
13
|
+
checkField(input.body_markdown, 'body_markdown');
|
|
14
|
+
checkField(input.body_html, 'body_html');
|
|
15
|
+
return errors;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Pure repair: drop Mso* class attributes, Start* fragment comments,
|
|
19
|
+
* and mso-* CSS rules. The repair is conservative — we keep the
|
|
20
|
+
* surrounding element and strip the offending attribute / declaration
|
|
21
|
+
* rather than removing the whole node.
|
|
22
|
+
*/
|
|
23
|
+
export function repair(value) {
|
|
24
|
+
return (value
|
|
25
|
+
// Drop class attributes that contain Mso* tokens.
|
|
26
|
+
.replace(/\sclass\s*=\s*"([^"]*)"/gi, (_match, classes) => {
|
|
27
|
+
const filtered = classes
|
|
28
|
+
.split(/\s+/)
|
|
29
|
+
.filter((token) => !/^Mso\w+/i.test(token))
|
|
30
|
+
.join(' ')
|
|
31
|
+
.trim();
|
|
32
|
+
return filtered ? ` class="${filtered}"` : '';
|
|
33
|
+
})
|
|
34
|
+
.replace(/\sclass\s*=\s*'([^']*)'/gi, (_match, classes) => {
|
|
35
|
+
const filtered = classes
|
|
36
|
+
.split(/\s+/)
|
|
37
|
+
.filter((token) => !/^Mso\w+/i.test(token))
|
|
38
|
+
.join(' ')
|
|
39
|
+
.trim();
|
|
40
|
+
return filtered ? ` class='${filtered}'` : '';
|
|
41
|
+
})
|
|
42
|
+
// Drop Start*/End* fragment markers entirely.
|
|
43
|
+
.replace(/<!--\s*(?:Start|End)(?:Fragment|HTML|Selection)\s*-->/gi, '')
|
|
44
|
+
// Drop mso-* CSS declarations.
|
|
45
|
+
.replace(/mso-(?:margin|para|list|ascii|fareast|hansi|bidi)-[^;"'>]*;?/gi, ''));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=word-gdocs-paste-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-gdocs-paste-artifacts.js","sourceRoot":"","sources":["../../../../src/engine/validator/checks/word-gdocs-paste-artifacts.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,OAAO,GACZ,0HAA0H,CAAA;AAE3H,MAAM,UAAU,KAAK,CAAC,KAAuB;IAC5C,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,MAAM,UAAU,GAAG,CAAC,KAAoB,EAAE,SAAiB,EAAE,EAAE;QAC9D,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,MAAM,CAAC,IAAI,CACV,SAAS,CACR,4BAA4B,EAC5B,GAAG,SAAS,sDAAsD,KAAK,CAAC,CAAC,CAAC,4DAA4D,EACtI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAC1D,CACD,CAAA;IACF,CAAC,CAAA;IAED,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA;IAChD,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IACxC,OAAO,MAAM,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa;IACnC,OAAO,CACN,KAAK;QACJ,kDAAkD;SACjD,OAAO,CAAC,2BAA2B,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;QACjE,MAAM,QAAQ,GAAG,OAAO;aACtB,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC1C,IAAI,CAAC,GAAG,CAAC;aACT,IAAI,EAAE,CAAA;QACR,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9C,CAAC,CAAC;SACD,OAAO,CAAC,2BAA2B,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;QACjE,MAAM,QAAQ,GAAG,OAAO;aACtB,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC1C,IAAI,CAAC,GAAG,CAAC;aACT,IAAI,EAAE,CAAA;QACR,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9C,CAAC,CAAC;QACF,8CAA8C;SAC7C,OAAO,CAAC,yDAAyD,EAAE,EAAE,CAAC;QACvE,+BAA+B;SAC9B,OAAO,CAAC,gEAAgE,EAAE,EAAE,CAAC,CAC/E,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* article-body-validator (modular layout)
|
|
3
|
+
*
|
|
4
|
+
* The validator is the single source of truth for ingest-time formatting
|
|
5
|
+
* QA. Each `checks/<code>.ts` file implements one independent detector;
|
|
6
|
+
* this index module composes them into the public API used by the
|
|
7
|
+
* publish guard and the publishing engine.
|
|
8
|
+
*
|
|
9
|
+
* Ported verbatim from fulcrum-labs/fronts
|
|
10
|
+
* src/lib/article-body-validator/index.ts (inventory §1: extract). The
|
|
11
|
+
* validator runs on PRE-strip source; renderer-side cleanup happens AFTER
|
|
12
|
+
* the validator has emitted its report so ingest bugs stay visible.
|
|
13
|
+
*/
|
|
14
|
+
import * as bareUrl from './checks/bare-url-not-autolinked.js';
|
|
15
|
+
import * as brokenFootnoteLabel from './checks/broken-footnote-label.js';
|
|
16
|
+
import * as doubleEncoded from './checks/double-encoded-entities.js';
|
|
17
|
+
import * as emptyAlt from './checks/empty-alt-text.js';
|
|
18
|
+
import * as headingHierarchy from './checks/heading-hierarchy-skip.js';
|
|
19
|
+
import * as htmlCommentLeak from './checks/html-comment-leak.js';
|
|
20
|
+
import * as iframeMissingDims from './checks/iframe-missing-dims-and-wrapper.js';
|
|
21
|
+
import * as invisibleControl from './checks/invisible-control-chars.js';
|
|
22
|
+
import * as paywallMarker from './checks/paywall-marker-leak.js';
|
|
23
|
+
import * as rawBlockHtml from './checks/raw-block-html.js';
|
|
24
|
+
import * as unresolvedAnchor from './checks/unresolved-footnote-anchor.js';
|
|
25
|
+
import * as wordGdocs from './checks/word-gdocs-paste-artifacts.js';
|
|
26
|
+
import type { ArticleBodyInput, Severity, ValidationError, ValidationErrorCode, ValidationResult, ValidatorOptions } from './types.js';
|
|
27
|
+
import { DEFAULT_OPTIONS, SEVERITY } from './types.js';
|
|
28
|
+
/**
|
|
29
|
+
* Astro 500 error template fingerprints. The build-time guard looks for
|
|
30
|
+
* the same set, so the static-output check and the pre-publish check
|
|
31
|
+
* agree on what a baked server-error page looks like.
|
|
32
|
+
*/
|
|
33
|
+
export declare const ASTRO_SERVER_ERROR_PATTERNS: readonly RegExp[];
|
|
34
|
+
export declare function checkDataUriArtifact(input: ArticleBodyInput): ValidationError[];
|
|
35
|
+
export declare function checkBakedAstroErrorTemplate(input: ArticleBodyInput): ValidationError[];
|
|
36
|
+
export declare function checkEscapedRawHtml(input: ArticleBodyInput): ValidationError[];
|
|
37
|
+
export declare function checkMalformedDataImageMarkdown(input: ArticleBodyInput): ValidationError[];
|
|
38
|
+
export declare function checkUnbalancedMarkdownEmphasis(input: ArticleBodyInput): ValidationError[];
|
|
39
|
+
export declare function checkSingleSentenceParagraphsPattern(input: ArticleBodyInput, options?: ValidatorOptions): ValidationError[];
|
|
40
|
+
export declare function checkBackslashOverEscape(input: ArticleBodyInput): ValidationError[];
|
|
41
|
+
export declare function checkHtmlEntityInHeading(input: ArticleBodyInput): ValidationError[];
|
|
42
|
+
export declare function checkEmptyBody(input: ArticleBodyInput): ValidationError[];
|
|
43
|
+
export declare const checkBrokenFootnoteLabel: typeof brokenFootnoteLabel.check;
|
|
44
|
+
export declare const checkUnresolvedFootnoteAnchor: typeof unresolvedAnchor.check;
|
|
45
|
+
export declare const checkWordGdocsPasteArtifacts: typeof wordGdocs.check;
|
|
46
|
+
export declare const checkHtmlCommentLeak: typeof htmlCommentLeak.check;
|
|
47
|
+
export declare const checkRawBlockHtml: typeof rawBlockHtml.check;
|
|
48
|
+
export declare const checkDoubleEncodedEntities: typeof doubleEncoded.check;
|
|
49
|
+
export declare const checkInvisibleControlChars: typeof invisibleControl.check;
|
|
50
|
+
export declare const checkBareUrlNotAutolinked: typeof bareUrl.check;
|
|
51
|
+
export declare const checkEmptyAltText: typeof emptyAlt.check;
|
|
52
|
+
export declare const checkIframeMissingDimsAndWrapper: typeof iframeMissingDims.check;
|
|
53
|
+
export declare const checkHeadingHierarchySkip: typeof headingHierarchy.check;
|
|
54
|
+
export declare const checkPaywallMarkerLeak: typeof paywallMarker.check;
|
|
55
|
+
export interface RunOptions extends ValidatorOptions {
|
|
56
|
+
requireBody: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare const DEFAULT_RUN_OPTIONS: RunOptions;
|
|
59
|
+
/**
|
|
60
|
+
* Run every check in a deterministic order and aggregate the errors.
|
|
61
|
+
* Structural problems (empty body, baked-error template) come first;
|
|
62
|
+
* the body-string checks follow; the noisiest heuristic checks
|
|
63
|
+
* (paragraph-split pattern) come last.
|
|
64
|
+
*/
|
|
65
|
+
export declare function validateArticleBody(input: ArticleBodyInput, options?: Partial<RunOptions>): ValidationResult;
|
|
66
|
+
/**
|
|
67
|
+
* Filter a list of errors down to those with `block` severity. Callers
|
|
68
|
+
* use this to decide between 422 (block) and 200 + warnings (warn-only).
|
|
69
|
+
*/
|
|
70
|
+
export declare function blockErrors(errors: ValidationError[]): ValidationError[];
|
|
71
|
+
export declare function warnErrors(errors: ValidationError[]): ValidationError[];
|
|
72
|
+
export declare function formatValidationErrors(errors: ValidationError[]): string;
|
|
73
|
+
export type { ArticleBodyInput, Severity, ValidationError, ValidationErrorCode, ValidationResult, ValidatorOptions, };
|
|
74
|
+
export { DEFAULT_OPTIONS, SEVERITY };
|
|
75
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* article-body-validator (modular layout)
|
|
3
|
+
*
|
|
4
|
+
* The validator is the single source of truth for ingest-time formatting
|
|
5
|
+
* QA. Each `checks/<code>.ts` file implements one independent detector;
|
|
6
|
+
* this index module composes them into the public API used by the
|
|
7
|
+
* publish guard and the publishing engine.
|
|
8
|
+
*
|
|
9
|
+
* Ported verbatim from fulcrum-labs/fronts
|
|
10
|
+
* src/lib/article-body-validator/index.ts (inventory §1: extract). The
|
|
11
|
+
* validator runs on PRE-strip source; renderer-side cleanup happens AFTER
|
|
12
|
+
* the validator has emitted its report so ingest bugs stay visible.
|
|
13
|
+
*/
|
|
14
|
+
import * as bareUrl from './checks/bare-url-not-autolinked.js';
|
|
15
|
+
import * as brokenFootnoteLabel from './checks/broken-footnote-label.js';
|
|
16
|
+
import * as doubleEncoded from './checks/double-encoded-entities.js';
|
|
17
|
+
import * as emptyAlt from './checks/empty-alt-text.js';
|
|
18
|
+
import * as headingHierarchy from './checks/heading-hierarchy-skip.js';
|
|
19
|
+
import * as htmlCommentLeak from './checks/html-comment-leak.js';
|
|
20
|
+
import * as iframeMissingDims from './checks/iframe-missing-dims-and-wrapper.js';
|
|
21
|
+
import * as invisibleControl from './checks/invisible-control-chars.js';
|
|
22
|
+
import * as paywallMarker from './checks/paywall-marker-leak.js';
|
|
23
|
+
import * as rawBlockHtml from './checks/raw-block-html.js';
|
|
24
|
+
import * as unresolvedAnchor from './checks/unresolved-footnote-anchor.js';
|
|
25
|
+
import * as wordGdocs from './checks/word-gdocs-paste-artifacts.js';
|
|
26
|
+
import { DEFAULT_OPTIONS, makeError, SEVERITY } from './types.js';
|
|
27
|
+
/* -------------------------------------------------------------------------- */
|
|
28
|
+
/* Phase 0 / Phase 1 — preserved checks */
|
|
29
|
+
/* -------------------------------------------------------------------------- */
|
|
30
|
+
/**
|
|
31
|
+
* Astro 500 error template fingerprints. The build-time guard looks for
|
|
32
|
+
* the same set, so the static-output check and the pre-publish check
|
|
33
|
+
* agree on what a baked server-error page looks like.
|
|
34
|
+
*/
|
|
35
|
+
export const ASTRO_SERVER_ERROR_PATTERNS = [
|
|
36
|
+
/<title>\s*Server Error(?:\s*\|\s*Fronts)?\s*<\/title>/i,
|
|
37
|
+
/Fronts encountered an unexpected error\./i,
|
|
38
|
+
/The request reached Fronts but the response failed before rendering completed\./i,
|
|
39
|
+
/Something broke upstream\./i,
|
|
40
|
+
];
|
|
41
|
+
const LEGIT_ESCAPE_CHARS = '*_[]{}|`#+!>\\-';
|
|
42
|
+
function isBlank(value) {
|
|
43
|
+
return !value || value.trim().length === 0;
|
|
44
|
+
}
|
|
45
|
+
export function checkDataUriArtifact(input) {
|
|
46
|
+
const errors = [];
|
|
47
|
+
const pattern = /data:image\/[a-z0-9+.-]+;base64,/i;
|
|
48
|
+
const checkField = (value, fieldName) => {
|
|
49
|
+
if (!value)
|
|
50
|
+
return;
|
|
51
|
+
const match = pattern.exec(value);
|
|
52
|
+
if (!match)
|
|
53
|
+
return;
|
|
54
|
+
errors.push(makeError('data-uri-artifact', `Article body contains an inline data:image base64 payload in ${fieldName}; bodies must reference R2 URLs only.`, { start: match.index, end: match.index + match[0].length }));
|
|
55
|
+
};
|
|
56
|
+
checkField(input.body_markdown, 'body_markdown');
|
|
57
|
+
checkField(input.body_html, 'body_html');
|
|
58
|
+
return errors;
|
|
59
|
+
}
|
|
60
|
+
export function checkBakedAstroErrorTemplate(input) {
|
|
61
|
+
const errors = [];
|
|
62
|
+
const checkField = (value, fieldName) => {
|
|
63
|
+
if (!value)
|
|
64
|
+
return;
|
|
65
|
+
for (const pattern of ASTRO_SERVER_ERROR_PATTERNS) {
|
|
66
|
+
const match = pattern.exec(value);
|
|
67
|
+
if (!match)
|
|
68
|
+
continue;
|
|
69
|
+
errors.push(makeError('baked-astro-error-template', `Article body in ${fieldName} matches a baked Astro server-error template fingerprint.`, { start: match.index, end: match.index + match[0].length }));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
checkField(input.body_markdown, 'body_markdown');
|
|
74
|
+
checkField(input.body_html, 'body_html');
|
|
75
|
+
return errors;
|
|
76
|
+
}
|
|
77
|
+
export function checkEscapedRawHtml(input) {
|
|
78
|
+
const errors = [];
|
|
79
|
+
if (!input.body_markdown)
|
|
80
|
+
return errors;
|
|
81
|
+
const patterns = [
|
|
82
|
+
{ tag: 'iframe', re: /<iframe[\s>]/i },
|
|
83
|
+
{ tag: 'img', re: /<img[\s>]/i },
|
|
84
|
+
];
|
|
85
|
+
for (const { tag, re } of patterns) {
|
|
86
|
+
const match = re.exec(input.body_markdown);
|
|
87
|
+
if (!match)
|
|
88
|
+
continue;
|
|
89
|
+
errors.push(makeError('escaped-raw-html', `body_markdown contains escaped raw <${tag}> markup — this will render as literal text. Decode the entities before saving.`, { start: match.index, end: match.index + match[0].length }));
|
|
90
|
+
}
|
|
91
|
+
return errors;
|
|
92
|
+
}
|
|
93
|
+
export function checkMalformedDataImageMarkdown(input) {
|
|
94
|
+
if (!input.body_markdown)
|
|
95
|
+
return [];
|
|
96
|
+
const pattern = /\[!\[[^\]]*\]\(data:image\/[a-z0-9+.-]+;base64,/i;
|
|
97
|
+
const match = pattern.exec(input.body_markdown);
|
|
98
|
+
if (!match)
|
|
99
|
+
return [];
|
|
100
|
+
return [
|
|
101
|
+
makeError('malformed-data-image-markdown', 'body_markdown contains the [] artifact from a broken import. Replace the inline payload with an R2 URL.', { start: match.index, end: match.index + match[0].length }),
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
export function checkUnbalancedMarkdownEmphasis(input) {
|
|
105
|
+
if (!input.body_markdown)
|
|
106
|
+
return [];
|
|
107
|
+
const errors = [];
|
|
108
|
+
const lines = input.body_markdown.split('\n');
|
|
109
|
+
let lineStart = 0;
|
|
110
|
+
for (const rawLine of lines) {
|
|
111
|
+
const len = rawLine.length + 1;
|
|
112
|
+
const lineStartHere = lineStart;
|
|
113
|
+
lineStart += len;
|
|
114
|
+
const stripped = rawLine.replace(/`[^`]*`/g, '');
|
|
115
|
+
const noStrong = stripped.replace(/\*\*/g, '').replace(/__/g, '');
|
|
116
|
+
const noEscaped = noStrong.replace(/\\[*_]/g, '');
|
|
117
|
+
const stars = (noEscaped.match(/\*/g) || []).length;
|
|
118
|
+
const unders = (noEscaped.match(/(?<=\w)_(?=\w)|(?<!\w)_|_(?!\w)/g) || []).length;
|
|
119
|
+
if (stars % 2 === 1) {
|
|
120
|
+
const idx = noEscaped.indexOf('*');
|
|
121
|
+
errors.push(makeError('unbalanced-markdown-emphasis', "Line has an unbalanced '*' emphasis marker.", {
|
|
122
|
+
start: lineStartHere + (idx >= 0 ? idx : 0),
|
|
123
|
+
end: lineStartHere + rawLine.length,
|
|
124
|
+
}));
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
if (unders % 2 === 1) {
|
|
128
|
+
const idx = noEscaped.indexOf('_');
|
|
129
|
+
errors.push(makeError('unbalanced-markdown-emphasis', "Line has an unbalanced '_' emphasis marker.", {
|
|
130
|
+
start: lineStartHere + (idx >= 0 ? idx : 0),
|
|
131
|
+
end: lineStartHere + rawLine.length,
|
|
132
|
+
}));
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return errors;
|
|
137
|
+
}
|
|
138
|
+
export function checkSingleSentenceParagraphsPattern(input, options = DEFAULT_OPTIONS) {
|
|
139
|
+
if (!input.body_markdown)
|
|
140
|
+
return [];
|
|
141
|
+
const paragraphs = input.body_markdown
|
|
142
|
+
.split(/\n{2,}/)
|
|
143
|
+
.map((p) => p.trim())
|
|
144
|
+
.filter((p) => p.length > 0);
|
|
145
|
+
if (paragraphs.length < options.singleSentenceParagraphRun)
|
|
146
|
+
return [];
|
|
147
|
+
let run = 0;
|
|
148
|
+
let runStartIndex = -1;
|
|
149
|
+
for (let i = 0; i < paragraphs.length; i += 1) {
|
|
150
|
+
const para = paragraphs[i];
|
|
151
|
+
if (isLikelyProseParagraph(para) && countSentences(para) <= 1) {
|
|
152
|
+
if (run === 0)
|
|
153
|
+
runStartIndex = i;
|
|
154
|
+
run += 1;
|
|
155
|
+
if (run >= options.singleSentenceParagraphRun) {
|
|
156
|
+
return [
|
|
157
|
+
makeError('single-sentence-paragraphs-pattern', `Found ${run}+ consecutive single-sentence paragraphs starting at paragraph ${runStartIndex + 1}; this usually indicates an over-split import.`),
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
run = 0;
|
|
163
|
+
runStartIndex = -1;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
function isLikelyProseParagraph(paragraph) {
|
|
169
|
+
const trimmed = paragraph.trim();
|
|
170
|
+
if (trimmed.startsWith('#'))
|
|
171
|
+
return false;
|
|
172
|
+
if (trimmed.startsWith('>'))
|
|
173
|
+
return false;
|
|
174
|
+
if (trimmed.startsWith('- ') || /^\d+\.\s/.test(trimmed))
|
|
175
|
+
return false;
|
|
176
|
+
if (trimmed.startsWith('```'))
|
|
177
|
+
return false;
|
|
178
|
+
if (trimmed.startsWith('<') && trimmed.endsWith('>'))
|
|
179
|
+
return false;
|
|
180
|
+
if (trimmed.startsWith('![') || trimmed.startsWith('['))
|
|
181
|
+
return false;
|
|
182
|
+
if (trimmed.length < 20)
|
|
183
|
+
return false;
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
function countSentences(paragraph) {
|
|
187
|
+
const stripped = paragraph
|
|
188
|
+
.replace(/`[^`]*`/g, '')
|
|
189
|
+
.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
190
|
+
.replace(/\*([^*]+)\*/g, '$1');
|
|
191
|
+
const matches = stripped.match(/[.!?](?:\s+|$)/g);
|
|
192
|
+
return matches ? matches.length : 0;
|
|
193
|
+
}
|
|
194
|
+
export function checkBackslashOverEscape(input) {
|
|
195
|
+
if (!input.body_markdown)
|
|
196
|
+
return [];
|
|
197
|
+
const pattern = /\\([^\s\\])/g;
|
|
198
|
+
for (const match of input.body_markdown.matchAll(pattern)) {
|
|
199
|
+
const ch = match[1] ?? '';
|
|
200
|
+
if (LEGIT_ESCAPE_CHARS.includes(ch))
|
|
201
|
+
continue;
|
|
202
|
+
const start = match.index ?? 0;
|
|
203
|
+
return [
|
|
204
|
+
makeError('backslash-over-escape', `body_markdown contains backslash-over-escape (e.g. '\\${ch}') from a broken import. Strip the legacy escapes before publishing.`, { start, end: start + match[0].length }),
|
|
205
|
+
];
|
|
206
|
+
}
|
|
207
|
+
return [];
|
|
208
|
+
}
|
|
209
|
+
const HEADING_ENTITY_PATTERN = /&(?:quot|apos|amp|lt|gt|#\d+);/i;
|
|
210
|
+
export function checkHtmlEntityInHeading(input) {
|
|
211
|
+
if (!input.body_markdown)
|
|
212
|
+
return [];
|
|
213
|
+
const lines = input.body_markdown.split('\n');
|
|
214
|
+
let cursor = 0;
|
|
215
|
+
for (const rawLine of lines) {
|
|
216
|
+
const lineLen = rawLine.length + 1;
|
|
217
|
+
const trimmed = rawLine.trimStart();
|
|
218
|
+
if (/^#{1,6}\s+/.test(trimmed)) {
|
|
219
|
+
const headingText = trimmed.replace(/^#{1,6}\s+/, '');
|
|
220
|
+
const match = HEADING_ENTITY_PATTERN.exec(headingText);
|
|
221
|
+
if (match) {
|
|
222
|
+
const entityStart = cursor +
|
|
223
|
+
(rawLine.length - trimmed.length) +
|
|
224
|
+
(trimmed.length - headingText.length) +
|
|
225
|
+
(match.index ?? 0);
|
|
226
|
+
return [
|
|
227
|
+
makeError('html-entity-in-heading', `Heading contains an HTML entity ('${match[0]}'); headings must be raw characters or the TOC will display the entity code.`, { start: entityStart, end: entityStart + match[0].length }),
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
cursor += lineLen;
|
|
232
|
+
}
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
export function checkEmptyBody(input) {
|
|
236
|
+
if (isBlank(input.body_markdown) && isBlank(input.body_html)) {
|
|
237
|
+
return [
|
|
238
|
+
makeError('empty-body', 'Both body_markdown and body_html are empty — refusing to publish an article with no content.'),
|
|
239
|
+
];
|
|
240
|
+
}
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
/* -------------------------------------------------------------------------- */
|
|
244
|
+
/* Phase 2 — re-exported check fns */
|
|
245
|
+
/* -------------------------------------------------------------------------- */
|
|
246
|
+
export const checkBrokenFootnoteLabel = brokenFootnoteLabel.check;
|
|
247
|
+
export const checkUnresolvedFootnoteAnchor = unresolvedAnchor.check;
|
|
248
|
+
export const checkWordGdocsPasteArtifacts = wordGdocs.check;
|
|
249
|
+
export const checkHtmlCommentLeak = htmlCommentLeak.check;
|
|
250
|
+
export const checkRawBlockHtml = rawBlockHtml.check;
|
|
251
|
+
export const checkDoubleEncodedEntities = doubleEncoded.check;
|
|
252
|
+
export const checkInvisibleControlChars = invisibleControl.check;
|
|
253
|
+
export const checkBareUrlNotAutolinked = bareUrl.check;
|
|
254
|
+
export const checkEmptyAltText = emptyAlt.check;
|
|
255
|
+
export const checkIframeMissingDimsAndWrapper = iframeMissingDims.check;
|
|
256
|
+
export const checkHeadingHierarchySkip = headingHierarchy.check;
|
|
257
|
+
export const checkPaywallMarkerLeak = paywallMarker.check;
|
|
258
|
+
export const DEFAULT_RUN_OPTIONS = {
|
|
259
|
+
...DEFAULT_OPTIONS,
|
|
260
|
+
requireBody: true,
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* Run every check in a deterministic order and aggregate the errors.
|
|
264
|
+
* Structural problems (empty body, baked-error template) come first;
|
|
265
|
+
* the body-string checks follow; the noisiest heuristic checks
|
|
266
|
+
* (paragraph-split pattern) come last.
|
|
267
|
+
*/
|
|
268
|
+
export function validateArticleBody(input, options = {}) {
|
|
269
|
+
const opts = { ...DEFAULT_RUN_OPTIONS, ...options };
|
|
270
|
+
const errors = [];
|
|
271
|
+
if (opts.requireBody)
|
|
272
|
+
errors.push(...checkEmptyBody(input));
|
|
273
|
+
errors.push(...checkBakedAstroErrorTemplate(input));
|
|
274
|
+
errors.push(...checkMalformedDataImageMarkdown(input));
|
|
275
|
+
errors.push(...checkDataUriArtifact(input));
|
|
276
|
+
errors.push(...checkEscapedRawHtml(input));
|
|
277
|
+
errors.push(...checkHtmlEntityInHeading(input));
|
|
278
|
+
errors.push(...checkBackslashOverEscape(input));
|
|
279
|
+
// Phase 2.
|
|
280
|
+
errors.push(...checkBrokenFootnoteLabel(input));
|
|
281
|
+
errors.push(...checkUnresolvedFootnoteAnchor(input));
|
|
282
|
+
errors.push(...checkWordGdocsPasteArtifacts(input));
|
|
283
|
+
errors.push(...checkHtmlCommentLeak(input));
|
|
284
|
+
errors.push(...checkRawBlockHtml(input));
|
|
285
|
+
errors.push(...checkDoubleEncodedEntities(input));
|
|
286
|
+
errors.push(...checkInvisibleControlChars(input));
|
|
287
|
+
errors.push(...checkBareUrlNotAutolinked(input));
|
|
288
|
+
errors.push(...checkEmptyAltText(input));
|
|
289
|
+
errors.push(...checkIframeMissingDimsAndWrapper(input));
|
|
290
|
+
errors.push(...checkHeadingHierarchySkip(input));
|
|
291
|
+
errors.push(...checkPaywallMarkerLeak(input));
|
|
292
|
+
// Heuristic.
|
|
293
|
+
errors.push(...checkUnbalancedMarkdownEmphasis(input));
|
|
294
|
+
errors.push(...checkSingleSentenceParagraphsPattern(input, opts));
|
|
295
|
+
return errors.length === 0 ? { ok: true } : { ok: false, errors };
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Filter a list of errors down to those with `block` severity. Callers
|
|
299
|
+
* use this to decide between 422 (block) and 200 + warnings (warn-only).
|
|
300
|
+
*/
|
|
301
|
+
export function blockErrors(errors) {
|
|
302
|
+
return errors.filter((e) => SEVERITY[e.code] === 'block');
|
|
303
|
+
}
|
|
304
|
+
export function warnErrors(errors) {
|
|
305
|
+
return errors.filter((e) => SEVERITY[e.code] === 'warn');
|
|
306
|
+
}
|
|
307
|
+
export function formatValidationErrors(errors) {
|
|
308
|
+
if (errors.length === 0)
|
|
309
|
+
return 'ok';
|
|
310
|
+
return errors.map((e) => `[${e.code}] ${e.message}`).join('\n');
|
|
311
|
+
}
|
|
312
|
+
export { DEFAULT_OPTIONS, SEVERITY };
|
|
313
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/validator/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared markdown-aware scanning helpers used by checks that need to
|
|
3
|
+
* skip fenced code, inline code, HTML attributes, and existing links.
|
|
4
|
+
*
|
|
5
|
+
* Ported verbatim from fulcrum-labs/fronts
|
|
6
|
+
* src/lib/article-body-validator/scan.ts (inventory §1: extract).
|
|
7
|
+
*
|
|
8
|
+
* The validator runs on PRE-strip source, so these helpers must match
|
|
9
|
+
* the textual reality of stored markdown — not the cleaned form that
|
|
10
|
+
* ships to the renderer. Each helper is pure and operates over the raw
|
|
11
|
+
* `body_markdown`. We intentionally avoid pulling in a full CommonMark
|
|
12
|
+
* AST library: the checks are conservative regex-based scans that
|
|
13
|
+
* classify each character span as "inside a protected region"
|
|
14
|
+
* (code/link/attr) vs "scannable prose".
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Mark which character offsets in the source are inside fenced code
|
|
18
|
+
* blocks (` ```...``` `), inline code spans (`` `…` ``), markdown link
|
|
19
|
+
* targets `[…](url)`, autolinks `<…>` , and HTML attribute values
|
|
20
|
+
* (`src="…"`). Each offset is `true` if the character is protected.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildProtectedMask(source: string): boolean[];
|
|
23
|
+
/**
|
|
24
|
+
* Returns true if any character in the [start, end) range is inside a
|
|
25
|
+
* protected region.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isProtectedSpan(mask: boolean[], start: number, end: number): boolean;
|
|
28
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CA+D5D;AAQD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAKpF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared markdown-aware scanning helpers used by checks that need to
|
|
3
|
+
* skip fenced code, inline code, HTML attributes, and existing links.
|
|
4
|
+
*
|
|
5
|
+
* Ported verbatim from fulcrum-labs/fronts
|
|
6
|
+
* src/lib/article-body-validator/scan.ts (inventory §1: extract).
|
|
7
|
+
*
|
|
8
|
+
* The validator runs on PRE-strip source, so these helpers must match
|
|
9
|
+
* the textual reality of stored markdown — not the cleaned form that
|
|
10
|
+
* ships to the renderer. Each helper is pure and operates over the raw
|
|
11
|
+
* `body_markdown`. We intentionally avoid pulling in a full CommonMark
|
|
12
|
+
* AST library: the checks are conservative regex-based scans that
|
|
13
|
+
* classify each character span as "inside a protected region"
|
|
14
|
+
* (code/link/attr) vs "scannable prose".
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Mark which character offsets in the source are inside fenced code
|
|
18
|
+
* blocks (` ```...``` `), inline code spans (`` `…` ``), markdown link
|
|
19
|
+
* targets `[…](url)`, autolinks `<…>` , and HTML attribute values
|
|
20
|
+
* (`src="…"`). Each offset is `true` if the character is protected.
|
|
21
|
+
*/
|
|
22
|
+
export function buildProtectedMask(source) {
|
|
23
|
+
const len = source.length;
|
|
24
|
+
const mask = new Array(len).fill(false);
|
|
25
|
+
// 1) Fenced code blocks. Match either ``` or ~~~ fences; cover both
|
|
26
|
+
// the fence lines and the body between them.
|
|
27
|
+
const fenceRe = /(^|\n)([ \t]*)(`{3,}|~{3,})[^\n]*\n([\s\S]*?)\n\2\3/g;
|
|
28
|
+
for (const match of source.matchAll(fenceRe)) {
|
|
29
|
+
const start = match.index ?? 0;
|
|
30
|
+
const end = start + match[0].length;
|
|
31
|
+
fill(mask, start, end);
|
|
32
|
+
}
|
|
33
|
+
// 2) Inline code spans. We deliberately accept single-backtick spans
|
|
34
|
+
// only — multi-backtick spans are rare and the cost of missing
|
|
35
|
+
// them is one extra warning on an unusual page, not a render bug.
|
|
36
|
+
const inlineCodeRe = /`[^`\n]+`/g;
|
|
37
|
+
for (const match of source.matchAll(inlineCodeRe)) {
|
|
38
|
+
const start = match.index ?? 0;
|
|
39
|
+
const end = start + match[0].length;
|
|
40
|
+
// Skip if we're already inside a protected (fenced) region.
|
|
41
|
+
if (mask[start])
|
|
42
|
+
continue;
|
|
43
|
+
fill(mask, start, end);
|
|
44
|
+
}
|
|
45
|
+
// 3) Markdown links — the URL portion of `[label](url)` and the
|
|
46
|
+
// label of reference links `[label][id]` plus the ref target
|
|
47
|
+
// `[id]: url`. We protect the URL only so e.g. label text still
|
|
48
|
+
// scans for normal lint codes.
|
|
49
|
+
const linkUrlRe = /\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g;
|
|
50
|
+
for (const match of source.matchAll(linkUrlRe)) {
|
|
51
|
+
const start = (match.index ?? 0) + 2; // skip past `](`
|
|
52
|
+
const end = start + (match[1]?.length ?? 0);
|
|
53
|
+
fill(mask, start, end);
|
|
54
|
+
}
|
|
55
|
+
const refDefRe = /^\s*\[[^\]]+\]:\s*\S+/gm;
|
|
56
|
+
for (const match of source.matchAll(refDefRe)) {
|
|
57
|
+
const start = match.index ?? 0;
|
|
58
|
+
const end = start + match[0].length;
|
|
59
|
+
fill(mask, start, end);
|
|
60
|
+
}
|
|
61
|
+
// 4) Autolinks <https://…>.
|
|
62
|
+
const autolinkRe = /<https?:\/\/[^>\s]+>/g;
|
|
63
|
+
for (const match of source.matchAll(autolinkRe)) {
|
|
64
|
+
const start = match.index ?? 0;
|
|
65
|
+
const end = start + match[0].length;
|
|
66
|
+
fill(mask, start, end);
|
|
67
|
+
}
|
|
68
|
+
// 5) HTML attribute values (single or double quoted). This catches
|
|
69
|
+
// src="https://…", href="…", style attributes, etc. We do this
|
|
70
|
+
// after fenced/inline code so we don't reprotect those regions.
|
|
71
|
+
const attrRe = /\s[a-zA-Z][\w-]*\s*=\s*("[^"]*"|'[^']*')/g;
|
|
72
|
+
for (const match of source.matchAll(attrRe)) {
|
|
73
|
+
const valueStart = (match.index ?? 0) + match[0].indexOf(match[1] ?? '');
|
|
74
|
+
if (valueStart < 0)
|
|
75
|
+
continue;
|
|
76
|
+
const end = valueStart + (match[1]?.length ?? 0);
|
|
77
|
+
fill(mask, valueStart, end);
|
|
78
|
+
}
|
|
79
|
+
return mask;
|
|
80
|
+
}
|
|
81
|
+
function fill(mask, start, end) {
|
|
82
|
+
for (let i = start; i < end && i < mask.length; i += 1) {
|
|
83
|
+
mask[i] = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Returns true if any character in the [start, end) range is inside a
|
|
88
|
+
* protected region.
|
|
89
|
+
*/
|
|
90
|
+
export function isProtectedSpan(mask, start, end) {
|
|
91
|
+
for (let i = start; i < end && i < mask.length; i += 1) {
|
|
92
|
+
if (mask[i])
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/engine/validator/scan.ts"],"names":[],"mappings":"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"}
|