mentionwell 1.2.0 → 1.4.1

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 CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  } from 'mentionwell/api'
20
20
 
21
21
  const config = {
22
- apiUrl: process.env.MENTIONWELL_API_BASE!,
22
+ apiUrl: process.env.MENTIONWELL_API_URL!,
23
23
  apiKey: process.env.MENTIONWELL_API_KEY!,
24
24
  siteSlug: process.env.MENTIONWELL_SITE_SLUG!
25
25
  }
@@ -35,7 +35,8 @@ import 'mentionwell/styles'
35
35
  import {
36
36
  prepareArticleHtml,
37
37
  extractTocHtml,
38
- stripTocFromArticle
38
+ stripTocFromArticle,
39
+ stripPlatformChrome
39
40
  } from 'mentionwell/html-utils'
40
41
  import { fetchBlogPost } from '@/lib/blogoto-blog'
41
42
 
@@ -119,25 +120,23 @@ Returns one published post from the hosted API, or `null`.
119
120
 
120
121
  Returns every published slug from the hosted API. Useful for sitemaps.
121
122
 
122
- ### `getBlogPosts(config, page?, perPage?)`
123
+ ### `getBlogPostSummariesViaApi(config)`
123
124
 
124
- Legacy Supabase-direct reader. Prefer the API reader above unless you intentionally want the destination site to hold Supabase credentials.
125
+ Returns slug + updated/published timestamps for published posts returned by the hosted API. Useful for sitemap last-modified.
125
126
 
126
- ### `getBlogPost(config, slug)`
127
-
128
- Returns one published post, or `null`.
129
-
130
- ### `getAllBlogSlugs(config)`
127
+ ### `prepareArticleHtml(html)`
131
128
 
132
- Returns every published slug. Useful for sitemaps.
129
+ Strips duplicate chrome blocks (`<header class="wb-header">`, `<figure class="wb-hero">`) and any leaked `[CTA]` placeholder tokens from the article HTML before injection.
133
130
 
134
- ### `getBlogPostSummaries(config)`
131
+ Pass `{ stripPlatformChrome: true }` when your template renders its own TL;DR, TOC, FAQ, CTA, or author blocks from structured API fields:
135
132
 
136
- Returns slug + updated/published timestamps for every published post. Useful for sitemap last-modified.
133
+ ```ts
134
+ const html = prepareArticleHtml(post.html, { stripPlatformChrome: true })
135
+ ```
137
136
 
138
- ### `prepareArticleHtml(html)`
137
+ ### `stripPlatformChrome(html)`
139
138
 
140
- Strips duplicate chrome blocks (`<header class="wb-header">`, `<figure class="wb-hero">`) and any leaked `[CTA]` placeholder tokens from the article HTML before injection.
139
+ Removes the platform-rendered TL;DR, TOC, FAQ, CTA, author, header, and hero blocks while preserving body-only blocks such as callouts, tables, quotes, citations, steps, and embeds.
141
140
 
142
141
  ### `extractTocHtml(html)` / `stripTocFromArticle(html)`
143
142
 
@@ -13,7 +13,59 @@
13
13
  * surfaced in the Blogoto dashboard's integration page (deterministically
14
14
  * derived from siteId + READER_API_SECRET, prefix `bgo_read_`).
15
15
  */
