@opinly/next 0.1.13 → 0.1.15

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.
Files changed (29) hide show
  1. package/dist/components/author-page/index.cjs +1 -0
  2. package/dist/components/author-page/index.cjs.map +1 -1
  3. package/dist/components/author-page/index.js +1 -0
  4. package/dist/components/author-page/index.js.map +1 -1
  5. package/dist/components/blog-post/_components/content.cjs +1 -0
  6. package/dist/components/blog-post/_components/content.cjs.map +1 -1
  7. package/dist/components/blog-post/_components/content.js +1 -0
  8. package/dist/components/blog-post/_components/content.js.map +1 -1
  9. package/dist/components/blog-post/_components/table-of-contents.cjs +1 -0
  10. package/dist/components/blog-post/_components/table-of-contents.cjs.map +1 -1
  11. package/dist/components/blog-post/_components/table-of-contents.js +1 -0
  12. package/dist/components/blog-post/_components/table-of-contents.js.map +1 -1
  13. package/dist/components/post-preview.cjs +1 -0
  14. package/dist/components/post-preview.cjs.map +1 -1
  15. package/dist/components/post-preview.js +1 -0
  16. package/dist/components/post-preview.js.map +1 -1
  17. package/dist/utils/generate-metadata.cjs +10 -8
  18. package/dist/utils/generate-metadata.cjs.map +1 -1
  19. package/dist/utils/generate-metadata.d.cts +5 -3
  20. package/dist/utils/generate-metadata.d.ts +5 -3
  21. package/dist/utils/generate-metadata.js +9 -7
  22. package/dist/utils/generate-metadata.js.map +1 -1
  23. package/dist/utils/sdk-config.cjs +4 -2
  24. package/dist/utils/sdk-config.cjs.map +1 -1
  25. package/dist/utils/sdk-config.d.cts +1 -0
  26. package/dist/utils/sdk-config.d.ts +1 -0
  27. package/dist/utils/sdk-config.js +4 -2
  28. package/dist/utils/sdk-config.js.map +1 -1
  29. package/package.json +2 -2