16
- import type { ReaderPost } from "./index.js";
16
+ export interface ReaderAuthor {
17
+ id: string;
18
+ name: string;
19
+ title?: string;
20
+ bio?: string;
21
+ avatarUrl?: string;
22
+ url?: string;
23
+ twitter?: string;
24
+ linkedin?: string;
25
+ }
26
+ export interface ReaderFaq {
27
+ question: string;
28
+ answer: string;
29
+ }
30
+ export interface ReaderTocEntry {
31
+ title: string;
32
+ id: string;
33
+ level: 2 | 3;
34
+ }
35
+ export interface ReaderPost {
36
+ id: string;
37
+ slug: string;
38
+ title: string;
39
+ metaTitle?: string;
40
+ metaDescription?: string;
41
+ excerpt: string;
42
+ html: string;
43
+ markdown?: string;
44
+ featuredImage?: string;
45
+ readingTime?: number;
46
+ tags: string[];
47
+ category?: {
48
+ title: string;
49
+ slug: string;
50
+ } | null;
51
+ relatedPosts: Array<{
52
+ id: string;
53
+ title: string;
54
+ slug: string;
55
+ }>;
56
+ publishedAt?: string;
57
+ updatedAt?: string;
58
+ author?: ReaderAuthor;
59
+ tldr?: {
60
+ items: string[];
61
+ };
62
+ toc?: ReaderTocEntry[];
63
+ faqs?: ReaderFaq[];
64
+ schema?: {
65
+ jsonLd: string;
66
+ };
67
+ canonicalUrl?: string;
68
+ }
17
69
  export interface BlogotoApiConfig {
18
70
  /** Base URL of the Mentionwell instance, e.g. https://app.mentionwell.com */
19
71
  apiUrl: string;
@@ -27,10 +79,12 @@ export interface BlogotoApiConfig {
27
79
  /**
28
80
  * Fetches a paginated list of published posts for the configured site.
29
81
  *
30
- * Pagination is currently client-side: we fetch up to `perPage * page`
31
- * posts (capped server-side at 100 per request) and slice. This is fine
32
- * for typical destination sites (<100 posts); larger sites should add a
33
- * server-side `?page=` parameter to the API route and bump the package.
82
+ * Always fetches the full list (`?limit=100`, the API's own cap) on each
83
+ * call and slices locally. This trades a slightly larger response for
84
+ * correct `total`/`totalPages` numbers the previous behavior fetched
85
+ * only `perPage * page` rows and reported the slice size as `total`,
86
+ * which silently hid every page past the first. Sites with >100 posts
87
+ * need server-side `?page=` support; bump this package once that lands.
34
88
  */
35
89
  export declare function getBlogPostsViaApi(config: BlogotoApiConfig, page?: number, perPage?: number): Promise<{
36
90
  posts: ReaderPost[];
@@ -1 +1 @@
1
- {"version":3,"file":"api-reader.d.ts","sourceRoot":"","sources":["../src/api-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAmGD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,gBAAgB,EACxB,IAAI,SAAI,EACR,OAAO,SAAK,GACX,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBrE;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAa5B;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOvF;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAW5E"}
1
+ {"version":3,"file":"api-reader.d.ts","sourceRoot":"","sources":["../src/api-reader.ts"],"names":[],"mappings":"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"}
@@ -71,21 +71,22 @@ async function callApi(config, path, init) {
71
71
  /**
72
72
  * Fetches a paginated list of published posts for the configured site.
73
73
  *
74
- * Pagination is currently client-side: we fetch up to `perPage * page`
75
- * posts (capped server-side at 100 per request) and slice. This is fine
76
- * for typical destination sites (<100 posts); larger sites should add a
77
- * server-side `?page=` parameter to the API route and bump the package.
74
+ * Always fetches the full list (`?limit=100`, the API's own cap) on each
75
+ * call and slices locally. This trades a slightly larger response for
76
+ * correct `total`/`totalPages` numbers the previous behavior fetched
77
+ * only `perPage * page` rows and reported the slice size as `total`,
78
+ * which silently hid every page past the first. Sites with >100 posts
79
+ * need server-side `?page=` support; bump this package once that lands.
78
80
  */
79
81
  export async function getBlogPostsViaApi(config, page = 1, perPage = 12) {
80
- const limit = Math.min(100, perPage * page);
81
- const data = await callApi(config, `/api/public/${encodeURIComponent(config.siteSlug)}/posts?limit=${limit}`);
82
+ const data = await callApi(config, `/api/public/${encodeURIComponent(config.siteSlug)}/posts?limit=100`);
82
83
  if (!data.ok || !data.posts) {
83
- throw new Error(`Blogoto API returned not-ok for ${config.siteSlug}: ${data.message ?? "unknown"}`);
84
+ throw new Error(`Mentionwell API returned not-ok for ${config.siteSlug}: ${data.message ?? "unknown"}`);
84
85
  }
85
86
  const all = data.posts.map(toReader);
87
+ const total = all.length;
86
88
  const from = (page - 1) * perPage;
87
89
  const slice = all.slice(from, from + perPage);
88
- const total = all.length;
89
90
  return {
90
91
  posts: slice,
91
92
  total,
@@ -1 +1 @@
1
- {"version":3,"file":"api-reader.js","sourceRoot":"","sources":["../src/api-reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-reader.js","sourceRoot":"","sources":["../src/api-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA8FH,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC7B,OAAO;QACL,sEAAsE;QACtE,6DAA6D;QAC7D,EAAE,EAAE,IAAI,CAAC,IAAI;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,SAAS;QAC9C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;QAC/B,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS;QAC1C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;QACtC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;QAC5B,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,SAAS;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;QACzD,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,SAAS;KAC7C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAwB,EACxB,IAAY,EACZ,IAAkB;IAElB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;IACxC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QACpC,GAAG,IAAI;QACP,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;YACxC,MAAM,EAAE,kBAAkB;YAC1B,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;SACzB;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;YAC7D,IAAI,IAAI,EAAE,OAAO;gBAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,YAAY,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;AACtC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAwB,EACxB,IAAI,GAAG,CAAC,EACR,OAAO,GAAG,EAAE;IAEZ,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,MAAM,EACN,eAAe,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CACrE,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC;IAC9C,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,KAAK;QACL,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAwB,EACxB,IAAY;IAEZ,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,MAAM,EACN,eAAe,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,kBAAkB,CAAC,IAAI,CAAC,EAAE,CACvF,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,8EAA8E;QAC9E,IAAI,CAAC,YAAY,KAAK,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9E,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAwB;IAClE,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,MAAM,EACN,eAAe,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CACrE,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAwB;IAExB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,MAAM,EACN,eAAe,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CACrE,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,SAAS;QACnC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;KACxC,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -19,6 +19,17 @@ export declare function stripDuplicateChrome(html: string): string;
19
19
  export declare function stripLegacyCtaLeaks(html: string): string;
20
20
  export declare function extractTocHtml(html: string): string | null;
21
21
  export declare function stripTocFromArticle(html: string): string;
22
+ export declare function stripPlatformChrome(html: string): string;
23
+ export interface PrepareArticleHtmlOptions {
24
+ /**
25
+ * Use when the destination template renders TL;DR, TOC, FAQ, CTA, or
26
+ * author blocks from structured API fields. Body-only platform blocks
27
+ * such as callouts, tables, quotes, steps, citations, and embeds remain.
28
+ */
29
+ stripPlatformChrome?: boolean;
30
+ /** Move the inline platform TOC into a separate sidebar with extractTocHtml. */
31
+ stripToc?: boolean;
32
+ }
22
33
  /** Convenience: apply all the safe transforms in one call. */
23
- export declare function prepareArticleHtml(html: string): string;
34
+ export declare function prepareArticleHtml(html: string, options?: PrepareArticleHtmlOptions): string;
24
35
  //# sourceMappingURL=html-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-utils.d.ts","sourceRoot":"","sources":["../src/html-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
1
+ {"version":3,"file":"html-utils.d.ts","sourceRoot":"","sources":["../src/html-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,yBAA8B,GAAG,MAAM,CAKhG"}
@@ -34,8 +34,21 @@ export function extractTocHtml(html) {
34
34
  export function stripTocFromArticle(html) {
35
35
  return html.replace(/<nav class="wb-toc"[\s\S]*?<\/nav>/, "");
36
36
  }
37
+ export function stripPlatformChrome(html) {
38
+ return stripDuplicateChrome(html)
39
+ .replace(/<aside\b[^>]*class="[^"]*\bwb-tldr\b[^"]*"[^>]*>[\s\S]*?<\/aside>/gi, "")
40
+ .replace(/<section\b[^>]*class="[^"]*\bwb-faq\b[^"]*"[^>]*>[\s\S]*?<\/section>/gi, "")
41
+ .replace(/<aside\b[^>]*class="[^"]*\bwb-(?:cta|footer-cta)\b[^"]*"[^>]*>[\s\S]*?<\/aside>/gi, "")
42
+ .replace(/<aside\b[^>]*class="[^"]*\bwb-author\b[^"]*"[^>]*>[\s\S]*?<\/aside>/gi, "")
43
+ .replace(/<nav\b[^>]*class="[^"]*\bwb-toc\b[^"]*"[^>]*>[\s\S]*?<\/nav>/gi, "");
44
+ }
37
45
  /** Convenience: apply all the safe transforms in one call. */
38
- export function prepareArticleHtml(html) {
39
- return stripLegacyCtaLeaks(stripDuplicateChrome(html));
46
+ export function prepareArticleHtml(html, options = {}) {
47
+ let next = stripLegacyCtaLeaks(stripDuplicateChrome(html));
48
+ if (options.stripPlatformChrome)
49
+ next = stripPlatformChrome(next);
50
+ if (options.stripToc)
51
+ next = stripTocFromArticle(next);
52
+ return next;
40
53
  }
41
54
  //# sourceMappingURL=html-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-utils.js","sourceRoot":"","sources":["../src/html-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI;SACR,OAAO,CAAC,8CAA8C,EAAE,EAAE,CAAC;SAC3D,OAAO,CAAC,4CAA4C,EAAE,EAAE,CAAC;SACzD,OAAO,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI;SACR,OAAO,CAAC,yDAAyD,EAAE,EAAE,CAAC;SACtE,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC;SAC/C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"html-utils.js","sourceRoot":"","sources":["../src/html-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI;SACR,OAAO,CAAC,8CAA8C,EAAE,EAAE,CAAC;SAC3D,OAAO,CAAC,4CAA4C,EAAE,EAAE,CAAC;SACzD,OAAO,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI;SACR,OAAO,CAAC,yDAAyD,EAAE,EAAE,CAAC;SACtE,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC;SAC/C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,oBAAoB,CAAC,IAAI,CAAC;SAC9B,OAAO,CAAC,qEAAqE,EAAE,EAAE,CAAC;SAClF,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC;SACrF,OAAO,CAAC,mFAAmF,EAAE,EAAE,CAAC;SAChG,OAAO,CAAC,uEAAuE,EAAE,EAAE,CAAC;SACpF,OAAO,CAAC,gEAAgE,EAAE,EAAE,CAAC,CAAC;AACnF,CAAC;AAaD,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAqC,EAAE;IACtF,IAAI,IAAI,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,mBAAmB;QAAE,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,QAAQ;QAAE,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -766,17 +766,19 @@
766
766
  .wb-breadcrumbs [aria-current="page"] { color: #1A1916; font-weight: 500; }
767
767
 
768
768
  .wb-sticky-toc {
769
- position: sticky; top: 6rem; align-self: start;
769
+ position: sticky; top: var(--wb-sticky-top, 6rem); align-self: start;
770
770
  max-height: calc(100vh - 8rem); overflow-y: auto;
771
771
  padding-right: 0.5rem;
772
+ z-index: 1;
772
773
  }
773
774
  @media (max-width: 1023px) { .wb-sticky-toc { display: none; } }
774
775
 
775
776
  .wb-sticky-cta {
776
- position: sticky; top: 6rem; align-self: start;
777
+ position: sticky; top: var(--wb-sticky-top, 6rem); align-self: start;
777
778
  background: #232820; color: #FAF7F2;
778
779
  border-radius: 12px; padding: 1.25rem 1.35rem;
779
780
  font-family: var(--wb-font-body);
781
+ z-index: 1;
780
782
  }
781
783
  .wb-sticky-cta-eyebrow {
782
784
  display: block; font-size: 0.7rem; font-weight: 600;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mentionwell",
3
- "version": "1.2.0",
3
+ "version": "1.4.1",
4
4
  "description": "Destination-side API reader + styles for Mentionwell-generated blog posts.",
5
5
  "license": "MIT",
6
6
  "author": "Isaac Horowitz <horowitzisaac@gmail.com>",
@@ -18,13 +18,13 @@
18
18
  "mentionwell"
19
19
  ],
20
20
  "type": "module",
21
- "main": "./dist/index.js",
22
- "module": "./dist/index.js",
23
- "types": "./dist/index.d.ts",
21
+ "main": "./dist/api-reader.js",
22
+ "module": "./dist/api-reader.js",
23
+ "types": "./dist/api-reader.d.ts",
24
24
  "exports": {
25
25
  ".": {
26
- "types": "./dist/index.d.ts",
27
- "import": "./dist/index.js"
26
+ "types": "./dist/api-reader.d.ts",
27
+ "import": "./dist/api-reader.js"
28
28
  },
29
29
  "./html-utils": {
30
30
  "types": "./dist/html-utils.d.ts",
@@ -48,9 +48,6 @@
48
48
  "publishConfig": {
49
49
  "access": "public"
50
50
  },
51
- "dependencies": {
52
- "@supabase/supabase-js": "^2.49.8"
53
- },
54
51
  "devDependencies": {
55
52
  "typescript": "^5.5.0"
56
53
  }
package/dist/index.d.ts DELETED
@@ -1,72 +0,0 @@
1
- export interface BlogReaderConfig {
2
- supabaseUrl: string;
3
- supabaseAnonKey: string;
4
- siteSlug: string;
5
- table?: string;
6
- }
7
- export interface ReaderAuthor {
8
- id: string;
9
- name: string;
10
- title?: string;
11
- bio?: string;
12
- avatarUrl?: string;
13
- url?: string;
14
- twitter?: string;
15
- linkedin?: string;
16
- }
17
- export interface ReaderFaq {
18
- question: string;
19
- answer: string;
20
- }
21
- export interface ReaderTocEntry {
22
- title: string;
23
- id: string;
24
- level: 2 | 3;
25
- }
26
- export interface ReaderPost {
27
- id: string;
28
- slug: string;
29
- title: string;
30
- metaTitle?: string;
31
- metaDescription?: string;
32
- excerpt: string;
33
- html: string;
34
- markdown?: string;
35
- featuredImage?: string;
36
- readingTime?: number;
37
- tags: string[];
38
- category?: {
39
- title: string;
40
- slug: string;
41
- } | null;
42
- relatedPosts: Array<{
43
- id: string;
44
- title: string;
45
- slug: string;
46
- }>;
47
- publishedAt?: string;
48
- updatedAt?: string;
49
- author?: ReaderAuthor;
50
- tldr?: {
51
- items: string[];
52
- };
53
- toc?: ReaderTocEntry[];
54
- faqs?: ReaderFaq[];
55
- schema?: {
56
- jsonLd: string;
57
- };
58
- canonicalUrl?: string;
59
- }
60
- export declare function getBlogPosts(config: BlogReaderConfig, page?: number, perPage?: number): Promise<{
61
- posts: ReaderPost[];
62
- total: number;
63
- totalPages: number;
64
- }>;
65
- export declare function getBlogPost(config: BlogReaderConfig, slug: string): Promise<ReaderPost | null>;
66
- export declare function getAllBlogSlugs(config: BlogReaderConfig): Promise<string[]>;
67
- export declare function getBlogPostSummaries(config: BlogReaderConfig): Promise<Array<{
68
- slug: string;
69
- updatedAt?: string;
70
- publishedAt?: string;
71
- }>>;
72
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClD,YAAY,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,cAAc,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmCD,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,IAAI,SAAI,EACR,OAAO,SAAK,GACX,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBrE;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAiB5B;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAejF;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAsB5E"}
package/dist/index.js DELETED
@@ -1,104 +0,0 @@
1
- import { createClient } from "@supabase/supabase-js";
2
- function getClient(config) {
3
- return createClient(config.supabaseUrl, config.supabaseAnonKey);
4
- }
5
- const SELECT_COLUMNS = "id, slug, title, meta_title, meta_description, excerpt, html, markdown, featured_image, reading_time, tags, category, related_posts, published_at, updated_at, author, tldr, toc, faqs, schema, canonical_url";
6
- function toReaderPost(row) {
7
- return {
8
- id: String(row.id),
9
- slug: String(row.slug),
10
- title: String(row.title),
11
- metaTitle: (row.meta_title ?? row.metaTitle),
12
- metaDescription: (row.meta_description ?? row.metaDescription),
13
- excerpt: String(row.excerpt ?? ""),
14
- html: String(row.html ?? ""),
15
- markdown: (row.markdown ?? ""),
16
- featuredImage: (row.featured_image ?? row.featuredImage),
17
- readingTime: (row.reading_time ?? row.readingTime),
18
- tags: row.tags ?? [],
19
- category: row.category ?? null,
20
- relatedPosts: (row.related_posts ?? row.relatedPosts) ?? [],
21
- publishedAt: (row.published_at ?? row.publishedAt),
22
- updatedAt: (row.updated_at ?? row.updatedAt),
23
- author: row.author ?? undefined,
24
- tldr: row.tldr ?? undefined,
25
- toc: row.toc ?? undefined,
26
- faqs: row.faqs ?? undefined,
27
- schema: row.schema ?? undefined,
28
- canonicalUrl: (row.canonical_url ?? row.canonicalUrl)
29
- };
30
- }
31
- export async function getBlogPosts(config, page = 1, perPage = 12) {
32
- const client = getClient(config);
33
- const from = (page - 1) * perPage;
34
- const to = from + perPage - 1;
35
- const table = config.table ?? "blog_posts";
36
- const { data, count, error } = await client
37
- .from(table)
38
- .select(SELECT_COLUMNS, { count: "exact" })
39
- .eq("published", true)
40
- .eq("site_slug", config.siteSlug)
41
- .order("published_at", { ascending: false })
42
- .range(from, to);
43
- if (error) {
44
- throw new Error(`Failed to fetch posts for ${config.siteSlug}: ${error.message}`);
45
- }
46
- return {
47
- posts: (data ?? []).map(toReaderPost),
48
- total: count ?? 0,
49
- totalPages: Math.max(1, Math.ceil((count ?? 0) / perPage))
50
- };
51
- }
52
- export async function getBlogPost(config, slug) {
53
- const client = getClient(config);
54
- const table = config.table ?? "blog_posts";
55
- const { data, error } = await client
56
- .from(table)
57
- .select(SELECT_COLUMNS)
58
- .eq("published", true)
59
- .eq("site_slug", config.siteSlug)
60
- .eq("slug", slug)
61
- .maybeSingle();
62
- if (error) {
63
- throw new Error(`Failed to fetch slug ${slug}: ${error.message}`);
64
- }
65
- if (!data)
66
- return null;
67
- return toReaderPost(data);
68
- }
69
- export async function getAllBlogSlugs(config) {
70
- const client = getClient(config);
71
- const table = config.table ?? "blog_posts";
72
- const { data, error } = await client
73
- .from(table)
74
- .select("slug, updated_at, published_at")
75
- .eq("published", true)
76
- .eq("site_slug", config.siteSlug)
77
- .order("published_at", { ascending: false });
78
- if (error) {
79
- throw new Error(`Failed to fetch slugs for ${config.siteSlug}: ${error.message}`);
80
- }
81
- return (data ?? []).map((row) => String(row.slug));
82
- }
83
- export async function getBlogPostSummaries(config) {
84
- const client = getClient(config);
85
- const table = config.table ?? "blog_posts";
86
- const { data, error } = await client
87
- .from(table)
88
- .select("slug, updated_at, published_at")
89
- .eq("published", true)
90
- .eq("site_slug", config.siteSlug)
91
- .order("published_at", { ascending: false });
92
- if (error) {
93
- throw new Error(`Failed to fetch summaries for ${config.siteSlug}: ${error.message}`);
94
- }
95
- return (data ?? []).map((row) => {
96
- const record = row;
97
- return {
98
- slug: String(record.slug),
99
- updatedAt: (record.updated_at ?? undefined),
100
- publishedAt: (record.published_at ?? undefined)
101
- };
102
- });
103
- }
104
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}