@@ -55,6 +55,7 @@ const AuthorPage = ({
55
55
  author.image.fileKey && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
56
56
  import_image.default,
57
57
  {
58
+ unoptimized: import_sdk_config.opinlyConfig.unoptimizedImages,
58
59
  src: `${import_sdk_config.opinlyConfig.imagesPrefix}/${author.image.fileKey}`,
59
60
  alt: author.image.alt || author.name,
60
61
  width: 150,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/author-page/index.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\n\nexport const AuthorPage = ({\n author,\n}: {\n author: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"author\" }\n >[\"data\"];\n}) => {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: \"Authors\",\n url: `${opinlyConfig.blogPrefix}/authors`,\n },\n ]}\n />\n {/* Author Header */}\n <div className=\"flex items-center gap-6 mb-10\">\n {author.image.fileKey && (\n <Image\n src={`${opinlyConfig.imagesPrefix}/${author.image.fileKey}`}\n alt={author.image.alt || author.name}\n width={150}\n height={150}\n className=\"rounded-full border\"\n />\n )}\n <div>\n <h1 className=\"text-3xl font-bold mb-1\">{author.name}</h1>\n {author.bio && (\n <p className=\"text-muted-foreground text-base max-w-2xl\">\n {author.bio}\n </p>\n )}\n </div>\n </div>\n\n {/* Posts Grid */}\n <h2 className=\"text-xl font-semibold mb-6\">Posts by {author.name}</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n {author.posts && author.posts.length > 0 ? (\n author.posts.map(\n (post) => post && <PostPreview key={post.slug} post={post} />\n )\n ) : (\n <div className=\"text-muted-foreground col-span-full\">\n No posts yet.\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBM;AAfN,mBAAkB;AAClB,wBAA6B;AAC7B,0BAA4B;AAC5B,0BAA4B;AAErB,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,SACE,6CAAC,SAAI,WAAU,gCACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,UACX;AAAA,YACE,MAAM;AAAA,YACN,KAAK,GAAG,+BAAa,UAAU;AAAA,UACjC;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,6CAAC,SAAI,WAAU,iCACZ;AAAA,aAAO,MAAM,WACZ;AAAA,QAAC,aAAAA;AAAA,QAAA;AAAA,UACC,KAAK,GAAG,+BAAa,YAAY,IAAI,OAAO,MAAM,OAAO;AAAA,UACzD,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,UAChC,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,6CAAC,SACC;AAAA,oDAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,QACpD,OAAO,OACN,4CAAC,OAAE,WAAU,6CACV,iBAAO,KACV;AAAA,SAEJ;AAAA,OACF;AAAA,IAGA,6CAAC,QAAG,WAAU,8BAA6B;AAAA;AAAA,MAAU,OAAO;AAAA,OAAK;AAAA,IACjE,4CAAC,SAAI,WAAU,wDACZ,iBAAO,SAAS,OAAO,MAAM,SAAS,IACrC,OAAO,MAAM;AAAA,MACX,CAAC,SAAS,QAAQ,4CAAC,mCAA4B,QAAX,KAAK,IAAkB;AAAA,IAC7D,IAEA,4CAAC,SAAI,WAAU,uCAAsC,2BAErD,GAEJ;AAAA,KACF;AAEJ;","names":["Image"]}
1
+ {"version":3,"sources":["../../../src/components/author-page/index.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\n\nexport const AuthorPage = ({\n author,\n}: {\n author: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"author\" }\n >[\"data\"];\n}) => {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: \"Authors\",\n url: `${opinlyConfig.blogPrefix}/authors`,\n },\n ]}\n />\n {/* Author Header */}\n <div className=\"flex items-center gap-6 mb-10\">\n {author.image.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.image.fileKey}`}\n alt={author.image.alt || author.name}\n width={150}\n height={150}\n className=\"rounded-full border\"\n />\n )}\n <div>\n <h1 className=\"text-3xl font-bold mb-1\">{author.name}</h1>\n {author.bio && (\n <p className=\"text-muted-foreground text-base max-w-2xl\">\n {author.bio}\n </p>\n )}\n </div>\n </div>\n\n {/* Posts Grid */}\n <h2 className=\"text-xl font-semibold mb-6\">Posts by {author.name}</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n {author.posts && author.posts.length > 0 ? (\n author.posts.map(\n (post) => post && <PostPreview key={post.slug} post={post} />\n )\n ) : (\n <div className=\"text-muted-foreground col-span-full\">\n No posts yet.\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBM;AAfN,mBAAkB;AAClB,wBAA6B;AAC7B,0BAA4B;AAC5B,0BAA4B;AAErB,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,SACE,6CAAC,SAAI,WAAU,gCACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,UACX;AAAA,YACE,MAAM;AAAA,YACN,KAAK,GAAG,+BAAa,UAAU;AAAA,UACjC;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,6CAAC,SAAI,WAAU,iCACZ;AAAA,aAAO,MAAM,WACZ;AAAA,QAAC,aAAAA;AAAA,QAAA;AAAA,UACC,aAAa,+BAAa;AAAA,UAC1B,KAAK,GAAG,+BAAa,YAAY,IAAI,OAAO,MAAM,OAAO;AAAA,UACzD,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,UAChC,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,6CAAC,SACC;AAAA,oDAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,QACpD,OAAO,OACN,4CAAC,OAAE,WAAU,6CACV,iBAAO,KACV;AAAA,SAEJ;AAAA,OACF;AAAA,IAGA,6CAAC,QAAG,WAAU,8BAA6B;AAAA;AAAA,MAAU,OAAO;AAAA,OAAK;AAAA,IACjE,4CAAC,SAAI,WAAU,wDACZ,iBAAO,SAAS,OAAO,MAAM,SAAS,IACrC,OAAO,MAAM;AAAA,MACX,CAAC,SAAS,QAAQ,4CAAC,mCAA4B,QAAX,KAAK,IAAkB;AAAA,IAC7D,IAEA,4CAAC,SAAI,WAAU,uCAAsC,2BAErD,GAEJ;AAAA,KACF;AAEJ;","names":["Image"]}
@@ -22,6 +22,7 @@ const AuthorPage = ({
22
22
  author.image.fileKey && /* @__PURE__ */ jsx(
23
23
  Image,
24
24
  {
25
+ unoptimized: opinlyConfig.unoptimizedImages,
25
26
  src: `${opinlyConfig.imagesPrefix}/${author.image.fileKey}`,
26
27
  alt: author.image.alt || author.name,
27
28
  width: 150,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/author-page/index.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\n\nexport const AuthorPage = ({\n author,\n}: {\n author: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"author\" }\n >[\"data\"];\n}) => {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: \"Authors\",\n url: `${opinlyConfig.blogPrefix}/authors`,\n },\n ]}\n />\n {/* Author Header */}\n <div className=\"flex items-center gap-6 mb-10\">\n {author.image.fileKey && (\n <Image\n src={`${opinlyConfig.imagesPrefix}/${author.image.fileKey}`}\n alt={author.image.alt || author.name}\n width={150}\n height={150}\n className=\"rounded-full border\"\n />\n )}\n <div>\n <h1 className=\"text-3xl font-bold mb-1\">{author.name}</h1>\n {author.bio && (\n <p className=\"text-muted-foreground text-base max-w-2xl\">\n {author.bio}\n </p>\n )}\n </div>\n </div>\n\n {/* Posts Grid */}\n <h2 className=\"text-xl font-semibold mb-6\">Posts by {author.name}</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n {author.posts && author.posts.length > 0 ? (\n author.posts.map(\n (post) => post && <PostPreview key={post.slug} post={post} />\n )\n ) : (\n <div className=\"text-muted-foreground col-span-full\">\n No posts yet.\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"AAgBM,cAmBE,YAnBF;AAfN,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAErB,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,SACE,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,UACX;AAAA,YACE,MAAM;AAAA,YACN,KAAK,GAAG,aAAa,UAAU;AAAA,UACjC;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,qBAAC,SAAI,WAAU,iCACZ;AAAA,aAAO,MAAM,WACZ;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,MAAM,OAAO;AAAA,UACzD,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,UAChC,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,QACpD,OAAO,OACN,oBAAC,OAAE,WAAU,6CACV,iBAAO,KACV;AAAA,SAEJ;AAAA,OACF;AAAA,IAGA,qBAAC,QAAG,WAAU,8BAA6B;AAAA;AAAA,MAAU,OAAO;AAAA,OAAK;AAAA,IACjE,oBAAC,SAAI,WAAU,wDACZ,iBAAO,SAAS,OAAO,MAAM,SAAS,IACrC,OAAO,MAAM;AAAA,MACX,CAAC,SAAS,QAAQ,oBAAC,eAA4B,QAAX,KAAK,IAAkB;AAAA,IAC7D,IAEA,oBAAC,SAAI,WAAU,uCAAsC,2BAErD,GAEJ;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/author-page/index.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\n\nexport const AuthorPage = ({\n author,\n}: {\n author: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"author\" }\n >[\"data\"];\n}) => {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: \"Authors\",\n url: `${opinlyConfig.blogPrefix}/authors`,\n },\n ]}\n />\n {/* Author Header */}\n <div className=\"flex items-center gap-6 mb-10\">\n {author.image.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.image.fileKey}`}\n alt={author.image.alt || author.name}\n width={150}\n height={150}\n className=\"rounded-full border\"\n />\n )}\n <div>\n <h1 className=\"text-3xl font-bold mb-1\">{author.name}</h1>\n {author.bio && (\n <p className=\"text-muted-foreground text-base max-w-2xl\">\n {author.bio}\n </p>\n )}\n </div>\n </div>\n\n {/* Posts Grid */}\n <h2 className=\"text-xl font-semibold mb-6\">Posts by {author.name}</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n {author.posts && author.posts.length > 0 ? (\n author.posts.map(\n (post) => post && <PostPreview key={post.slug} post={post} />\n )\n ) : (\n <div className=\"text-muted-foreground col-span-full\">\n No posts yet.\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"AAgBM,cAoBE,YApBF;AAfN,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAErB,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,SACE,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,UACX;AAAA,YACE,MAAM;AAAA,YACN,KAAK,GAAG,aAAa,UAAU;AAAA,UACjC;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,qBAAC,SAAI,WAAU,iCACZ;AAAA,aAAO,MAAM,WACZ;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,MAAM,OAAO;AAAA,UACzD,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,UAChC,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,QACpD,OAAO,OACN,oBAAC,OAAE,WAAU,6CACV,iBAAO,KACV;AAAA,SAEJ;AAAA,OACF;AAAA,IAGA,qBAAC,QAAG,WAAU,8BAA6B;AAAA;AAAA,MAAU,OAAO;AAAA,OAAK;AAAA,IACjE,oBAAC,SAAI,WAAU,wDACZ,iBAAO,SAAS,OAAO,MAAM,SAAS,IACrC,OAAO,MAAM;AAAA,MACX,CAAC,SAAS,QAAQ,oBAAC,eAA4B,QAAX,KAAK,IAAkB;AAAA,IAC7D,IAEA,oBAAC,SAAI,WAAU,uCAAsC,2BAErD,GAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -73,6 +73,7 @@ function renderTiptapContent(content, classNames) {
73
73
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
74
74
  import_image.default,
75
75
  {
76
+ unoptimized: import_sdk_config.opinlyConfig.unoptimizedImages,
76
77
  src: `${import_sdk_config.opinlyConfig.imagesPrefix}/${fileKey}`,
77
78
  title: node.attrs?.title || "",
78
79
  alt: node.attrs?.alt || "",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/blog-post/_components/content.tsx"],"sourcesContent":["import type { JSONContent } from \"@tiptap/core\";\nimport { BlogComponentClassNames } from \"../_types/class-names\";\nimport { cn } from \"../../../utils/merge\";\nimport Link from \"next/link\";\nimport { JSX } from \"react\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport React from \"react\";\n\nfunction renderTiptapContent(\n content: JSONContent,\n classNames: BlogComponentClassNames\n): React.ReactNode[] {\n if (!content?.content) return [];\n\n return content.content\n .map((node, index) => {\n switch (node.type) {\n case \"paragraph\":\n return (\n <p key={index} className={classNames.paragraph || \"mb-4\"}>\n {renderChildren(node.content, classNames)}\n </p>\n );\n case \"heading\": {\n const text = node.content?.[0]?.text ?? \"\";\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n const Tag = `h${\n node.attrs?.level || 1\n }` as keyof JSX.IntrinsicElements;\n return (\n <Tag\n key={index}\n id={slug}\n className={\n classNames.heading || \"mt-8 mb-4 font-bold text-gray-800\"\n }\n >\n {renderChildren(node.content, classNames)}\n </Tag>\n );\n }\n case \"image\":\n const fileKey = node.attrs?.fileKey;\n\n if (!fileKey) {\n return null;\n }\n\n return (\n <div\n key={index}\n className={cn(\n \"relative w-full max-w-[800px] my-6\",\n classNames.image\n )}\n style={{ aspectRatio: \"2 / 1\" }}\n >\n <Image\n src={`${opinlyConfig.imagesPrefix}/${fileKey}`}\n title={node.attrs?.title || \"\"}\n alt={node.attrs?.alt || \"\"}\n fill\n className=\"object-contain rounded-lg\"\n sizes=\"(max-width: 800px) 100vw, 800px\"\n />\n </div>\n );\n case \"bulletList\":\n return (\n <ul\n key={index}\n className={cn(\"list-disc pl-6 my-4\", classNames.bulletList)}\n >\n {renderTiptapContent(node, classNames)}\n </ul>\n );\n case \"orderedList\":\n return (\n <ol\n key={index}\n className={cn(\"list-decimal pl-6 my-4\", classNames.orderedList)}\n >\n {renderTiptapContent(node, classNames)}\n </ol>\n );\n case \"listItem\":\n if (\n node.content &&\n node.content.length === 1 &&\n node.content[0].type === \"paragraph\"\n ) {\n return (\n <li key={index} className={cn(\"my-1\", classNames.listItem)}>\n {renderChildren(node.content[0].content, classNames)}\n </li>\n );\n }\n return (\n <li key={index} className={cn(\"my-1\", classNames.listItem)}>\n {renderChildren(node.content, classNames)}\n </li>\n );\n default:\n return null;\n }\n })\n .filter(Boolean);\n}\n\nexport const Content = ({\n content,\n classNames,\n}: {\n content: JSONContent;\n classNames: BlogComponentClassNames;\n}) => {\n return (\n <div className=\"prose min-w-full\">\n {renderTiptapContent(content, classNames)}\n </div>\n );\n};\n\nfunction renderChildren(\n nodes: JSONContent[\"content\"] | undefined,\n classNames: BlogComponentClassNames\n): JSX.Element[] {\n if (!nodes) {\n console.log(\"no nodes\");\n return [];\n }\n\n return nodes\n .map((child, idx) => {\n if (child.type === \"text\") {\n let text: React.ReactNode = child.text;\n if (child.marks) {\n child.marks.forEach((mark) => {\n if (mark.type === \"bold\") text = <strong key={idx}>{text}</strong>;\n if (mark.type === \"italic\") text = <em key={idx}>{text}</em>;\n if (mark.type === \"link\")\n text = (\n <Link\n key={idx}\n href={mark.attrs?.href}\n className={classNames.link || \"text-blue-600 underline\"}\n >\n {text}\n </Link>\n );\n });\n }\n return <span key={idx}>{text}</span>;\n } else {\n console.log(\"child\", child);\n\n // Recursively render non-text nodes (e.g., paragraph, listItem, etc.)\n return (\n <React.Fragment key={idx}>\n {renderTiptapContent(\n { ...child, content: child.content },\n classNames\n )}\n </React.Fragment>\n );\n }\n })\n .filter(Boolean) as JSX.Element[];\n}\n"],"mappings":"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","names":["import_react","Image","Link","React"]}
1
+ {"version":3,"sources":["../../../../src/components/blog-post/_components/content.tsx"],"sourcesContent":["import type { JSONContent } from \"@tiptap/core\";\nimport { BlogComponentClassNames } from \"../_types/class-names\";\nimport { cn } from \"../../../utils/merge\";\nimport Link from \"next/link\";\nimport { JSX } from \"react\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport React from \"react\";\n\nfunction renderTiptapContent(\n content: JSONContent,\n classNames: BlogComponentClassNames\n): React.ReactNode[] {\n if (!content?.content) return [];\n\n return content.content\n .map((node, index) => {\n switch (node.type) {\n case \"paragraph\":\n return (\n <p key={index} className={classNames.paragraph || \"mb-4\"}>\n {renderChildren(node.content, classNames)}\n </p>\n );\n case \"heading\": {\n const text = node.content?.[0]?.text ?? \"\";\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n const Tag = `h${\n node.attrs?.level || 1\n }` as keyof JSX.IntrinsicElements;\n return (\n <Tag\n key={index}\n id={slug}\n className={\n classNames.heading || \"mt-8 mb-4 font-bold text-gray-800\"\n }\n >\n {renderChildren(node.content, classNames)}\n </Tag>\n );\n }\n case \"image\":\n const fileKey = node.attrs?.fileKey;\n\n if (!fileKey) {\n return null;\n }\n\n return (\n <div\n key={index}\n className={cn(\n \"relative w-full max-w-[800px] my-6\",\n classNames.image\n )}\n style={{ aspectRatio: \"2 / 1\" }}\n >\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${fileKey}`}\n title={node.attrs?.title || \"\"}\n alt={node.attrs?.alt || \"\"}\n fill\n className=\"object-contain rounded-lg\"\n sizes=\"(max-width: 800px) 100vw, 800px\"\n />\n </div>\n );\n case \"bulletList\":\n return (\n <ul\n key={index}\n className={cn(\"list-disc pl-6 my-4\", classNames.bulletList)}\n >\n {renderTiptapContent(node, classNames)}\n </ul>\n );\n case \"orderedList\":\n return (\n <ol\n key={index}\n className={cn(\"list-decimal pl-6 my-4\", classNames.orderedList)}\n >\n {renderTiptapContent(node, classNames)}\n </ol>\n );\n case \"listItem\":\n if (\n node.content &&\n node.content.length === 1 &&\n node.content[0].type === \"paragraph\"\n ) {\n return (\n <li key={index} className={cn(\"my-1\", classNames.listItem)}>\n {renderChildren(node.content[0].content, classNames)}\n </li>\n );\n }\n return (\n <li key={index} className={cn(\"my-1\", classNames.listItem)}>\n {renderChildren(node.content, classNames)}\n </li>\n );\n default:\n return null;\n }\n })\n .filter(Boolean);\n}\n\nexport const Content = ({\n content,\n classNames,\n}: {\n content: JSONContent;\n classNames: BlogComponentClassNames;\n}) => {\n return (\n <div className=\"prose min-w-full\">\n {renderTiptapContent(content, classNames)}\n </div>\n );\n};\n\nfunction renderChildren(\n nodes: JSONContent[\"content\"] | undefined,\n classNames: BlogComponentClassNames\n): JSX.Element[] {\n if (!nodes) {\n console.log(\"no nodes\");\n return [];\n }\n\n return nodes\n .map((child, idx) => {\n if (child.type === \"text\") {\n let text: React.ReactNode = child.text;\n if (child.marks) {\n child.marks.forEach((mark) => {\n if (mark.type === \"bold\") text = <strong key={idx}>{text}</strong>;\n if (mark.type === \"italic\") text = <em key={idx}>{text}</em>;\n if (mark.type === \"link\")\n text = (\n <Link\n key={idx}\n href={mark.attrs?.href}\n className={classNames.link || \"text-blue-600 underline\"}\n >\n {text}\n </Link>\n );\n });\n }\n return <span key={idx}>{text}</span>;\n } else {\n console.log(\"child\", child);\n\n // Recursively render non-text nodes (e.g., paragraph, listItem, etc.)\n return (\n <React.Fragment key={idx}>\n {renderTiptapContent(\n { ...child, content: child.content },\n classNames\n )}\n </React.Fragment>\n );\n }\n })\n .filter(Boolean) as JSX.Element[];\n}\n"],"mappings":"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","names":["import_react","Image","Link","React"]}
@@ -40,6 +40,7 @@ function renderTiptapContent(content, classNames) {
40
40
  children: /* @__PURE__ */ jsx(
41
41
  Image,
42
42
  {
43
+ unoptimized: opinlyConfig.unoptimizedImages,
43
44
  src: `${opinlyConfig.imagesPrefix}/${fileKey}`,
44
45
  title: node.attrs?.title || "",
45
46
  alt: node.attrs?.alt || "",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/blog-post/_components/content.tsx"],"sourcesContent":["import type { JSONContent } from \"@tiptap/core\";\nimport { BlogComponentClassNames } from \"../_types/class-names\";\nimport { cn } from \"../../../utils/merge\";\nimport Link from \"next/link\";\nimport { JSX } from \"react\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport React from \"react\";\n\nfunction renderTiptapContent(\n content: JSONContent,\n classNames: BlogComponentClassNames\n): React.ReactNode[] {\n if (!content?.content) return [];\n\n return content.content\n .map((node, index) => {\n switch (node.type) {\n case \"paragraph\":\n return (\n <p key={index} className={classNames.paragraph || \"mb-4\"}>\n {renderChildren(node.content, classNames)}\n </p>\n );\n case \"heading\": {\n const text = node.content?.[0]?.text ?? \"\";\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n const Tag = `h${\n node.attrs?.level || 1\n }` as keyof JSX.IntrinsicElements;\n return (\n <Tag\n key={index}\n id={slug}\n className={\n classNames.heading || \"mt-8 mb-4 font-bold text-gray-800\"\n }\n >\n {renderChildren(node.content, classNames)}\n </Tag>\n );\n }\n case \"image\":\n const fileKey = node.attrs?.fileKey;\n\n if (!fileKey) {\n return null;\n }\n\n return (\n <div\n key={index}\n className={cn(\n \"relative w-full max-w-[800px] my-6\",\n classNames.image\n )}\n style={{ aspectRatio: \"2 / 1\" }}\n >\n <Image\n src={`${opinlyConfig.imagesPrefix}/${fileKey}`}\n title={node.attrs?.title || \"\"}\n alt={node.attrs?.alt || \"\"}\n fill\n className=\"object-contain rounded-lg\"\n sizes=\"(max-width: 800px) 100vw, 800px\"\n />\n </div>\n );\n case \"bulletList\":\n return (\n <ul\n key={index}\n className={cn(\"list-disc pl-6 my-4\", classNames.bulletList)}\n >\n {renderTiptapContent(node, classNames)}\n </ul>\n );\n case \"orderedList\":\n return (\n <ol\n key={index}\n className={cn(\"list-decimal pl-6 my-4\", classNames.orderedList)}\n >\n {renderTiptapContent(node, classNames)}\n </ol>\n );\n case \"listItem\":\n if (\n node.content &&\n node.content.length === 1 &&\n node.content[0].type === \"paragraph\"\n ) {\n return (\n <li key={index} className={cn(\"my-1\", classNames.listItem)}>\n {renderChildren(node.content[0].content, classNames)}\n </li>\n );\n }\n return (\n <li key={index} className={cn(\"my-1\", classNames.listItem)}>\n {renderChildren(node.content, classNames)}\n </li>\n );\n default:\n return null;\n }\n })\n .filter(Boolean);\n}\n\nexport const Content = ({\n content,\n classNames,\n}: {\n content: JSONContent;\n classNames: BlogComponentClassNames;\n}) => {\n return (\n <div className=\"prose min-w-full\">\n {renderTiptapContent(content, classNames)}\n </div>\n );\n};\n\nfunction renderChildren(\n nodes: JSONContent[\"content\"] | undefined,\n classNames: BlogComponentClassNames\n): JSX.Element[] {\n if (!nodes) {\n console.log(\"no nodes\");\n return [];\n }\n\n return nodes\n .map((child, idx) => {\n if (child.type === \"text\") {\n let text: React.ReactNode = child.text;\n if (child.marks) {\n child.marks.forEach((mark) => {\n if (mark.type === \"bold\") text = <strong key={idx}>{text}</strong>;\n if (mark.type === \"italic\") text = <em key={idx}>{text}</em>;\n if (mark.type === \"link\")\n text = (\n <Link\n key={idx}\n href={mark.attrs?.href}\n className={classNames.link || \"text-blue-600 underline\"}\n >\n {text}\n </Link>\n );\n });\n }\n return <span key={idx}>{text}</span>;\n } else {\n console.log(\"child\", child);\n\n // Recursively render non-text nodes (e.g., paragraph, listItem, etc.)\n return (\n <React.Fragment key={idx}>\n {renderTiptapContent(\n { ...child, content: child.content },\n classNames\n )}\n </React.Fragment>\n );\n }\n })\n .filter(Boolean) as JSX.Element[];\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/blog-post/_components/content.tsx"],"sourcesContent":["import type { JSONContent } from \"@tiptap/core\";\nimport { BlogComponentClassNames } from \"../_types/class-names\";\nimport { cn } from \"../../../utils/merge\";\nimport Link from \"next/link\";\nimport { JSX } from \"react\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport React from \"react\";\n\nfunction renderTiptapContent(\n content: JSONContent,\n classNames: BlogComponentClassNames\n): React.ReactNode[] {\n if (!content?.content) return [];\n\n return content.content\n .map((node, index) => {\n switch (node.type) {\n case \"paragraph\":\n return (\n <p key={index} className={classNames.paragraph || \"mb-4\"}>\n {renderChildren(node.content, classNames)}\n </p>\n );\n case \"heading\": {\n const text = node.content?.[0]?.text ?? \"\";\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n const Tag = `h${\n node.attrs?.level || 1\n }` as keyof JSX.IntrinsicElements;\n return (\n <Tag\n key={index}\n id={slug}\n className={\n classNames.heading || \"mt-8 mb-4 font-bold text-gray-800\"\n }\n >\n {renderChildren(node.content, classNames)}\n </Tag>\n );\n }\n case \"image\":\n const fileKey = node.attrs?.fileKey;\n\n if (!fileKey) {\n return null;\n }\n\n return (\n <div\n key={index}\n className={cn(\n \"relative w-full max-w-[800px] my-6\",\n classNames.image\n )}\n style={{ aspectRatio: \"2 / 1\" }}\n >\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${fileKey}`}\n title={node.attrs?.title || \"\"}\n alt={node.attrs?.alt || \"\"}\n fill\n className=\"object-contain rounded-lg\"\n sizes=\"(max-width: 800px) 100vw, 800px\"\n />\n </div>\n );\n case \"bulletList\":\n return (\n <ul\n key={index}\n className={cn(\"list-disc pl-6 my-4\", classNames.bulletList)}\n >\n {renderTiptapContent(node, classNames)}\n </ul>\n );\n case \"orderedList\":\n return (\n <ol\n key={index}\n className={cn(\"list-decimal pl-6 my-4\", classNames.orderedList)}\n >\n {renderTiptapContent(node, classNames)}\n </ol>\n );\n case \"listItem\":\n if (\n node.content &&\n node.content.length === 1 &&\n node.content[0].type === \"paragraph\"\n ) {\n return (\n <li key={index} className={cn(\"my-1\", classNames.listItem)}>\n {renderChildren(node.content[0].content, classNames)}\n </li>\n );\n }\n return (\n <li key={index} className={cn(\"my-1\", classNames.listItem)}>\n {renderChildren(node.content, classNames)}\n </li>\n );\n default:\n return null;\n }\n })\n .filter(Boolean);\n}\n\nexport const Content = ({\n content,\n classNames,\n}: {\n content: JSONContent;\n classNames: BlogComponentClassNames;\n}) => {\n return (\n <div className=\"prose min-w-full\">\n {renderTiptapContent(content, classNames)}\n </div>\n );\n};\n\nfunction renderChildren(\n nodes: JSONContent[\"content\"] | undefined,\n classNames: BlogComponentClassNames\n): JSX.Element[] {\n if (!nodes) {\n console.log(\"no nodes\");\n return [];\n }\n\n return nodes\n .map((child, idx) => {\n if (child.type === \"text\") {\n let text: React.ReactNode = child.text;\n if (child.marks) {\n child.marks.forEach((mark) => {\n if (mark.type === \"bold\") text = <strong key={idx}>{text}</strong>;\n if (mark.type === \"italic\") text = <em key={idx}>{text}</em>;\n if (mark.type === \"link\")\n text = (\n <Link\n key={idx}\n href={mark.attrs?.href}\n className={classNames.link || \"text-blue-600 underline\"}\n >\n {text}\n </Link>\n );\n });\n }\n return <span key={idx}>{text}</span>;\n } else {\n console.log(\"child\", child);\n\n // Recursively render non-text nodes (e.g., paragraph, listItem, etc.)\n return (\n <React.Fragment key={idx}>\n {renderTiptapContent(\n { ...child, content: child.content },\n classNames\n )}\n </React.Fragment>\n );\n }\n })\n .filter(Boolean) as JSX.Element[];\n}\n"],"mappings":"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","names":[]}
@@ -48,6 +48,7 @@ const TableOfContents = ({
48
48
  author.fileKey && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49
49
  import_image.default,
50
50
  {
51
+ unoptimized: import_sdk_config.opinlyConfig.unoptimizedImages,
51
52
  src: `${import_sdk_config.opinlyConfig.imagesPrefix}/${author.fileKey}`,
52
53
  alt: author.name,
53
54
  width: 48,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n}: TableOfContentsProps) => {\n return (\n <aside className={cn(\"w-full lg:w-1/3 lg:sticky lg:top-20 lg:self-start\")}>\n {author && (\n <div className=\"w-full mb-6 border p-4 rounded-md text-sm\">\n <div className=\"flex items-center gap-3 mb-3\">\n {author.fileKey && (\n <Image\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-xs uppercase text-muted-foreground font-medium\"\n >\n {author.name}\n </Link>\n <div className=\"text-muted-foreground text-sm\">{author.bio}</div>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-opinlyAccent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">TABLE OF CONTENTS</h2>\n <ul className=\"text-sm text-gray-700 space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li key={heading.slug}>\n <a href={`#${heading.slug}`} className=\"hover:underline\">\n {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </aside>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Bc;AAxBd,mBAAmB;AACnB,mBAAkB;AAClB,wBAA6B;AAC7B,8BAAgC;AAChC,mBAAsB;AACtB,kBAAiB;AAQV,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,6CAAC,WAAM,eAAW,iBAAG,mDAAmD,GACrE;AAAA,cACC,4CAAC,SAAI,WAAU,6CACb,uDAAC,SAAI,WAAU,gCACZ;AAAA,aAAO,WACN;AAAA,QAAC,aAAAA;AAAA,QAAA;AAAA,UACC,KAAK,GAAG,+BAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,6CAAC,SACC;AAAA;AAAA,UAAC,YAAAC;AAAA,UAAA;AAAA,YACC,MAAM,GAAG,+BAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,4CAAC,SAAI,WAAU,iCAAiC,iBAAO,KAAI;AAAA,SAC7D;AAAA,OACF,GACF;AAAA,IAEF,4CAAC,sBAAM,MAAY;AAAA,IACnB,6CAAC,SAAI,WAAU,4CACb;AAAA,kDAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,4CAAC,QAAG,WAAU,mCACV,wDAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC,4CAAC,QACC,sDAAC,OAAE,MAAM,IAAI,QAAQ,IAAI,IAAI,WAAU,mBACpC,kBAAQ,MACX,KAHO,QAAQ,IAIjB,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":["Image","Link"]}
1
+ {"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n}: TableOfContentsProps) => {\n return (\n <aside className={cn(\"w-full lg:w-1/3 lg:sticky lg:top-20 lg:self-start\")}>\n {author && (\n <div className=\"w-full mb-6 border p-4 rounded-md text-sm\">\n <div className=\"flex items-center gap-3 mb-3\">\n {author.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-xs uppercase text-muted-foreground font-medium\"\n >\n {author.name}\n </Link>\n <div className=\"text-muted-foreground text-sm\">{author.bio}</div>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-opinlyAccent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">TABLE OF CONTENTS</h2>\n <ul className=\"text-sm text-gray-700 space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li key={heading.slug}>\n <a href={`#${heading.slug}`} className=\"hover:underline\">\n {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </aside>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Bc;AAxBd,mBAAmB;AACnB,mBAAkB;AAClB,wBAA6B;AAC7B,8BAAgC;AAChC,mBAAsB;AACtB,kBAAiB;AAQV,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,6CAAC,WAAM,eAAW,iBAAG,mDAAmD,GACrE;AAAA,cACC,4CAAC,SAAI,WAAU,6CACb,uDAAC,SAAI,WAAU,gCACZ;AAAA,aAAO,WACN;AAAA,QAAC,aAAAA;AAAA,QAAA;AAAA,UACC,aAAa,+BAAa;AAAA,UAC1B,KAAK,GAAG,+BAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,6CAAC,SACC;AAAA;AAAA,UAAC,YAAAC;AAAA,UAAA;AAAA,YACC,MAAM,GAAG,+BAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,4CAAC,SAAI,WAAU,iCAAiC,iBAAO,KAAI;AAAA,SAC7D;AAAA,OACF,GACF;AAAA,IAEF,4CAAC,sBAAM,MAAY;AAAA,IACnB,6CAAC,SAAI,WAAU,4CACb;AAAA,kDAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,4CAAC,QAAG,WAAU,mCACV,wDAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC,4CAAC,QACC,sDAAC,OAAE,MAAM,IAAI,QAAQ,IAAI,IAAI,WAAU,mBACpC,kBAAQ,MACX,KAHO,QAAQ,IAIjB,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":["Image","Link"]}
@@ -15,6 +15,7 @@ const TableOfContents = ({
15
15
  author.fileKey && /* @__PURE__ */ jsx(
16
16
  Image,
17
17
  {
18
+ unoptimized: opinlyConfig.unoptimizedImages,
18
19
  src: `${opinlyConfig.imagesPrefix}/${author.fileKey}`,
19
20
  alt: author.name,
20
21
  width: 48,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n}: TableOfContentsProps) => {\n return (\n <aside className={cn(\"w-full lg:w-1/3 lg:sticky lg:top-20 lg:self-start\")}>\n {author && (\n <div className=\"w-full mb-6 border p-4 rounded-md text-sm\">\n <div className=\"flex items-center gap-3 mb-3\">\n {author.fileKey && (\n <Image\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-xs uppercase text-muted-foreground font-medium\"\n >\n {author.name}\n </Link>\n <div className=\"text-muted-foreground text-sm\">{author.bio}</div>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-opinlyAccent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">TABLE OF CONTENTS</h2>\n <ul className=\"text-sm text-gray-700 space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li key={heading.slug}>\n <a href={`#${heading.slug}`} className=\"hover:underline\">\n {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </aside>\n );\n};\n"],"mappings":"AA0Bc,cAQF,YARE;AAxBd,SAAS,UAAU;AACnB,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,aAAa;AACtB,OAAO,UAAU;AAQV,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,qBAAC,WAAM,WAAW,GAAG,mDAAmD,GACrE;AAAA,cACC,oBAAC,SAAI,WAAU,6CACb,+BAAC,SAAI,WAAU,gCACZ;AAAA,aAAO,WACN;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,qBAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,oBAAC,SAAI,WAAU,iCAAiC,iBAAO,KAAI;AAAA,SAC7D;AAAA,OACF,GACF;AAAA,IAEF,oBAAC,SAAM,MAAY;AAAA,IACnB,qBAAC,SAAI,WAAU,4CACb;AAAA,0BAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,oBAAC,QAAG,WAAU,mCACV,2BAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC,oBAAC,QACC,8BAAC,OAAE,MAAM,IAAI,QAAQ,IAAI,IAAI,WAAU,mBACpC,kBAAQ,MACX,KAHO,QAAQ,IAIjB,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n}: TableOfContentsProps) => {\n return (\n <aside className={cn(\"w-full lg:w-1/3 lg:sticky lg:top-20 lg:self-start\")}>\n {author && (\n <div className=\"w-full mb-6 border p-4 rounded-md text-sm\">\n <div className=\"flex items-center gap-3 mb-3\">\n {author.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-xs uppercase text-muted-foreground font-medium\"\n >\n {author.name}\n </Link>\n <div className=\"text-muted-foreground text-sm\">{author.bio}</div>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-opinlyAccent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">TABLE OF CONTENTS</h2>\n <ul className=\"text-sm text-gray-700 space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li key={heading.slug}>\n <a href={`#${heading.slug}`} className=\"hover:underline\">\n {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </aside>\n );\n};\n"],"mappings":"AA0Bc,cASF,YATE;AAxBd,SAAS,UAAU;AACnB,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,aAAa;AACtB,OAAO,UAAU;AAQV,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,qBAAC,WAAM,WAAW,GAAG,mDAAmD,GACrE;AAAA,cACC,oBAAC,SAAI,WAAU,6CACb,+BAAC,SAAI,WAAU,gCACZ;AAAA,aAAO,WACN;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,qBAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,oBAAC,SAAI,WAAU,iCAAiC,iBAAO,KAAI;AAAA,SAC7D;AAAA,OACF,GACF;AAAA,IAEF,oBAAC,SAAM,MAAY;AAAA,IACnB,qBAAC,SAAI,WAAU,4CACb;AAAA,0BAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,oBAAC,QAAG,WAAU,mCACV,2BAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC,oBAAC,QACC,8BAAC,OAAE,MAAM,IAAI,QAAQ,IAAI,IAAI,WAAU,mBACpC,kBAAQ,MACX,KAHO,QAAQ,IAIjB,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -62,6 +62,7 @@ const PostPreview = ({
62
62
  post.image?.fileKey && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: postSlug, className: "group", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative w-full h-48 mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
63
63
  import_image.default,
64
64
  {
65
+ unoptimized: import_sdk_config.opinlyConfig.unoptimizedImages,
65
66
  src: `${import_sdk_config.opinlyConfig.imagesPrefix}/${post.image.fileKey}`,
66
67
  alt: post.title,
67
68
  fill: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/post-preview.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../utils/sdk-config\";\nimport { formatDate } from \"../utils/dates\";\n\nexport const PostPreviewSkeleton: React.FC = () => (\n <div className=\"w-full h-full \">\n {/* Image placeholder (with same mb-4 as real) */}\n <div className=\"animate-pulse mb-5\">\n <div className=\"w-full h-48 bg-gray-200 dark:bg-gray-700 rounded-lg\" />\n </div>\n\n {/* Folder · dot · date (text-sm text-muted-foreground mb-1) */}\n <div className=\"flex items-center space-x-2 text-sm text-muted-foreground mb-3\">\n <div className=\"animate-pulse h-4 w-20 bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-4 w-1 bg-gray-200 dark:bg-gray-700 rounded-full\" />\n <div className=\"animate-pulse h-4 w-16 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n\n {/* Title (text-lg font-semibold leading-snug) */}\n <div className=\"animate-pulse h-5 w-3/4 bg-gray-200 dark:bg-gray-700 rounded mb-2\" />\n\n {/* Description (text-sm mt-1 line-clamp-2) */}\n <div className=\"space-y-1 mt-1 pr-4\">\n <div className=\"animate-pulse h-4 w-full bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-4 w-10/12 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n\n {/* Author · date (text-xs text-gray-500 mt-2 flex items-center space-x-2) */}\n <div className=\"flex items-center space-x-2 text-xs text-gray-500 mt-2\">\n <div className=\"animate-pulse h-3 w-24 bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-3 w-12 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n </div>\n);\nexport const PostPreview = ({\n post,\n}: {\n post: NonNullable<\n NonNullable<\n Awaited<\n ReturnType<Opinly[\"client\"][\"content\"][\"authorPage\"][\"query\"]>\n >[\"data\"]\n >[\"posts\"][number]\n >;\n}) => {\n const postSlug = `${opinlyConfig.blogPrefix}/${post.folder?.slug ? `${post.folder.slug}/` : \"\"}${post.slug}`;\n\n return (\n <div className=\"w-full h-full \">\n {post.image?.fileKey && (\n <Link href={postSlug} className=\"group\">\n <div className=\"relative w-full h-48 mb-4\">\n <Image\n src={`${opinlyConfig.imagesPrefix}/${post.image.fileKey}`}\n alt={post.title}\n fill\n className=\"object-cover rounded-lg\"\n />\n </div>\n </Link>\n )}\n <div className=\"text-sm text-muted-foreground mb-1\">\n {post.folder?.name && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/${post.folder.slug}`}\n className=\"hover:underline\"\n >\n {post.folder.name}\n </Link>\n <span className=\"mx-1\">·</span>\n </>\n )}{\" \"}\n {formatDate(post.firstPublishedAt as string)}\n </div>\n <Link href={postSlug} className=\"group\">\n <h2 className=\"text-lg font-semibold leading-snug group-hover:underline\">\n {post.title}\n </h2>\n </Link>\n\n {post.description && (\n <p className=\"text-sm text-gray-600 mt-1 line-clamp-2\">\n {post.description}\n </p>\n )}\n <div className=\"text-xs text-gray-500 mt-2\">\n {post.author && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author.slug}`}\n className=\"font-medium hover:underline\"\n >\n {post.author?.name}\n </Link>{\" \"}\n <span className=\"mx-1\">·</span>\n </>\n )}{\" \"}\n {formatDate(post.firstPublishedAt as string)}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUM;AATN,kBAAiB;AACjB,mBAAkB;AAClB,wBAA6B;AAC7B,mBAA2B;AAEpB,MAAM,sBAAgC,MAC3C,6CAAC,SAAI,WAAU,kBAEb;AAAA,8CAAC,SAAI,WAAU,sBACb,sDAAC,SAAI,WAAU,uDAAsD,GACvE;AAAA,EAGA,6CAAC,SAAI,WAAU,kEACb;AAAA,gDAAC,SAAI,WAAU,+DAA8D;AAAA,IAC7E,4CAAC,SAAI,WAAU,mEAAkE;AAAA,IACjF,4CAAC,SAAI,WAAU,+DAA8D;AAAA,KAC/E;AAAA,EAGA,4CAAC,SAAI,WAAU,qEAAoE;AAAA,EAGnF,6CAAC,SAAI,WAAU,uBACb;AAAA,gDAAC,SAAI,WAAU,iEAAgE;AAAA,IAC/E,4CAAC,SAAI,WAAU,kEAAiE;AAAA,KAClF;AAAA,EAGA,6CAAC,SAAI,WAAU,0DACb;AAAA,gDAAC,SAAI,WAAU,+DAA8D;AAAA,IAC7E,4CAAC,SAAI,WAAU,+DAA8D;AAAA,KAC/E;AAAA,GACF;AAEK,MAAM,cAAc,CAAC;AAAA,EAC1B;AACF,MAQM;AACJ,QAAM,WAAW,GAAG,+BAAa,UAAU,IAAI,KAAK,QAAQ,OAAO,GAAG,KAAK,OAAO,IAAI,MAAM,EAAE,GAAG,KAAK,IAAI;AAE1G,SACE,6CAAC,SAAI,WAAU,kBACZ;AAAA,SAAK,OAAO,WACX,4CAAC,YAAAA,SAAA,EAAK,MAAM,UAAU,WAAU,SAC9B,sDAAC,SAAI,WAAU,6BACb;AAAA,MAAC,aAAAC;AAAA,MAAA;AAAA,QACC,KAAK,GAAG,+BAAa,YAAY,IAAI,KAAK,MAAM,OAAO;AAAA,QACvD,KAAK,KAAK;AAAA,QACV,MAAI;AAAA,QACJ,WAAU;AAAA;AAAA,IACZ,GACF,GACF;AAAA,IAEF,6CAAC,SAAI,WAAU,sCACZ;AAAA,WAAK,QAAQ,QACZ,4EACE;AAAA;AAAA,UAAC,YAAAD;AAAA,UAAA;AAAA,YACC,MAAM,GAAG,+BAAa,UAAU,IAAI,KAAK,OAAO,IAAI;AAAA,YACpD,WAAU;AAAA,YAET,eAAK,OAAO;AAAA;AAAA,QACf;AAAA,QACA,4CAAC,UAAK,WAAU,QAAO,kBAAC;AAAA,SAC1B;AAAA,MACC;AAAA,UACF,yBAAW,KAAK,gBAA0B;AAAA,OAC7C;AAAA,IACA,4CAAC,YAAAA,SAAA,EAAK,MAAM,UAAU,WAAU,SAC9B,sDAAC,QAAG,WAAU,4DACX,eAAK,OACR,GACF;AAAA,IAEC,KAAK,eACJ,4CAAC,OAAE,WAAU,2CACV,eAAK,aACR;AAAA,IAEF,6CAAC,SAAI,WAAU,8BACZ;AAAA,WAAK,UACJ,4EACE;AAAA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,GAAG,+BAAa,UAAU,YAAY,KAAK,OAAO,IAAI;AAAA,YAC5D,WAAU;AAAA,YAET,eAAK,QAAQ;AAAA;AAAA,QAChB;AAAA,QAAQ;AAAA,QACR,4CAAC,UAAK,WAAU,QAAO,kBAAC;AAAA,SAC1B;AAAA,MACC;AAAA,UACF,yBAAW,KAAK,gBAA0B;AAAA,OAC7C;AAAA,KACF;AAEJ;","names":["Link","Image"]}
1
+ {"version":3,"sources":["../../src/components/post-preview.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../utils/sdk-config\";\nimport { formatDate } from \"../utils/dates\";\n\nexport const PostPreviewSkeleton: React.FC = () => (\n <div className=\"w-full h-full \">\n {/* Image placeholder (with same mb-4 as real) */}\n <div className=\"animate-pulse mb-5\">\n <div className=\"w-full h-48 bg-gray-200 dark:bg-gray-700 rounded-lg\" />\n </div>\n\n {/* Folder · dot · date (text-sm text-muted-foreground mb-1) */}\n <div className=\"flex items-center space-x-2 text-sm text-muted-foreground mb-3\">\n <div className=\"animate-pulse h-4 w-20 bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-4 w-1 bg-gray-200 dark:bg-gray-700 rounded-full\" />\n <div className=\"animate-pulse h-4 w-16 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n\n {/* Title (text-lg font-semibold leading-snug) */}\n <div className=\"animate-pulse h-5 w-3/4 bg-gray-200 dark:bg-gray-700 rounded mb-2\" />\n\n {/* Description (text-sm mt-1 line-clamp-2) */}\n <div className=\"space-y-1 mt-1 pr-4\">\n <div className=\"animate-pulse h-4 w-full bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-4 w-10/12 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n\n {/* Author · date (text-xs text-gray-500 mt-2 flex items-center space-x-2) */}\n <div className=\"flex items-center space-x-2 text-xs text-gray-500 mt-2\">\n <div className=\"animate-pulse h-3 w-24 bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-3 w-12 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n </div>\n);\nexport const PostPreview = ({\n post,\n}: {\n post: NonNullable<\n NonNullable<\n Awaited<\n ReturnType<Opinly[\"client\"][\"content\"][\"authorPage\"][\"query\"]>\n >[\"data\"]\n >[\"posts\"][number]\n >;\n}) => {\n const postSlug = `${opinlyConfig.blogPrefix}/${post.folder?.slug ? `${post.folder.slug}/` : \"\"}${post.slug}`;\n\n return (\n <div className=\"w-full h-full \">\n {post.image?.fileKey && (\n <Link href={postSlug} className=\"group\">\n <div className=\"relative w-full h-48 mb-4\">\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${post.image.fileKey}`}\n alt={post.title}\n fill\n className=\"object-cover rounded-lg\"\n />\n </div>\n </Link>\n )}\n <div className=\"text-sm text-muted-foreground mb-1\">\n {post.folder?.name && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/${post.folder.slug}`}\n className=\"hover:underline\"\n >\n {post.folder.name}\n </Link>\n <span className=\"mx-1\">·</span>\n </>\n )}{\" \"}\n {formatDate(post.firstPublishedAt as string)}\n </div>\n <Link href={postSlug} className=\"group\">\n <h2 className=\"text-lg font-semibold leading-snug group-hover:underline\">\n {post.title}\n </h2>\n </Link>\n\n {post.description && (\n <p className=\"text-sm text-gray-600 mt-1 line-clamp-2\">\n {post.description}\n </p>\n )}\n <div className=\"text-xs text-gray-500 mt-2\">\n {post.author && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author.slug}`}\n className=\"font-medium hover:underline\"\n >\n {post.author?.name}\n </Link>{\" \"}\n <span className=\"mx-1\">·</span>\n </>\n )}{\" \"}\n {formatDate(post.firstPublishedAt as string)}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUM;AATN,kBAAiB;AACjB,mBAAkB;AAClB,wBAA6B;AAC7B,mBAA2B;AAEpB,MAAM,sBAAgC,MAC3C,6CAAC,SAAI,WAAU,kBAEb;AAAA,8CAAC,SAAI,WAAU,sBACb,sDAAC,SAAI,WAAU,uDAAsD,GACvE;AAAA,EAGA,6CAAC,SAAI,WAAU,kEACb;AAAA,gDAAC,SAAI,WAAU,+DAA8D;AAAA,IAC7E,4CAAC,SAAI,WAAU,mEAAkE;AAAA,IACjF,4CAAC,SAAI,WAAU,+DAA8D;AAAA,KAC/E;AAAA,EAGA,4CAAC,SAAI,WAAU,qEAAoE;AAAA,EAGnF,6CAAC,SAAI,WAAU,uBACb;AAAA,gDAAC,SAAI,WAAU,iEAAgE;AAAA,IAC/E,4CAAC,SAAI,WAAU,kEAAiE;AAAA,KAClF;AAAA,EAGA,6CAAC,SAAI,WAAU,0DACb;AAAA,gDAAC,SAAI,WAAU,+DAA8D;AAAA,IAC7E,4CAAC,SAAI,WAAU,+DAA8D;AAAA,KAC/E;AAAA,GACF;AAEK,MAAM,cAAc,CAAC;AAAA,EAC1B;AACF,MAQM;AACJ,QAAM,WAAW,GAAG,+BAAa,UAAU,IAAI,KAAK,QAAQ,OAAO,GAAG,KAAK,OAAO,IAAI,MAAM,EAAE,GAAG,KAAK,IAAI;AAE1G,SACE,6CAAC,SAAI,WAAU,kBACZ;AAAA,SAAK,OAAO,WACX,4CAAC,YAAAA,SAAA,EAAK,MAAM,UAAU,WAAU,SAC9B,sDAAC,SAAI,WAAU,6BACb;AAAA,MAAC,aAAAC;AAAA,MAAA;AAAA,QACC,aAAa,+BAAa;AAAA,QAC1B,KAAK,GAAG,+BAAa,YAAY,IAAI,KAAK,MAAM,OAAO;AAAA,QACvD,KAAK,KAAK;AAAA,QACV,MAAI;AAAA,QACJ,WAAU;AAAA;AAAA,IACZ,GACF,GACF;AAAA,IAEF,6CAAC,SAAI,WAAU,sCACZ;AAAA,WAAK,QAAQ,QACZ,4EACE;AAAA;AAAA,UAAC,YAAAD;AAAA,UAAA;AAAA,YACC,MAAM,GAAG,+BAAa,UAAU,IAAI,KAAK,OAAO,IAAI;AAAA,YACpD,WAAU;AAAA,YAET,eAAK,OAAO;AAAA;AAAA,QACf;AAAA,QACA,4CAAC,UAAK,WAAU,QAAO,kBAAC;AAAA,SAC1B;AAAA,MACC;AAAA,UACF,yBAAW,KAAK,gBAA0B;AAAA,OAC7C;AAAA,IACA,4CAAC,YAAAA,SAAA,EAAK,MAAM,UAAU,WAAU,SAC9B,sDAAC,QAAG,WAAU,4DACX,eAAK,OACR,GACF;AAAA,IAEC,KAAK,eACJ,4CAAC,OAAE,WAAU,2CACV,eAAK,aACR;AAAA,IAEF,6CAAC,SAAI,WAAU,8BACZ;AAAA,WAAK,UACJ,4EACE;AAAA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,GAAG,+BAAa,UAAU,YAAY,KAAK,OAAO,IAAI;AAAA,YAC5D,WAAU;AAAA,YAET,eAAK,QAAQ;AAAA;AAAA,QAChB;AAAA,QAAQ;AAAA,QACR,4CAAC,UAAK,WAAU,QAAO,kBAAC;AAAA,SAC1B;AAAA,MACC;AAAA,UACF,yBAAW,KAAK,gBAA0B;AAAA,OAC7C;AAAA,KACF;AAEJ;","names":["Link","Image"]}
@@ -28,6 +28,7 @@ const PostPreview = ({
28
28
  post.image?.fileKey && /* @__PURE__ */ jsx(Link, { href: postSlug, className: "group", children: /* @__PURE__ */ jsx("div", { className: "relative w-full h-48 mb-4", children: /* @__PURE__ */ jsx(
29
29
  Image,
30
30
  {
31
+ unoptimized: opinlyConfig.unoptimizedImages,
31
32
  src: `${opinlyConfig.imagesPrefix}/${post.image.fileKey}`,
32
33
  alt: post.title,
33
34
  fill: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/post-preview.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../utils/sdk-config\";\nimport { formatDate } from \"../utils/dates\";\n\nexport const PostPreviewSkeleton: React.FC = () => (\n <div className=\"w-full h-full \">\n {/* Image placeholder (with same mb-4 as real) */}\n <div className=\"animate-pulse mb-5\">\n <div className=\"w-full h-48 bg-gray-200 dark:bg-gray-700 rounded-lg\" />\n </div>\n\n {/* Folder · dot · date (text-sm text-muted-foreground mb-1) */}\n <div className=\"flex items-center space-x-2 text-sm text-muted-foreground mb-3\">\n <div className=\"animate-pulse h-4 w-20 bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-4 w-1 bg-gray-200 dark:bg-gray-700 rounded-full\" />\n <div className=\"animate-pulse h-4 w-16 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n\n {/* Title (text-lg font-semibold leading-snug) */}\n <div className=\"animate-pulse h-5 w-3/4 bg-gray-200 dark:bg-gray-700 rounded mb-2\" />\n\n {/* Description (text-sm mt-1 line-clamp-2) */}\n <div className=\"space-y-1 mt-1 pr-4\">\n <div className=\"animate-pulse h-4 w-full bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-4 w-10/12 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n\n {/* Author · date (text-xs text-gray-500 mt-2 flex items-center space-x-2) */}\n <div className=\"flex items-center space-x-2 text-xs text-gray-500 mt-2\">\n <div className=\"animate-pulse h-3 w-24 bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-3 w-12 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n </div>\n);\nexport const PostPreview = ({\n post,\n}: {\n post: NonNullable<\n NonNullable<\n Awaited<\n ReturnType<Opinly[\"client\"][\"content\"][\"authorPage\"][\"query\"]>\n >[\"data\"]\n >[\"posts\"][number]\n >;\n}) => {\n const postSlug = `${opinlyConfig.blogPrefix}/${post.folder?.slug ? `${post.folder.slug}/` : \"\"}${post.slug}`;\n\n return (\n <div className=\"w-full h-full \">\n {post.image?.fileKey && (\n <Link href={postSlug} className=\"group\">\n <div className=\"relative w-full h-48 mb-4\">\n <Image\n src={`${opinlyConfig.imagesPrefix}/${post.image.fileKey}`}\n alt={post.title}\n fill\n className=\"object-cover rounded-lg\"\n />\n </div>\n </Link>\n )}\n <div className=\"text-sm text-muted-foreground mb-1\">\n {post.folder?.name && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/${post.folder.slug}`}\n className=\"hover:underline\"\n >\n {post.folder.name}\n </Link>\n <span className=\"mx-1\">·</span>\n </>\n )}{\" \"}\n {formatDate(post.firstPublishedAt as string)}\n </div>\n <Link href={postSlug} className=\"group\">\n <h2 className=\"text-lg font-semibold leading-snug group-hover:underline\">\n {post.title}\n </h2>\n </Link>\n\n {post.description && (\n <p className=\"text-sm text-gray-600 mt-1 line-clamp-2\">\n {post.description}\n </p>\n )}\n <div className=\"text-xs text-gray-500 mt-2\">\n {post.author && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author.slug}`}\n className=\"font-medium hover:underline\"\n >\n {post.author?.name}\n </Link>{\" \"}\n <span className=\"mx-1\">·</span>\n </>\n )}{\" \"}\n {formatDate(post.firstPublishedAt as string)}\n </div>\n </div>\n );\n};\n"],"mappings":"AAUM,SAuDI,UAvDJ,KAIF,YAJE;AATN,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAEpB,MAAM,sBAAgC,MAC3C,qBAAC,SAAI,WAAU,kBAEb;AAAA,sBAAC,SAAI,WAAU,sBACb,8BAAC,SAAI,WAAU,uDAAsD,GACvE;AAAA,EAGA,qBAAC,SAAI,WAAU,kEACb;AAAA,wBAAC,SAAI,WAAU,+DAA8D;AAAA,IAC7E,oBAAC,SAAI,WAAU,mEAAkE;AAAA,IACjF,oBAAC,SAAI,WAAU,+DAA8D;AAAA,KAC/E;AAAA,EAGA,oBAAC,SAAI,WAAU,qEAAoE;AAAA,EAGnF,qBAAC,SAAI,WAAU,uBACb;AAAA,wBAAC,SAAI,WAAU,iEAAgE;AAAA,IAC/E,oBAAC,SAAI,WAAU,kEAAiE;AAAA,KAClF;AAAA,EAGA,qBAAC,SAAI,WAAU,0DACb;AAAA,wBAAC,SAAI,WAAU,+DAA8D;AAAA,IAC7E,oBAAC,SAAI,WAAU,+DAA8D;AAAA,KAC/E;AAAA,GACF;AAEK,MAAM,cAAc,CAAC;AAAA,EAC1B;AACF,MAQM;AACJ,QAAM,WAAW,GAAG,aAAa,UAAU,IAAI,KAAK,QAAQ,OAAO,GAAG,KAAK,OAAO,IAAI,MAAM,EAAE,GAAG,KAAK,IAAI;AAE1G,SACE,qBAAC,SAAI,WAAU,kBACZ;AAAA,SAAK,OAAO,WACX,oBAAC,QAAK,MAAM,UAAU,WAAU,SAC9B,8BAAC,SAAI,WAAU,6BACb;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,GAAG,aAAa,YAAY,IAAI,KAAK,MAAM,OAAO;AAAA,QACvD,KAAK,KAAK;AAAA,QACV,MAAI;AAAA,QACJ,WAAU;AAAA;AAAA,IACZ,GACF,GACF;AAAA,IAEF,qBAAC,SAAI,WAAU,sCACZ;AAAA,WAAK,QAAQ,QACZ,iCACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,IAAI,KAAK,OAAO,IAAI;AAAA,YACpD,WAAU;AAAA,YAET,eAAK,OAAO;AAAA;AAAA,QACf;AAAA,QACA,oBAAC,UAAK,WAAU,QAAO,kBAAC;AAAA,SAC1B;AAAA,MACC;AAAA,MACF,WAAW,KAAK,gBAA0B;AAAA,OAC7C;AAAA,IACA,oBAAC,QAAK,MAAM,UAAU,WAAU,SAC9B,8BAAC,QAAG,WAAU,4DACX,eAAK,OACR,GACF;AAAA,IAEC,KAAK,eACJ,oBAAC,OAAE,WAAU,2CACV,eAAK,aACR;AAAA,IAEF,qBAAC,SAAI,WAAU,8BACZ;AAAA,WAAK,UACJ,iCACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,YAAY,KAAK,OAAO,IAAI;AAAA,YAC5D,WAAU;AAAA,YAET,eAAK,QAAQ;AAAA;AAAA,QAChB;AAAA,QAAQ;AAAA,QACR,oBAAC,UAAK,WAAU,QAAO,kBAAC;AAAA,SAC1B;AAAA,MACC;AAAA,MACF,WAAW,KAAK,gBAA0B;AAAA,OAC7C;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/post-preview.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../utils/sdk-config\";\nimport { formatDate } from \"../utils/dates\";\n\nexport const PostPreviewSkeleton: React.FC = () => (\n <div className=\"w-full h-full \">\n {/* Image placeholder (with same mb-4 as real) */}\n <div className=\"animate-pulse mb-5\">\n <div className=\"w-full h-48 bg-gray-200 dark:bg-gray-700 rounded-lg\" />\n </div>\n\n {/* Folder · dot · date (text-sm text-muted-foreground mb-1) */}\n <div className=\"flex items-center space-x-2 text-sm text-muted-foreground mb-3\">\n <div className=\"animate-pulse h-4 w-20 bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-4 w-1 bg-gray-200 dark:bg-gray-700 rounded-full\" />\n <div className=\"animate-pulse h-4 w-16 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n\n {/* Title (text-lg font-semibold leading-snug) */}\n <div className=\"animate-pulse h-5 w-3/4 bg-gray-200 dark:bg-gray-700 rounded mb-2\" />\n\n {/* Description (text-sm mt-1 line-clamp-2) */}\n <div className=\"space-y-1 mt-1 pr-4\">\n <div className=\"animate-pulse h-4 w-full bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-4 w-10/12 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n\n {/* Author · date (text-xs text-gray-500 mt-2 flex items-center space-x-2) */}\n <div className=\"flex items-center space-x-2 text-xs text-gray-500 mt-2\">\n <div className=\"animate-pulse h-3 w-24 bg-gray-200 dark:bg-gray-700 rounded\" />\n <div className=\"animate-pulse h-3 w-12 bg-gray-200 dark:bg-gray-700 rounded\" />\n </div>\n </div>\n);\nexport const PostPreview = ({\n post,\n}: {\n post: NonNullable<\n NonNullable<\n Awaited<\n ReturnType<Opinly[\"client\"][\"content\"][\"authorPage\"][\"query\"]>\n >[\"data\"]\n >[\"posts\"][number]\n >;\n}) => {\n const postSlug = `${opinlyConfig.blogPrefix}/${post.folder?.slug ? `${post.folder.slug}/` : \"\"}${post.slug}`;\n\n return (\n <div className=\"w-full h-full \">\n {post.image?.fileKey && (\n <Link href={postSlug} className=\"group\">\n <div className=\"relative w-full h-48 mb-4\">\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${post.image.fileKey}`}\n alt={post.title}\n fill\n className=\"object-cover rounded-lg\"\n />\n </div>\n </Link>\n )}\n <div className=\"text-sm text-muted-foreground mb-1\">\n {post.folder?.name && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/${post.folder.slug}`}\n className=\"hover:underline\"\n >\n {post.folder.name}\n </Link>\n <span className=\"mx-1\">·</span>\n </>\n )}{\" \"}\n {formatDate(post.firstPublishedAt as string)}\n </div>\n <Link href={postSlug} className=\"group\">\n <h2 className=\"text-lg font-semibold leading-snug group-hover:underline\">\n {post.title}\n </h2>\n </Link>\n\n {post.description && (\n <p className=\"text-sm text-gray-600 mt-1 line-clamp-2\">\n {post.description}\n </p>\n )}\n <div className=\"text-xs text-gray-500 mt-2\">\n {post.author && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author.slug}`}\n className=\"font-medium hover:underline\"\n >\n {post.author?.name}\n </Link>{\" \"}\n <span className=\"mx-1\">·</span>\n </>\n )}{\" \"}\n {formatDate(post.firstPublishedAt as string)}\n </div>\n </div>\n );\n};\n"],"mappings":"AAUM,SAwDI,UAxDJ,KAIF,YAJE;AATN,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAEpB,MAAM,sBAAgC,MAC3C,qBAAC,SAAI,WAAU,kBAEb;AAAA,sBAAC,SAAI,WAAU,sBACb,8BAAC,SAAI,WAAU,uDAAsD,GACvE;AAAA,EAGA,qBAAC,SAAI,WAAU,kEACb;AAAA,wBAAC,SAAI,WAAU,+DAA8D;AAAA,IAC7E,oBAAC,SAAI,WAAU,mEAAkE;AAAA,IACjF,oBAAC,SAAI,WAAU,+DAA8D;AAAA,KAC/E;AAAA,EAGA,oBAAC,SAAI,WAAU,qEAAoE;AAAA,EAGnF,qBAAC,SAAI,WAAU,uBACb;AAAA,wBAAC,SAAI,WAAU,iEAAgE;AAAA,IAC/E,oBAAC,SAAI,WAAU,kEAAiE;AAAA,KAClF;AAAA,EAGA,qBAAC,SAAI,WAAU,0DACb;AAAA,wBAAC,SAAI,WAAU,+DAA8D;AAAA,IAC7E,oBAAC,SAAI,WAAU,+DAA8D;AAAA,KAC/E;AAAA,GACF;AAEK,MAAM,cAAc,CAAC;AAAA,EAC1B;AACF,MAQM;AACJ,QAAM,WAAW,GAAG,aAAa,UAAU,IAAI,KAAK,QAAQ,OAAO,GAAG,KAAK,OAAO,IAAI,MAAM,EAAE,GAAG,KAAK,IAAI;AAE1G,SACE,qBAAC,SAAI,WAAU,kBACZ;AAAA,SAAK,OAAO,WACX,oBAAC,QAAK,MAAM,UAAU,WAAU,SAC9B,8BAAC,SAAI,WAAU,6BACb;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,aAAa;AAAA,QAC1B,KAAK,GAAG,aAAa,YAAY,IAAI,KAAK,MAAM,OAAO;AAAA,QACvD,KAAK,KAAK;AAAA,QACV,MAAI;AAAA,QACJ,WAAU;AAAA;AAAA,IACZ,GACF,GACF;AAAA,IAEF,qBAAC,SAAI,WAAU,sCACZ;AAAA,WAAK,QAAQ,QACZ,iCACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,IAAI,KAAK,OAAO,IAAI;AAAA,YACpD,WAAU;AAAA,YAET,eAAK,OAAO;AAAA;AAAA,QACf;AAAA,QACA,oBAAC,UAAK,WAAU,QAAO,kBAAC;AAAA,SAC1B;AAAA,MACC;AAAA,MACF,WAAW,KAAK,gBAA0B;AAAA,OAC7C;AAAA,IACA,oBAAC,QAAK,MAAM,UAAU,WAAU,SAC9B,8BAAC,QAAG,WAAU,4DACX,eAAK,OACR,GACF;AAAA,IAEC,KAAK,eACJ,oBAAC,OAAE,WAAU,2CACV,eAAK,aACR;AAAA,IAEF,qBAAC,SAAI,WAAU,8BACZ;AAAA,WAAK,UACJ,iCACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,YAAY,KAAK,OAAO,IAAI;AAAA,YAC5D,WAAU;AAAA,YAET,eAAK,QAAQ;AAAA;AAAA,QAChB;AAAA,QAAQ;AAAA,QACR,oBAAC,UAAK,WAAU,QAAO,kBAAC;AAAA,SAC1B;AAAA,MACC;AAAA,MACF,WAAW,KAAK,gBAA0B;AAAA,OAC7C;AAAA,KACF;AAEJ;","names":[]}
@@ -18,34 +18,36 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var generate_metadata_exports = {};
20
20
  __export(generate_metadata_exports, {
21
- generateMetadata: () => generateMetadata
21
+ generateOpinlyMetadata: () => generateOpinlyMetadata
22
22
  });
23
23
  module.exports = __toCommonJS(generate_metadata_exports);
24
24
  var import_sdk_config = require("./sdk-config");
25
- const generateMetadata = async (client, params, parent) => {
26
- const blog = await client.content.blog(params);
25
+ const generateOpinlyMetadata = async (client, params, parent) => {
26
+ const blog = await client.content.blog({ params: await params });
27
27
  if (blog.type === "not-found") {
28
28
  return parent;
29
29
  }
30
30
  const previousImages = (await parent).openGraph?.images || [];
31
31
  if (blog.type === "post") {
32
32
  const openGraphImageKey = blog.data?.titleFile?.fileKey;
33
- const images = openGraphImageKey ? [`${import_sdk_config.opinlyConfig.imagesUrl}/${openGraphImageKey}`, ...previousImages] : previousImages;
33
+ const images = openGraphImageKey ? [`${import_sdk_config.opinlyConfig.imagesPrefix}/${openGraphImageKey}`, ...previousImages] : previousImages;
34
34
  return {
35
35
  ...parent,
36
36
  title: blog.data.title,
37
+ description: blog.data.description,
37
38
  openGraph: {
38
39
  images,
39
40
  type: "article",
40
41
  authors: blog.data.author && [
41
- `${import_sdk_config.opinlyConfig.blogUrl}/authors/${blog.data.author.slug}`
42
- ]
42
+ `${import_sdk_config.opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`
43
+ ],
44
+ title: blog.data.title
43
45
  },
44
46
  // keywords: [blog.data.keywords],
45
47
  authors: blog.data.author && [
46
48
  {
47
49
  name: blog.data.author.name,
48
- url: `${import_sdk_config.opinlyConfig.blogUrl}/authors/${blog.data.author.slug}`
50
+ url: `${import_sdk_config.opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`
49
51
  }
50
52
  ],
51
53
  other: {}
@@ -55,6 +57,6 @@ const generateMetadata = async (client, params, parent) => {
55
57
  };
56
58
  // Annotate the CommonJS export names for ESM import in node:
57
59
  0 && (module.exports = {
58
- generateMetadata
60
+ generateOpinlyMetadata
59
61
  });
60
62
  //# sourceMappingURL=generate-metadata.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/generate-metadata.ts"],"sourcesContent":["import { Opinly, OpinlyPageProps } from \"@opinly/backend\";\nimport type { Metadata, ResolvingMetadata } from \"next\";\nimport { opinlyConfig } from \"./sdk-config\";\n\nexport const generateMetadata = async (\n client: Opinly,\n params: OpinlyPageProps,\n parent: ResolvingMetadata\n): Promise<Metadata> => {\n const blog = await client.content.blog(params);\n\n if (blog.type === \"not-found\") {\n return parent as Metadata;\n }\n\n const previousImages = (await parent).openGraph?.images || [];\n\n if (blog.type === \"post\") {\n const openGraphImageKey = blog.data?.titleFile?.fileKey;\n\n const images = openGraphImageKey\n ? [`${opinlyConfig.imagesUrl}/${openGraphImageKey}`, ...previousImages]\n : previousImages;\n\n return {\n ...(parent as Metadata),\n title: blog.data.title,\n\n openGraph: {\n images: images,\n type: \"article\",\n authors: blog.data.author && [\n `${opinlyConfig.blogUrl}/authors/${blog.data.author.slug}`,\n ],\n },\n\n // keywords: [blog.data.keywords],\n authors: blog.data.author && [\n {\n name: blog.data.author.name,\n url: `${opinlyConfig.blogUrl}/authors/${blog.data.author.slug}`,\n },\n ],\n other: {},\n };\n }\n\n return parent as Metadata;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAA6B;AAEtB,MAAM,mBAAmB,OAC9B,QACA,QACA,WACsB;AACtB,QAAM,OAAO,MAAM,OAAO,QAAQ,KAAK,MAAM;AAE7C,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM,QAAQ,WAAW,UAAU,CAAC;AAE5D,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,oBAAoB,KAAK,MAAM,WAAW;AAEhD,UAAM,SAAS,oBACX,CAAC,GAAG,+BAAa,SAAS,IAAI,iBAAiB,IAAI,GAAG,cAAc,IACpE;AAEJ,WAAO;AAAA,MACL,GAAI;AAAA,MACJ,OAAO,KAAK,KAAK;AAAA,MAEjB,WAAW;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QACN,SAAS,KAAK,KAAK,UAAU;AAAA,UAC3B,GAAG,+BAAa,OAAO,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,QAC1D;AAAA,MACF;AAAA;AAAA,MAGA,SAAS,KAAK,KAAK,UAAU;AAAA,QAC3B;AAAA,UACE,MAAM,KAAK,KAAK,OAAO;AAAA,UACvB,KAAK,GAAG,+BAAa,OAAO,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,QAC/D;AAAA,MACF;AAAA,MACA,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/generate-metadata.ts"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport type { Metadata, ResolvingMetadata } from \"next\";\nimport { opinlyConfig } from \"./sdk-config\";\n\nexport const generateOpinlyMetadata = async (\n client: Opinly,\n params: Promise<{\n slug: string[];\n }>,\n parent: ResolvingMetadata\n): Promise<Metadata> => {\n const blog = await client.content.blog({ params: await params });\n\n if (blog.type === \"not-found\") {\n return parent as Metadata;\n }\n\n const previousImages = (await parent).openGraph?.images || [];\n\n if (blog.type === \"post\") {\n const openGraphImageKey = blog.data?.titleFile?.fileKey;\n\n const images = openGraphImageKey\n ? [`${opinlyConfig.imagesPrefix}/${openGraphImageKey}`, ...previousImages]\n : previousImages;\n\n return {\n ...(parent as Metadata),\n title: blog.data.title,\n description: blog.data.description,\n openGraph: {\n images: images,\n type: \"article\",\n authors: blog.data.author && [\n `${opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`,\n ],\n title: blog.data.title,\n },\n // keywords: [blog.data.keywords],\n\n authors: blog.data.author && [\n {\n name: blog.data.author.name,\n url: `${opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`,\n },\n ],\n other: {},\n };\n }\n\n return parent as Metadata;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAA6B;AAEtB,MAAM,yBAAyB,OACpC,QACA,QAGA,WACsB;AACtB,QAAM,OAAO,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,MAAM,OAAO,CAAC;AAE/D,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM,QAAQ,WAAW,UAAU,CAAC;AAE5D,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,oBAAoB,KAAK,MAAM,WAAW;AAEhD,UAAM,SAAS,oBACX,CAAC,GAAG,+BAAa,YAAY,IAAI,iBAAiB,IAAI,GAAG,cAAc,IACvE;AAEJ,WAAO;AAAA,MACL,GAAI;AAAA,MACJ,OAAO,KAAK,KAAK;AAAA,MACjB,aAAa,KAAK,KAAK;AAAA,MACvB,WAAW;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QACN,SAAS,KAAK,KAAK,UAAU;AAAA,UAC3B,GAAG,+BAAa,YAAY,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,QAC/D;AAAA,QACA,OAAO,KAAK,KAAK;AAAA,MACnB;AAAA;AAAA,MAGA,SAAS,KAAK,KAAK,UAAU;AAAA,QAC3B;AAAA,UACE,MAAM,KAAK,KAAK,OAAO;AAAA,UACvB,KAAK,GAAG,+BAAa,YAAY,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,QACpE;AAAA,MACF;AAAA,MACA,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -1,6 +1,8 @@
1
- import { Opinly, OpinlyPageProps } from '@opinly/backend';
1
+ import { Opinly } from '@opinly/backend';
2
2
  import { ResolvingMetadata, Metadata } from 'next';
3
3
 
4
- declare const generateMetadata: (client: Opinly, params: OpinlyPageProps, parent: ResolvingMetadata) => Promise<Metadata>;
4
+ declare const generateOpinlyMetadata: (client: Opinly, params: Promise<{
5
+ slug: string[];
6
+ }>, parent: ResolvingMetadata) => Promise<Metadata>;
5
7
 
6
- export { generateMetadata };
8
+ export { generateOpinlyMetadata };
@@ -1,6 +1,8 @@
1
- import { Opinly, OpinlyPageProps } from '@opinly/backend';
1
+ import { Opinly } from '@opinly/backend';
2
2
  import { ResolvingMetadata, Metadata } from 'next';
3
3
 
4
- declare const generateMetadata: (client: Opinly, params: OpinlyPageProps, parent: ResolvingMetadata) => Promise<Metadata>;
4
+ declare const generateOpinlyMetadata: (client: Opinly, params: Promise<{
5
+ slug: string[];
6
+ }>, parent: ResolvingMetadata) => Promise<Metadata>;
5
7
 
6
- export { generateMetadata };
8
+ export { generateOpinlyMetadata };
@@ -1,28 +1,30 @@
1
1
  import { opinlyConfig } from "./sdk-config";
2
- const generateMetadata = async (client, params, parent) => {
3
- const blog = await client.content.blog(params);
2
+ const generateOpinlyMetadata = async (client, params, parent) => {
3
+ const blog = await client.content.blog({ params: await params });
4
4
  if (blog.type === "not-found") {
5
5
  return parent;
6
6
  }
7
7
  const previousImages = (await parent).openGraph?.images || [];
8
8
  if (blog.type === "post") {
9
9
  const openGraphImageKey = blog.data?.titleFile?.fileKey;
10
- const images = openGraphImageKey ? [`${opinlyConfig.imagesUrl}/${openGraphImageKey}`, ...previousImages] : previousImages;
10
+ const images = openGraphImageKey ? [`${opinlyConfig.imagesPrefix}/${openGraphImageKey}`, ...previousImages] : previousImages;
11
11
  return {
12
12
  ...parent,
13
13
  title: blog.data.title,
14
+ description: blog.data.description,
14
15
  openGraph: {
15
16
  images,
16
17
  type: "article",
17
18
  authors: blog.data.author && [
18
- `${opinlyConfig.blogUrl}/authors/${blog.data.author.slug}`
19
- ]
19
+ `${opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`
20
+ ],
21
+ title: blog.data.title
20
22
  },
21
23
  // keywords: [blog.data.keywords],
22
24
  authors: blog.data.author && [
23
25
  {
24
26
  name: blog.data.author.name,
25
- url: `${opinlyConfig.blogUrl}/authors/${blog.data.author.slug}`
27
+ url: `${opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`
26
28
  }
27
29
  ],
28
30
  other: {}
@@ -31,6 +33,6 @@ const generateMetadata = async (client, params, parent) => {
31
33
  return parent;
32
34
  };
33
35
  export {
34
- generateMetadata
36
+ generateOpinlyMetadata
35
37
  };
36
38
  //# sourceMappingURL=generate-metadata.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/generate-metadata.ts"],"sourcesContent":["import { Opinly, OpinlyPageProps } from \"@opinly/backend\";\nimport type { Metadata, ResolvingMetadata } from \"next\";\nimport { opinlyConfig } from \"./sdk-config\";\n\nexport const generateMetadata = async (\n client: Opinly,\n params: OpinlyPageProps,\n parent: ResolvingMetadata\n): Promise<Metadata> => {\n const blog = await client.content.blog(params);\n\n if (blog.type === \"not-found\") {\n return parent as Metadata;\n }\n\n const previousImages = (await parent).openGraph?.images || [];\n\n if (blog.type === \"post\") {\n const openGraphImageKey = blog.data?.titleFile?.fileKey;\n\n const images = openGraphImageKey\n ? [`${opinlyConfig.imagesUrl}/${openGraphImageKey}`, ...previousImages]\n : previousImages;\n\n return {\n ...(parent as Metadata),\n title: blog.data.title,\n\n openGraph: {\n images: images,\n type: \"article\",\n authors: blog.data.author && [\n `${opinlyConfig.blogUrl}/authors/${blog.data.author.slug}`,\n ],\n },\n\n // keywords: [blog.data.keywords],\n authors: blog.data.author && [\n {\n name: blog.data.author.name,\n url: `${opinlyConfig.blogUrl}/authors/${blog.data.author.slug}`,\n },\n ],\n other: {},\n };\n }\n\n return parent as Metadata;\n};\n"],"mappings":"AAEA,SAAS,oBAAoB;AAEtB,MAAM,mBAAmB,OAC9B,QACA,QACA,WACsB;AACtB,QAAM,OAAO,MAAM,OAAO,QAAQ,KAAK,MAAM;AAE7C,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM,QAAQ,WAAW,UAAU,CAAC;AAE5D,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,oBAAoB,KAAK,MAAM,WAAW;AAEhD,UAAM,SAAS,oBACX,CAAC,GAAG,aAAa,SAAS,IAAI,iBAAiB,IAAI,GAAG,cAAc,IACpE;AAEJ,WAAO;AAAA,MACL,GAAI;AAAA,MACJ,OAAO,KAAK,KAAK;AAAA,MAEjB,WAAW;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QACN,SAAS,KAAK,KAAK,UAAU;AAAA,UAC3B,GAAG,aAAa,OAAO,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,QAC1D;AAAA,MACF;AAAA;AAAA,MAGA,SAAS,KAAK,KAAK,UAAU;AAAA,QAC3B;AAAA,UACE,MAAM,KAAK,KAAK,OAAO;AAAA,UACvB,KAAK,GAAG,aAAa,OAAO,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,QAC/D;AAAA,MACF;AAAA,MACA,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/generate-metadata.ts"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport type { Metadata, ResolvingMetadata } from \"next\";\nimport { opinlyConfig } from \"./sdk-config\";\n\nexport const generateOpinlyMetadata = async (\n client: Opinly,\n params: Promise<{\n slug: string[];\n }>,\n parent: ResolvingMetadata\n): Promise<Metadata> => {\n const blog = await client.content.blog({ params: await params });\n\n if (blog.type === \"not-found\") {\n return parent as Metadata;\n }\n\n const previousImages = (await parent).openGraph?.images || [];\n\n if (blog.type === \"post\") {\n const openGraphImageKey = blog.data?.titleFile?.fileKey;\n\n const images = openGraphImageKey\n ? [`${opinlyConfig.imagesPrefix}/${openGraphImageKey}`, ...previousImages]\n : previousImages;\n\n return {\n ...(parent as Metadata),\n title: blog.data.title,\n description: blog.data.description,\n openGraph: {\n images: images,\n type: \"article\",\n authors: blog.data.author && [\n `${opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`,\n ],\n title: blog.data.title,\n },\n // keywords: [blog.data.keywords],\n\n authors: blog.data.author && [\n {\n name: blog.data.author.name,\n url: `${opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`,\n },\n ],\n other: {},\n };\n }\n\n return parent as Metadata;\n};\n"],"mappings":"AAEA,SAAS,oBAAoB;AAEtB,MAAM,yBAAyB,OACpC,QACA,QAGA,WACsB;AACtB,QAAM,OAAO,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,MAAM,OAAO,CAAC;AAE/D,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM,QAAQ,WAAW,UAAU,CAAC;AAE5D,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,oBAAoB,KAAK,MAAM,WAAW;AAEhD,UAAM,SAAS,oBACX,CAAC,GAAG,aAAa,YAAY,IAAI,iBAAiB,IAAI,GAAG,cAAc,IACvE;AAEJ,WAAO;AAAA,MACL,GAAI;AAAA,MACJ,OAAO,KAAK,KAAK;AAAA,MACjB,aAAa,KAAK,KAAK;AAAA,MACvB,WAAW;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QACN,SAAS,KAAK,KAAK,UAAU;AAAA,UAC3B,GAAG,aAAa,YAAY,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,QAC/D;AAAA,QACA,OAAO,KAAK,KAAK;AAAA,MACnB;AAAA;AAAA,MAGA,SAAS,KAAK,KAAK,UAAU;AAAA,QAC3B;AAAA,UACE,MAAM,KAAK,KAAK,OAAO;AAAA,UACvB,KAAK,GAAG,aAAa,YAAY,YAAY,KAAK,KAAK,OAAO,IAAI;AAAA,QACpE;AAAA,MACF;AAAA,MACA,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -28,7 +28,8 @@ const opinlyEnvVars = {
28
28
  OPINLY_SITE_URL: process.env.OPINLY_SITE_URL,
29
29
  OPINLY_BLOG_PREFIX: process.env.OPINLY_BLOG_PREFIX,
30
30
  OPINLY_CDN_URL: process.env.OPINLY_CDN_URL,
31
- OPINLY_SITE_NAME: process.env.OPINLY_SITE_NAME
31
+ OPINLY_SITE_NAME: process.env.OPINLY_SITE_NAME,
32
+ OPINLY_UNOPTIMIZED_IMAGES: process.env.OPINLY_UNOPTIMIZED_IMAGES
32
33
  };
33
34
  Object.entries(opinlyEnvVars).forEach(([key, value]) => {
34
35
  if (!value) {
@@ -42,7 +43,8 @@ let opinlyConfig = {
42
43
  imagesUrl: `${process.env.OPINLY_SITE_URL}${process.env.OPINLY_IMAGES_PREFIX}`,
43
44
  blogPrefix: process.env.OPINLY_BLOG_PREFIX,
44
45
  blogUrl: `${process.env.OPINLY_SITE_URL}${process.env.OPINLY_BLOG_PREFIX}`,
45
- siteName: process.env.OPINLY_SITE_NAME
46
+ siteName: process.env.OPINLY_SITE_NAME,
47
+ unoptimizedImages: process.env.OPINLY_UNOPTIMIZED_IMAGES === "true"
46
48
  };
47
49
  function setOpinlyConfig(newConfig) {
48
50
  opinlyConfig = { ...opinlyConfig, ...newConfig };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/sdk-config.ts"],"sourcesContent":["const siteUrl = process.env.OPINLY_SITE_URL;\n\nconst opinlyEnvVars = {\n OPINLY_IMAGES_PREFIX: process.env.OPINLY_IMAGES_PREFIX as string,\n OPINLY_SITE_URL: process.env.OPINLY_SITE_URL as string,\n OPINLY_BLOG_PREFIX: process.env.OPINLY_BLOG_PREFIX as string,\n OPINLY_CDN_URL: process.env.OPINLY_CDN_URL as string,\n OPINLY_SITE_NAME: process.env.OPINLY_SITE_NAME as string,\n};\n\nObject.entries(opinlyEnvVars).forEach(([key, value]) => {\n if (!value) {\n throw new Error(`OPINLY ERROR: env var ${key} is not set`);\n }\n});\n\nexport let opinlyConfig: {\n cdnUrl: string;\n imagesPrefix: string;\n imagesUrl: string;\n siteUrl: string;\n blogPrefix: string;\n blogUrl: string;\n siteName: string;\n} = {\n cdnUrl: process.env.OPINLY_CDN_URL || \"https://cdn.opinly.ai\",\n siteUrl: process.env.OPINLY_SITE_URL as string,\n imagesPrefix: process.env.OPINLY_IMAGES_PREFIX as string,\n imagesUrl: `${process.env.OPINLY_SITE_URL as string}${process.env.OPINLY_IMAGES_PREFIX as string}`,\n blogPrefix: process.env.OPINLY_BLOG_PREFIX as string,\n blogUrl: `${process.env.OPINLY_SITE_URL as string}${process.env.OPINLY_BLOG_PREFIX as string}`,\n siteName: process.env.OPINLY_SITE_NAME as string,\n};\n\nexport function setOpinlyConfig(newConfig: typeof opinlyConfig) {\n opinlyConfig = { ...opinlyConfig, ...newConfig };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,UAAU,QAAQ,IAAI;AAE5B,MAAM,gBAAgB;AAAA,EACpB,sBAAsB,QAAQ,IAAI;AAAA,EAClC,iBAAiB,QAAQ,IAAI;AAAA,EAC7B,oBAAoB,QAAQ,IAAI;AAAA,EAChC,gBAAgB,QAAQ,IAAI;AAAA,EAC5B,kBAAkB,QAAQ,IAAI;AAChC;AAEA,OAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACtD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB,GAAG,aAAa;AAAA,EAC3D;AACF,CAAC;AAEM,IAAI,eAQP;AAAA,EACF,QAAQ,QAAQ,IAAI,kBAAkB;AAAA,EACtC,SAAS,QAAQ,IAAI;AAAA,EACrB,cAAc,QAAQ,IAAI;AAAA,EAC1B,WAAW,GAAG,QAAQ,IAAI,eAAyB,GAAG,QAAQ,IAAI,oBAA8B;AAAA,EAChG,YAAY,QAAQ,IAAI;AAAA,EACxB,SAAS,GAAG,QAAQ,IAAI,eAAyB,GAAG,QAAQ,IAAI,kBAA4B;AAAA,EAC5F,UAAU,QAAQ,IAAI;AACxB;AAEO,SAAS,gBAAgB,WAAgC;AAC9D,iBAAe,EAAE,GAAG,cAAc,GAAG,UAAU;AACjD;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/sdk-config.ts"],"sourcesContent":["const siteUrl = process.env.OPINLY_SITE_URL;\n\nconst opinlyEnvVars = {\n OPINLY_IMAGES_PREFIX: process.env.OPINLY_IMAGES_PREFIX as string,\n OPINLY_SITE_URL: process.env.OPINLY_SITE_URL as string,\n OPINLY_BLOG_PREFIX: process.env.OPINLY_BLOG_PREFIX as string,\n OPINLY_CDN_URL: process.env.OPINLY_CDN_URL as string,\n OPINLY_SITE_NAME: process.env.OPINLY_SITE_NAME as string,\n OPINLY_UNOPTIMIZED_IMAGES: process.env.OPINLY_UNOPTIMIZED_IMAGES as string,\n};\n\nObject.entries(opinlyEnvVars).forEach(([key, value]) => {\n if (!value) {\n throw new Error(`OPINLY ERROR: env var ${key} is not set`);\n }\n});\n\nexport let opinlyConfig: {\n cdnUrl: string;\n imagesPrefix: string;\n imagesUrl: string;\n siteUrl: string;\n blogPrefix: string;\n blogUrl: string;\n siteName: string;\n unoptimizedImages: boolean;\n} = {\n cdnUrl: process.env.OPINLY_CDN_URL || \"https://cdn.opinly.ai\",\n siteUrl: process.env.OPINLY_SITE_URL as string,\n imagesPrefix: process.env.OPINLY_IMAGES_PREFIX as string,\n imagesUrl: `${process.env.OPINLY_SITE_URL as string}${process.env.OPINLY_IMAGES_PREFIX as string}`,\n blogPrefix: process.env.OPINLY_BLOG_PREFIX as string,\n blogUrl: `${process.env.OPINLY_SITE_URL as string}${process.env.OPINLY_BLOG_PREFIX as string}`,\n siteName: process.env.OPINLY_SITE_NAME as string,\n unoptimizedImages: process.env.OPINLY_UNOPTIMIZED_IMAGES === \"true\",\n};\n\nexport function setOpinlyConfig(newConfig: typeof opinlyConfig) {\n opinlyConfig = { ...opinlyConfig, ...newConfig };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,UAAU,QAAQ,IAAI;AAE5B,MAAM,gBAAgB;AAAA,EACpB,sBAAsB,QAAQ,IAAI;AAAA,EAClC,iBAAiB,QAAQ,IAAI;AAAA,EAC7B,oBAAoB,QAAQ,IAAI;AAAA,EAChC,gBAAgB,QAAQ,IAAI;AAAA,EAC5B,kBAAkB,QAAQ,IAAI;AAAA,EAC9B,2BAA2B,QAAQ,IAAI;AACzC;AAEA,OAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACtD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB,GAAG,aAAa;AAAA,EAC3D;AACF,CAAC;AAEM,IAAI,eASP;AAAA,EACF,QAAQ,QAAQ,IAAI,kBAAkB;AAAA,EACtC,SAAS,QAAQ,IAAI;AAAA,EACrB,cAAc,QAAQ,IAAI;AAAA,EAC1B,WAAW,GAAG,QAAQ,IAAI,eAAyB,GAAG,QAAQ,IAAI,oBAA8B;AAAA,EAChG,YAAY,QAAQ,IAAI;AAAA,EACxB,SAAS,GAAG,QAAQ,IAAI,eAAyB,GAAG,QAAQ,IAAI,kBAA4B;AAAA,EAC5F,UAAU,QAAQ,IAAI;AAAA,EACtB,mBAAmB,QAAQ,IAAI,8BAA8B;AAC/D;AAEO,SAAS,gBAAgB,WAAgC;AAC9D,iBAAe,EAAE,GAAG,cAAc,GAAG,UAAU;AACjD;","names":[]}
@@ -6,6 +6,7 @@ declare let opinlyConfig: {
6
6
  blogPrefix: string;
7
7
  blogUrl: string;
8
8
  siteName: string;
9
+ unoptimizedImages: boolean;
9
10
  };
10
11
  declare function setOpinlyConfig(newConfig: typeof opinlyConfig): void;
11
12
 
@@ -6,6 +6,7 @@ declare let opinlyConfig: {
6
6
  blogPrefix: string;
7
7
  blogUrl: string;
8
8
  siteName: string;
9
+ unoptimizedImages: boolean;
9
10
  };
10
11
  declare function setOpinlyConfig(newConfig: typeof opinlyConfig): void;
11
12
 
@@ -4,7 +4,8 @@ const opinlyEnvVars = {
4
4
  OPINLY_SITE_URL: process.env.OPINLY_SITE_URL,
5
5
  OPINLY_BLOG_PREFIX: process.env.OPINLY_BLOG_PREFIX,
6
6
  OPINLY_CDN_URL: process.env.OPINLY_CDN_URL,
7
- OPINLY_SITE_NAME: process.env.OPINLY_SITE_NAME
7
+ OPINLY_SITE_NAME: process.env.OPINLY_SITE_NAME,
8
+ OPINLY_UNOPTIMIZED_IMAGES: process.env.OPINLY_UNOPTIMIZED_IMAGES
8
9
  };
9
10
  Object.entries(opinlyEnvVars).forEach(([key, value]) => {
10
11
  if (!value) {
@@ -18,7 +19,8 @@ let opinlyConfig = {
18
19
  imagesUrl: `${process.env.OPINLY_SITE_URL}${process.env.OPINLY_IMAGES_PREFIX}`,
19
20
  blogPrefix: process.env.OPINLY_BLOG_PREFIX,
20
21
  blogUrl: `${process.env.OPINLY_SITE_URL}${process.env.OPINLY_BLOG_PREFIX}`,
21
- siteName: process.env.OPINLY_SITE_NAME
22
+ siteName: process.env.OPINLY_SITE_NAME,
23
+ unoptimizedImages: process.env.OPINLY_UNOPTIMIZED_IMAGES === "true"
22
24
  };
23
25
  function setOpinlyConfig(newConfig) {
24
26
  opinlyConfig = { ...opinlyConfig, ...newConfig };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/sdk-config.ts"],"sourcesContent":["const siteUrl = process.env.OPINLY_SITE_URL;\n\nconst opinlyEnvVars = {\n OPINLY_IMAGES_PREFIX: process.env.OPINLY_IMAGES_PREFIX as string,\n OPINLY_SITE_URL: process.env.OPINLY_SITE_URL as string,\n OPINLY_BLOG_PREFIX: process.env.OPINLY_BLOG_PREFIX as string,\n OPINLY_CDN_URL: process.env.OPINLY_CDN_URL as string,\n OPINLY_SITE_NAME: process.env.OPINLY_SITE_NAME as string,\n};\n\nObject.entries(opinlyEnvVars).forEach(([key, value]) => {\n if (!value) {\n throw new Error(`OPINLY ERROR: env var ${key} is not set`);\n }\n});\n\nexport let opinlyConfig: {\n cdnUrl: string;\n imagesPrefix: string;\n imagesUrl: string;\n siteUrl: string;\n blogPrefix: string;\n blogUrl: string;\n siteName: string;\n} = {\n cdnUrl: process.env.OPINLY_CDN_URL || \"https://cdn.opinly.ai\",\n siteUrl: process.env.OPINLY_SITE_URL as string,\n imagesPrefix: process.env.OPINLY_IMAGES_PREFIX as string,\n imagesUrl: `${process.env.OPINLY_SITE_URL as string}${process.env.OPINLY_IMAGES_PREFIX as string}`,\n blogPrefix: process.env.OPINLY_BLOG_PREFIX as string,\n blogUrl: `${process.env.OPINLY_SITE_URL as string}${process.env.OPINLY_BLOG_PREFIX as string}`,\n siteName: process.env.OPINLY_SITE_NAME as string,\n};\n\nexport function setOpinlyConfig(newConfig: typeof opinlyConfig) {\n opinlyConfig = { ...opinlyConfig, ...newConfig };\n}\n"],"mappings":"AAAA,MAAM,UAAU,QAAQ,IAAI;AAE5B,MAAM,gBAAgB;AAAA,EACpB,sBAAsB,QAAQ,IAAI;AAAA,EAClC,iBAAiB,QAAQ,IAAI;AAAA,EAC7B,oBAAoB,QAAQ,IAAI;AAAA,EAChC,gBAAgB,QAAQ,IAAI;AAAA,EAC5B,kBAAkB,QAAQ,IAAI;AAChC;AAEA,OAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACtD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB,GAAG,aAAa;AAAA,EAC3D;AACF,CAAC;AAEM,IAAI,eAQP;AAAA,EACF,QAAQ,QAAQ,IAAI,kBAAkB;AAAA,EACtC,SAAS,QAAQ,IAAI;AAAA,EACrB,cAAc,QAAQ,IAAI;AAAA,EAC1B,WAAW,GAAG,QAAQ,IAAI,eAAyB,GAAG,QAAQ,IAAI,oBAA8B;AAAA,EAChG,YAAY,QAAQ,IAAI;AAAA,EACxB,SAAS,GAAG,QAAQ,IAAI,eAAyB,GAAG,QAAQ,IAAI,kBAA4B;AAAA,EAC5F,UAAU,QAAQ,IAAI;AACxB;AAEO,SAAS,gBAAgB,WAAgC;AAC9D,iBAAe,EAAE,GAAG,cAAc,GAAG,UAAU;AACjD;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/sdk-config.ts"],"sourcesContent":["const siteUrl = process.env.OPINLY_SITE_URL;\n\nconst opinlyEnvVars = {\n OPINLY_IMAGES_PREFIX: process.env.OPINLY_IMAGES_PREFIX as string,\n OPINLY_SITE_URL: process.env.OPINLY_SITE_URL as string,\n OPINLY_BLOG_PREFIX: process.env.OPINLY_BLOG_PREFIX as string,\n OPINLY_CDN_URL: process.env.OPINLY_CDN_URL as string,\n OPINLY_SITE_NAME: process.env.OPINLY_SITE_NAME as string,\n OPINLY_UNOPTIMIZED_IMAGES: process.env.OPINLY_UNOPTIMIZED_IMAGES as string,\n};\n\nObject.entries(opinlyEnvVars).forEach(([key, value]) => {\n if (!value) {\n throw new Error(`OPINLY ERROR: env var ${key} is not set`);\n }\n});\n\nexport let opinlyConfig: {\n cdnUrl: string;\n imagesPrefix: string;\n imagesUrl: string;\n siteUrl: string;\n blogPrefix: string;\n blogUrl: string;\n siteName: string;\n unoptimizedImages: boolean;\n} = {\n cdnUrl: process.env.OPINLY_CDN_URL || \"https://cdn.opinly.ai\",\n siteUrl: process.env.OPINLY_SITE_URL as string,\n imagesPrefix: process.env.OPINLY_IMAGES_PREFIX as string,\n imagesUrl: `${process.env.OPINLY_SITE_URL as string}${process.env.OPINLY_IMAGES_PREFIX as string}`,\n blogPrefix: process.env.OPINLY_BLOG_PREFIX as string,\n blogUrl: `${process.env.OPINLY_SITE_URL as string}${process.env.OPINLY_BLOG_PREFIX as string}`,\n siteName: process.env.OPINLY_SITE_NAME as string,\n unoptimizedImages: process.env.OPINLY_UNOPTIMIZED_IMAGES === \"true\",\n};\n\nexport function setOpinlyConfig(newConfig: typeof opinlyConfig) {\n opinlyConfig = { ...opinlyConfig, ...newConfig };\n}\n"],"mappings":"AAAA,MAAM,UAAU,QAAQ,IAAI;AAE5B,MAAM,gBAAgB;AAAA,EACpB,sBAAsB,QAAQ,IAAI;AAAA,EAClC,iBAAiB,QAAQ,IAAI;AAAA,EAC7B,oBAAoB,QAAQ,IAAI;AAAA,EAChC,gBAAgB,QAAQ,IAAI;AAAA,EAC5B,kBAAkB,QAAQ,IAAI;AAAA,EAC9B,2BAA2B,QAAQ,IAAI;AACzC;AAEA,OAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACtD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB,GAAG,aAAa;AAAA,EAC3D;AACF,CAAC;AAEM,IAAI,eASP;AAAA,EACF,QAAQ,QAAQ,IAAI,kBAAkB;AAAA,EACtC,SAAS,QAAQ,IAAI;AAAA,EACrB,cAAc,QAAQ,IAAI;AAAA,EAC1B,WAAW,GAAG,QAAQ,IAAI,eAAyB,GAAG,QAAQ,IAAI,oBAA8B;AAAA,EAChG,YAAY,QAAQ,IAAI;AAAA,EACxB,SAAS,GAAG,QAAQ,IAAI,eAAyB,GAAG,QAAQ,IAAI,kBAA4B;AAAA,EAC5F,UAAU,QAAQ,IAAI;AAAA,EACtB,mBAAmB,QAAQ,IAAI,8BAA8B;AAC/D;AAEO,SAAS,gBAAgB,WAAgC;AAC9D,iBAAe,EAAE,GAAG,cAAc,GAAG,UAAU;AACjD;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opinly/next",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "main": "dist/index.cjs",
@@ -29,7 +29,7 @@
29
29
  "react-syntax-highlighter": "^15.6.1",
30
30
  "schema-dts": "^1.1.5",
31
31
  "tailwind-merge": "^1.14.0",
32
- "@opinly/backend": "0.1.13"
32
+ "@opinly/backend": "0.1.15"
33
33
  },
34
34
  "engines": {
35
35
  "node": ">=16"