@opinly/next 0.1.26 → 1.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/config.cjs +16 -7
  2. package/dist/config.cjs.map +1 -1
  3. package/dist/config.d.cts +7 -2
  4. package/dist/config.d.ts +7 -2
  5. package/dist/config.js +16 -7
  6. package/dist/config.js.map +1 -1
  7. package/dist/index.cjs +33 -3
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +12 -6
  10. package/dist/index.d.ts +12 -6
  11. package/dist/index.js +26 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/json-ld.cjs +61 -0
  14. package/dist/json-ld.cjs.map +1 -0
  15. package/dist/json-ld.d.cts +17 -0
  16. package/dist/json-ld.d.ts +17 -0
  17. package/dist/json-ld.js +38 -0
  18. package/dist/json-ld.js.map +1 -0
  19. package/dist/utils/generate-metadata.cjs +23 -79
  20. package/dist/utils/generate-metadata.cjs.map +1 -1
  21. package/dist/utils/generate-metadata.d.cts +11 -2
  22. package/dist/utils/generate-metadata.d.ts +11 -2
  23. package/dist/utils/generate-metadata.js +23 -79
  24. package/dist/utils/generate-metadata.js.map +1 -1
  25. package/dist/utils/generate-sitemap-xml.cjs.map +1 -1
  26. package/dist/utils/generate-sitemap-xml.d.cts +5 -3
  27. package/dist/utils/generate-sitemap-xml.d.ts +5 -3
  28. package/dist/utils/generate-sitemap-xml.js.map +1 -1
  29. package/dist/utils/sdk-config.cjs +6 -2
  30. package/dist/utils/sdk-config.cjs.map +1 -1
  31. package/dist/utils/sdk-config.d.cts +4 -0
  32. package/dist/utils/sdk-config.d.ts +4 -0
  33. package/dist/utils/sdk-config.js +6 -2
  34. package/dist/utils/sdk-config.js.map +1 -1
  35. package/package.json +6 -20
  36. package/dist/components/author-page/_helpers/json-ld.cjs +0 -44
  37. package/dist/components/author-page/_helpers/json-ld.cjs.map +0 -1
  38. package/dist/components/author-page/_helpers/json-ld.d.cts +0 -8
  39. package/dist/components/author-page/_helpers/json-ld.d.ts +0 -8
  40. package/dist/components/author-page/_helpers/json-ld.js +0 -20
  41. package/dist/components/author-page/_helpers/json-ld.js.map +0 -1
  42. package/dist/components/author-page/index.cjs +0 -104
  43. package/dist/components/author-page/index.cjs.map +0 -1
  44. package/dist/components/author-page/index.d.cts +0 -10
  45. package/dist/components/author-page/index.d.ts +0 -10
  46. package/dist/components/author-page/index.js +0 -70
  47. package/dist/components/author-page/index.js.map +0 -1
  48. package/dist/components/authors-page/_helpers/json-ld.cjs +0 -53
  49. package/dist/components/authors-page/_helpers/json-ld.cjs.map +0 -1
  50. package/dist/components/authors-page/_helpers/json-ld.d.cts +0 -8
  51. package/dist/components/authors-page/_helpers/json-ld.d.ts +0 -8
  52. package/dist/components/authors-page/_helpers/json-ld.js +0 -29
  53. package/dist/components/authors-page/_helpers/json-ld.js.map +0 -1
  54. package/dist/components/authors-page/index.cjs +0 -121
  55. package/dist/components/authors-page/index.cjs.map +0 -1
  56. package/dist/components/authors-page/index.d.cts +0 -10
  57. package/dist/components/authors-page/index.d.ts +0 -10
  58. package/dist/components/authors-page/index.js +0 -87
  59. package/dist/components/authors-page/index.js.map +0 -1
  60. package/dist/components/blog-post/_components/content.cjs +0 -157
  61. package/dist/components/blog-post/_components/content.cjs.map +0 -1
  62. package/dist/components/blog-post/_components/content.d.cts +0 -10
  63. package/dist/components/blog-post/_components/content.d.ts +0 -10
  64. package/dist/components/blog-post/_components/content.js +0 -123
  65. package/dist/components/blog-post/_components/content.js.map +0 -1
  66. package/dist/components/blog-post/_components/faq.cjs +0 -39
  67. package/dist/components/blog-post/_components/faq.cjs.map +0 -1
  68. package/dist/components/blog-post/_components/faq.d.cts +0 -9
  69. package/dist/components/blog-post/_components/faq.d.ts +0 -9
  70. package/dist/components/blog-post/_components/faq.js +0 -15
  71. package/dist/components/blog-post/_components/faq.js.map +0 -1
  72. package/dist/components/blog-post/_components/share.cjs +0 -100
  73. package/dist/components/blog-post/_components/share.cjs.map +0 -1
  74. package/dist/components/blog-post/_components/share.d.cts +0 -9
  75. package/dist/components/blog-post/_components/share.d.ts +0 -9
  76. package/dist/components/blog-post/_components/share.js +0 -66
  77. package/dist/components/blog-post/_components/share.js.map +0 -1
  78. package/dist/components/blog-post/_components/table-of-contents.cjs +0 -111
  79. package/dist/components/blog-post/_components/table-of-contents.cjs.map +0 -1
  80. package/dist/components/blog-post/_components/table-of-contents.d.cts +0 -14
  81. package/dist/components/blog-post/_components/table-of-contents.d.ts +0 -14
  82. package/dist/components/blog-post/_components/table-of-contents.js +0 -77
  83. package/dist/components/blog-post/_components/table-of-contents.js.map +0 -1
  84. package/dist/components/blog-post/_helpers/calc-reading-time.cjs +0 -2
  85. package/dist/components/blog-post/_helpers/calc-reading-time.cjs.map +0 -1
  86. package/dist/components/blog-post/_helpers/calc-reading-time.d.cts +0 -2
  87. package/dist/components/blog-post/_helpers/calc-reading-time.d.ts +0 -2
  88. package/dist/components/blog-post/_helpers/calc-reading-time.js +0 -1
  89. package/dist/components/blog-post/_helpers/calc-reading-time.js.map +0 -1
  90. package/dist/components/blog-post/_helpers/extract-headings.cjs +0 -45
  91. package/dist/components/blog-post/_helpers/extract-headings.cjs.map +0 -1
  92. package/dist/components/blog-post/_helpers/extract-headings.d.cts +0 -9
  93. package/dist/components/blog-post/_helpers/extract-headings.d.ts +0 -9
  94. package/dist/components/blog-post/_helpers/extract-headings.js +0 -21
  95. package/dist/components/blog-post/_helpers/extract-headings.js.map +0 -1
  96. package/dist/components/blog-post/_helpers/json-ld.cjs +0 -162
  97. package/dist/components/blog-post/_helpers/json-ld.cjs.map +0 -1
  98. package/dist/components/blog-post/_helpers/json-ld.d.cts +0 -15
  99. package/dist/components/blog-post/_helpers/json-ld.d.ts +0 -15
  100. package/dist/components/blog-post/_helpers/json-ld.js +0 -135
  101. package/dist/components/blog-post/_helpers/json-ld.js.map +0 -1
  102. package/dist/components/blog-post/_helpers/reading-time.cjs +0 -50
  103. package/dist/components/blog-post/_helpers/reading-time.cjs.map +0 -1
  104. package/dist/components/blog-post/_helpers/reading-time.d.cts +0 -6
  105. package/dist/components/blog-post/_helpers/reading-time.d.ts +0 -6
  106. package/dist/components/blog-post/_helpers/reading-time.js +0 -25
  107. package/dist/components/blog-post/_helpers/reading-time.js.map +0 -1
  108. package/dist/components/blog-post/_types/blog-post.cjs +0 -17
  109. package/dist/components/blog-post/_types/blog-post.cjs.map +0 -1
  110. package/dist/components/blog-post/_types/blog-post.d.cts +0 -7
  111. package/dist/components/blog-post/_types/blog-post.d.ts +0 -7
  112. package/dist/components/blog-post/_types/blog-post.js +0 -1
  113. package/dist/components/blog-post/_types/blog-post.js.map +0 -1
  114. package/dist/components/blog-post/_types/class-names.cjs +0 -17
  115. package/dist/components/blog-post/_types/class-names.cjs.map +0 -1
  116. package/dist/components/blog-post/_types/class-names.d.cts +0 -12
  117. package/dist/components/blog-post/_types/class-names.d.ts +0 -12
  118. package/dist/components/blog-post/_types/class-names.js +0 -1
  119. package/dist/components/blog-post/_types/class-names.js.map +0 -1
  120. package/dist/components/blog-post/index.cjs +0 -133
  121. package/dist/components/blog-post/index.cjs.map +0 -1
  122. package/dist/components/blog-post/index.d.cts +0 -15
  123. package/dist/components/blog-post/index.d.ts +0 -15
  124. package/dist/components/blog-post/index.js +0 -99
  125. package/dist/components/blog-post/index.js.map +0 -1
  126. package/dist/components/bread-crumbs.cjs +0 -60
  127. package/dist/components/bread-crumbs.cjs.map +0 -1
  128. package/dist/components/bread-crumbs.d.cts +0 -10
  129. package/dist/components/bread-crumbs.d.ts +0 -10
  130. package/dist/components/bread-crumbs.js +0 -26
  131. package/dist/components/bread-crumbs.js.map +0 -1
  132. package/dist/components/folder-page/_helpers/json-ld.cjs +0 -43
  133. package/dist/components/folder-page/_helpers/json-ld.cjs.map +0 -1
  134. package/dist/components/folder-page/_helpers/json-ld.d.cts +0 -8
  135. package/dist/components/folder-page/_helpers/json-ld.d.ts +0 -8
  136. package/dist/components/folder-page/_helpers/json-ld.js +0 -19
  137. package/dist/components/folder-page/_helpers/json-ld.js.map +0 -1
  138. package/dist/components/folder-page/index.cjs +0 -84
  139. package/dist/components/folder-page/index.cjs.map +0 -1
  140. package/dist/components/folder-page/index.d.cts +0 -10
  141. package/dist/components/folder-page/index.d.ts +0 -10
  142. package/dist/components/folder-page/index.js +0 -60
  143. package/dist/components/folder-page/index.js.map +0 -1
  144. package/dist/components/home-page/_helpers/json-ld.cjs +0 -43
  145. package/dist/components/home-page/_helpers/json-ld.cjs.map +0 -1
  146. package/dist/components/home-page/_helpers/json-ld.d.cts +0 -3
  147. package/dist/components/home-page/_helpers/json-ld.d.ts +0 -3
  148. package/dist/components/home-page/_helpers/json-ld.js +0 -19
  149. package/dist/components/home-page/_helpers/json-ld.js.map +0 -1
  150. package/dist/components/home-page/folders.cjs +0 -108
  151. package/dist/components/home-page/folders.cjs.map +0 -1
  152. package/dist/components/home-page/folders.d.cts +0 -11
  153. package/dist/components/home-page/folders.d.ts +0 -11
  154. package/dist/components/home-page/folders.js +0 -73
  155. package/dist/components/home-page/folders.js.map +0 -1
  156. package/dist/components/home-page/index.cjs +0 -50
  157. package/dist/components/home-page/index.cjs.map +0 -1
  158. package/dist/components/home-page/index.d.cts +0 -14
  159. package/dist/components/home-page/index.d.ts +0 -14
  160. package/dist/components/home-page/index.js +0 -26
  161. package/dist/components/home-page/index.js.map +0 -1
  162. package/dist/components/home-page/pagination.cjs +0 -97
  163. package/dist/components/home-page/pagination.cjs.map +0 -1
  164. package/dist/components/home-page/pagination.d.cts +0 -9
  165. package/dist/components/home-page/pagination.d.ts +0 -9
  166. package/dist/components/home-page/pagination.js +0 -63
  167. package/dist/components/home-page/pagination.js.map +0 -1
  168. package/dist/components/home-page/top-posts.cjs +0 -35
  169. package/dist/components/home-page/top-posts.cjs.map +0 -1
  170. package/dist/components/home-page/top-posts.d.cts +0 -10
  171. package/dist/components/home-page/top-posts.d.ts +0 -10
  172. package/dist/components/home-page/top-posts.js +0 -11
  173. package/dist/components/home-page/top-posts.js.map +0 -1
  174. package/dist/components/json-ld.cjs +0 -92
  175. package/dist/components/json-ld.cjs.map +0 -1
  176. package/dist/components/json-ld.d.cts +0 -13
  177. package/dist/components/json-ld.d.ts +0 -13
  178. package/dist/components/json-ld.js +0 -57
  179. package/dist/components/json-ld.js.map +0 -1
  180. package/dist/components/opinly-blog.cjs +0 -57
  181. package/dist/components/opinly-blog.cjs.map +0 -1
  182. package/dist/components/opinly-blog.d.cts +0 -15
  183. package/dist/components/opinly-blog.d.ts +0 -15
  184. package/dist/components/opinly-blog.js +0 -33
  185. package/dist/components/opinly-blog.js.map +0 -1
  186. package/dist/components/post-preview.cjs +0 -114
  187. package/dist/components/post-preview.cjs.map +0 -1
  188. package/dist/components/post-preview.d.cts +0 -10
  189. package/dist/components/post-preview.d.ts +0 -10
  190. package/dist/components/post-preview.js +0 -79
  191. package/dist/components/post-preview.js.map +0 -1
  192. package/dist/pages/index.cjs +0 -23
  193. package/dist/pages/index.cjs.map +0 -1
  194. package/dist/pages/index.d.cts +0 -3
  195. package/dist/pages/index.d.ts +0 -3
  196. package/dist/pages/index.js +0 -2
  197. package/dist/pages/index.js.map +0 -1
  198. package/dist/pages/opinly-blog-pages.cjs +0 -127
  199. package/dist/pages/opinly-blog-pages.cjs.map +0 -1
  200. package/dist/pages/opinly-blog-pages.d.cts +0 -9
  201. package/dist/pages/opinly-blog-pages.d.ts +0 -9
  202. package/dist/pages/opinly-blog-pages.js +0 -103
  203. package/dist/pages/opinly-blog-pages.js.map +0 -1
  204. package/dist/utils/json-ld.cjs +0 -2
  205. package/dist/utils/json-ld.cjs.map +0 -1
  206. package/dist/utils/json-ld.d.cts +0 -2
  207. package/dist/utils/json-ld.d.ts +0 -2
  208. package/dist/utils/json-ld.js +0 -1
  209. package/dist/utils/json-ld.js.map +0 -1
package/dist/config.cjs CHANGED
@@ -41,6 +41,8 @@ const opinlyOptionsSchema = import_zod.z.object({
41
41
  message: "siteUrl must be a valid URL"
42
42
  }),
43
43
  unoptimizedImages: import_zod.z.boolean().optional(),
44
+ categoryPrefix: import_zod.z.string().optional(),
45
+ authorPrefix: import_zod.z.string().optional(),
44
46
  cdnDomain: import_zod.z.string({
45
47
  description: "INTERNAL USE ONLY: The domain of the CDN. If not provided, the default domain will be used."
46
48
  }).url({
@@ -103,19 +105,26 @@ function addEnvVars(userNextConfig, opinlyOptions) {
103
105
  OPINLY_SITE_NAME: opinlyOptions.companyName,
104
106
  OPINLY_SITE_URL: opinlyOptions.siteUrl,
105
107
  OPINLY_UNOPTIMIZED_IMAGES: opinlyOptions.unoptimizedImages ? "true" : void 0,
106
- OPINLY_PAGES_ROUTER: opinlyOptions.pagesRouter ? "true" : void 0
108
+ OPINLY_PAGES_ROUTER: opinlyOptions.pagesRouter ? "true" : void 0,
109
+ OPINLY_CATEGORY_PREFIX: opinlyOptions.categoryPrefix,
110
+ OPINLY_AUTHOR_PREFIX: opinlyOptions.authorPrefix
107
111
  };
108
112
  userNextConfig.env = {
109
113
  ...userNextConfig.env || {},
110
114
  ...opinlyEnvVars
111
115
  };
112
116
  }
113
- const withOpinlyConfig = (opinlyOptions) => (nextConfig) => {
114
- validateOpinlyOptions(opinlyOptions);
115
- addEnvVars(nextConfig, opinlyOptions);
116
- processRewrites(nextConfig, opinlyOptions);
117
- return nextConfig;
118
- };
117
+ const withOpinlyConfig = (opinlyOptions) => (
118
+ // Generic over the config type so this composes with any Next version's
119
+ // `NextConfig` (the consumer's next may differ from the one this package was
120
+ // built against). We only read/write `env` and `rewrites` internally.
121
+ (nextConfig) => {
122
+ validateOpinlyOptions(opinlyOptions);
123
+ addEnvVars(nextConfig, opinlyOptions);
124
+ processRewrites(nextConfig, opinlyOptions);
125
+ return nextConfig;
126
+ }
127
+ );
119
128
  // Annotate the CommonJS export names for ESM import in node:
120
129
  0 && (module.exports = {
121
130
  withOpinlyConfig
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { NextConfig } from \"next\";\nimport { Rewrite } from \"next/dist/lib/load-custom-routes\";\nimport type { OpinlyEnvVars } from \"./utils/sdk-config\";\nimport { z } from \"zod\";\n\ninterface WithOpinlyOptions {\n imagesPath: `/${string}`;\n blogPath: `/${string}`;\n companyName: string;\n cdnNamespace: string;\n siteUrl: string;\n unoptimizedImages?: boolean;\n}\n\ntype ResolvedRewrites = ReturnType<\n NonNullable<Awaited<NextConfig[\"rewrites\"]>>\n>;\n\nconst opinlyOptionsSchema = z.object({\n imagesPath: z\n .string({})\n .refine(\n (val) => val.startsWith(\"/\") || z.string().url().safeParse(val).success,\n {\n message: \"imagesPath must start with a leading slash (e.g. '/images')\",\n }\n ),\n blogPath: z.string({}).startsWith(\"/\", {\n message: \"blogPath must start with a leading slash i.e. `/blog`\",\n }),\n companyName: z.string({\n required_error: \"companyName is required\",\n invalid_type_error: \"companyName must be a string\",\n }),\n cdnNamespace: z\n .string()\n .min(21, \"CDN namespace must be 21 characters long\")\n .max(21, \"CDN namespace must be 21 characters long\"),\n siteUrl: z.string().url({\n message: \"siteUrl must be a valid URL\",\n }),\n unoptimizedImages: z.boolean().optional(),\n cdnDomain: z\n .string({\n description:\n \"INTERNAL USE ONLY: The domain of the CDN. If not provided, the default domain will be used.\",\n })\n .url({\n message: \"cdnDomain must be a valid URL\",\n })\n .optional(),\n pagesRouter: z.boolean().optional(),\n});\n\ntype OpinlyOptions = z.infer<typeof opinlyOptionsSchema>;\n\nconst validateOpinlyOptions = (opinlyOptions: OpinlyOptions) => {\n if (!opinlyOptions) {\n throw new Error(\n \"[@opinly/next] `opts` is required. Please provide the options object.\"\n );\n }\n\n const parsedOpinlyOptions = opinlyOptionsSchema.safeParse(opinlyOptions);\n\n if (!parsedOpinlyOptions.success) {\n throw new Error(\n `[@opinly/next] Invalid options provided in next.config.js: ${parsedOpinlyOptions.error.message}`\n );\n }\n};\n\nconst processRewrites = (\n userNextConfig: NextConfig,\n opinlyOptions: OpinlyOptions\n): void => {\n const imagesPath = opinlyOptions.imagesPath;\n\n if (!imagesPath.startsWith(\"/\")) {\n console.warn(\n `[@opinly/next] You have provided a url for imagesPath. This is only valid for internal testing and rewrites will be skipped.`\n );\n\n return;\n }\n\n const originalRewrites = userNextConfig.rewrites;\n\n userNextConfig.rewrites = async () => {\n const opinlyRewrite = {\n source: `${opinlyOptions.imagesPath}/:path*`,\n destination: `${opinlyOptions.cdnDomain || \"https://cdn.opinly.ai\"}/${\n opinlyOptions.cdnNamespace\n }/:path*`,\n };\n\n const newRewrites = [opinlyRewrite];\n\n if (opinlyOptions.pagesRouter) {\n newRewrites.push({\n source: \"/sitemap.xml\",\n destination: \"/sitemap\",\n });\n }\n\n if (typeof originalRewrites !== \"function\") {\n return newRewrites;\n }\n\n const resolvedRewrites = await originalRewrites();\n\n if (Array.isArray(resolvedRewrites)) {\n return [...resolvedRewrites, opinlyRewrite];\n } else {\n return {\n ...resolvedRewrites,\n beforeFiles: [...(resolvedRewrites.beforeFiles || []), ...newRewrites],\n };\n }\n };\n};\n\nfunction addEnvVars(userNextConfig: NextConfig, opinlyOptions: OpinlyOptions) {\n const opinlyEnvVars: OpinlyEnvVars = {\n OPINLY_IMAGES_PREFIX: opinlyOptions.imagesPath,\n OPINLY_BLOG_PREFIX: opinlyOptions.blogPath,\n OPINLY_SITE_NAME: opinlyOptions.companyName,\n OPINLY_SITE_URL: opinlyOptions.siteUrl,\n OPINLY_UNOPTIMIZED_IMAGES: opinlyOptions.unoptimizedImages\n ? \"true\"\n : undefined,\n OPINLY_PAGES_ROUTER: opinlyOptions.pagesRouter ? \"true\" : undefined,\n };\n\n userNextConfig.env = {\n ...(userNextConfig.env || {}),\n ...opinlyEnvVars,\n };\n}\n\n/**\n * Modifies the passed in Next.js configuration with image rewrites and environment variables.\n *\n * @param nextConfig A Next.js configuration object, as usually exported in `next.config.js` or `next.config.mjs`.\n * @param opinlyOptions Additional options to configure Opinly.\n * @returns The modified config to be exported\n */\nexport const withOpinlyConfig =\n (opinlyOptions: OpinlyOptions) =>\n (nextConfig: NextConfig): NextConfig => {\n validateOpinlyOptions(opinlyOptions);\n\n addEnvVars(nextConfig, opinlyOptions);\n\n processRewrites(nextConfig, opinlyOptions);\n\n return nextConfig;\n };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { NextConfig } from \"next\";\nimport { Rewrite } from \"next/dist/lib/load-custom-routes\";\nimport type { OpinlyEnvVars } from \"./utils/sdk-config\";\nimport { z } from \"zod\";\n\ninterface WithOpinlyOptions {\n imagesPath: `/${string}`;\n blogPath: `/${string}`;\n companyName: string;\n cdnNamespace: string;\n siteUrl: string;\n unoptimizedImages?: boolean;\n /** URL segment categories live under (relative to blogPath). Default: bare. */\n categoryPrefix?: string;\n /** URL segment authors live under (relative to blogPath). Default: \"authors\". */\n authorPrefix?: string;\n}\n\ntype ResolvedRewrites = ReturnType<\n NonNullable<Awaited<NextConfig[\"rewrites\"]>>\n>;\n\nconst opinlyOptionsSchema = z.object({\n imagesPath: z\n .string({})\n .refine(\n (val) => val.startsWith(\"/\") || z.string().url().safeParse(val).success,\n {\n message: \"imagesPath must start with a leading slash (e.g. '/images')\",\n }\n ),\n blogPath: z.string({}).startsWith(\"/\", {\n message: \"blogPath must start with a leading slash i.e. `/blog`\",\n }),\n companyName: z.string({\n required_error: \"companyName is required\",\n invalid_type_error: \"companyName must be a string\",\n }),\n cdnNamespace: z\n .string()\n .min(21, \"CDN namespace must be 21 characters long\")\n .max(21, \"CDN namespace must be 21 characters long\"),\n siteUrl: z.string().url({\n message: \"siteUrl must be a valid URL\",\n }),\n unoptimizedImages: z.boolean().optional(),\n categoryPrefix: z.string().optional(),\n authorPrefix: z.string().optional(),\n cdnDomain: z\n .string({\n description:\n \"INTERNAL USE ONLY: The domain of the CDN. If not provided, the default domain will be used.\",\n })\n .url({\n message: \"cdnDomain must be a valid URL\",\n })\n .optional(),\n pagesRouter: z.boolean().optional(),\n});\n\ntype OpinlyOptions = z.infer<typeof opinlyOptionsSchema>;\n\nconst validateOpinlyOptions = (opinlyOptions: OpinlyOptions) => {\n if (!opinlyOptions) {\n throw new Error(\n \"[@opinly/next] `opts` is required. Please provide the options object.\"\n );\n }\n\n const parsedOpinlyOptions = opinlyOptionsSchema.safeParse(opinlyOptions);\n\n if (!parsedOpinlyOptions.success) {\n throw new Error(\n `[@opinly/next] Invalid options provided in next.config.js: ${parsedOpinlyOptions.error.message}`\n );\n }\n};\n\nconst processRewrites = (\n userNextConfig: NextConfig,\n opinlyOptions: OpinlyOptions\n): void => {\n const imagesPath = opinlyOptions.imagesPath;\n\n if (!imagesPath.startsWith(\"/\")) {\n console.warn(\n `[@opinly/next] You have provided a url for imagesPath. This is only valid for internal testing and rewrites will be skipped.`\n );\n\n return;\n }\n\n const originalRewrites = userNextConfig.rewrites;\n\n userNextConfig.rewrites = async () => {\n const opinlyRewrite = {\n source: `${opinlyOptions.imagesPath}/:path*`,\n destination: `${opinlyOptions.cdnDomain || \"https://cdn.opinly.ai\"}/${\n opinlyOptions.cdnNamespace\n }/:path*`,\n };\n\n const newRewrites = [opinlyRewrite];\n\n if (opinlyOptions.pagesRouter) {\n newRewrites.push({\n source: \"/sitemap.xml\",\n destination: \"/sitemap\",\n });\n }\n\n if (typeof originalRewrites !== \"function\") {\n return newRewrites;\n }\n\n const resolvedRewrites = await originalRewrites();\n\n if (Array.isArray(resolvedRewrites)) {\n return [...resolvedRewrites, opinlyRewrite];\n } else {\n return {\n ...resolvedRewrites,\n beforeFiles: [...(resolvedRewrites.beforeFiles || []), ...newRewrites],\n };\n }\n };\n};\n\nfunction addEnvVars(userNextConfig: NextConfig, opinlyOptions: OpinlyOptions) {\n const opinlyEnvVars: OpinlyEnvVars = {\n OPINLY_IMAGES_PREFIX: opinlyOptions.imagesPath,\n OPINLY_BLOG_PREFIX: opinlyOptions.blogPath,\n OPINLY_SITE_NAME: opinlyOptions.companyName,\n OPINLY_SITE_URL: opinlyOptions.siteUrl,\n OPINLY_UNOPTIMIZED_IMAGES: opinlyOptions.unoptimizedImages\n ? \"true\"\n : undefined,\n OPINLY_PAGES_ROUTER: opinlyOptions.pagesRouter ? \"true\" : undefined,\n OPINLY_CATEGORY_PREFIX: opinlyOptions.categoryPrefix,\n OPINLY_AUTHOR_PREFIX: opinlyOptions.authorPrefix,\n };\n\n userNextConfig.env = {\n ...(userNextConfig.env || {}),\n ...opinlyEnvVars,\n };\n}\n\n/**\n * Modifies the passed in Next.js configuration with image rewrites and environment variables.\n *\n * @param nextConfig A Next.js configuration object, as usually exported in `next.config.js` or `next.config.mjs`.\n * @param opinlyOptions Additional options to configure Opinly.\n * @returns The modified config to be exported\n */\nexport const withOpinlyConfig =\n (opinlyOptions: OpinlyOptions) =>\n // Generic over the config type so this composes with any Next version's\n // `NextConfig` (the consumer's next may differ from the one this package was\n // built against). We only read/write `env` and `rewrites` internally.\n <T extends object>(nextConfig: T): T => {\n validateOpinlyOptions(opinlyOptions);\n\n addEnvVars(nextConfig as NextConfig, opinlyOptions);\n\n processRewrites(nextConfig as NextConfig, opinlyOptions);\n\n return nextConfig;\n };\n"],"mappings":"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","names":[]}
package/dist/config.d.cts CHANGED
@@ -1,4 +1,3 @@
1
- import { NextConfig } from 'next';
2
1
  import { z } from 'zod';
3
2
 
4
3
  declare const opinlyOptionsSchema: z.ZodObject<{
@@ -8,6 +7,8 @@ declare const opinlyOptionsSchema: z.ZodObject<{
8
7
  cdnNamespace: z.ZodString;
9
8
  siteUrl: z.ZodString;
10
9
  unoptimizedImages: z.ZodOptional<z.ZodBoolean>;
10
+ categoryPrefix: z.ZodOptional<z.ZodString>;
11
+ authorPrefix: z.ZodOptional<z.ZodString>;
11
12
  cdnDomain: z.ZodOptional<z.ZodString>;
12
13
  pagesRouter: z.ZodOptional<z.ZodBoolean>;
13
14
  }, "strip", z.ZodTypeAny, {
@@ -17,6 +18,8 @@ declare const opinlyOptionsSchema: z.ZodObject<{
17
18
  cdnNamespace: string;
18
19
  siteUrl: string;
19
20
  unoptimizedImages?: boolean | undefined;
21
+ categoryPrefix?: string | undefined;
22
+ authorPrefix?: string | undefined;
20
23
  cdnDomain?: string | undefined;
21
24
  pagesRouter?: boolean | undefined;
22
25
  }, {
@@ -26,6 +29,8 @@ declare const opinlyOptionsSchema: z.ZodObject<{
26
29
  cdnNamespace: string;
27
30
  siteUrl: string;
28
31
  unoptimizedImages?: boolean | undefined;
32
+ categoryPrefix?: string | undefined;
33
+ authorPrefix?: string | undefined;
29
34
  cdnDomain?: string | undefined;
30
35
  pagesRouter?: boolean | undefined;
31
36
  }>;
@@ -37,6 +42,6 @@ type OpinlyOptions = z.infer<typeof opinlyOptionsSchema>;
37
42
  * @param opinlyOptions Additional options to configure Opinly.
38
43
  * @returns The modified config to be exported
39
44
  */
40
- declare const withOpinlyConfig: (opinlyOptions: OpinlyOptions) => (nextConfig: NextConfig) => NextConfig;
45
+ declare const withOpinlyConfig: (opinlyOptions: OpinlyOptions) => <T extends object>(nextConfig: T) => T;
41
46
 
42
47
  export { withOpinlyConfig };
package/dist/config.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { NextConfig } from 'next';
2
1
  import { z } from 'zod';
3
2
 
4
3
  declare const opinlyOptionsSchema: z.ZodObject<{
@@ -8,6 +7,8 @@ declare const opinlyOptionsSchema: z.ZodObject<{
8
7
  cdnNamespace: z.ZodString;
9
8
  siteUrl: z.ZodString;
10
9
  unoptimizedImages: z.ZodOptional<z.ZodBoolean>;
10
+ categoryPrefix: z.ZodOptional<z.ZodString>;
11
+ authorPrefix: z.ZodOptional<z.ZodString>;
11
12
  cdnDomain: z.ZodOptional<z.ZodString>;
12
13
  pagesRouter: z.ZodOptional<z.ZodBoolean>;
13
14
  }, "strip", z.ZodTypeAny, {
@@ -17,6 +18,8 @@ declare const opinlyOptionsSchema: z.ZodObject<{
17
18
  cdnNamespace: string;
18
19
  siteUrl: string;
19
20
  unoptimizedImages?: boolean | undefined;
21
+ categoryPrefix?: string | undefined;
22
+ authorPrefix?: string | undefined;
20
23
  cdnDomain?: string | undefined;
21
24
  pagesRouter?: boolean | undefined;
22
25
  }, {
@@ -26,6 +29,8 @@ declare const opinlyOptionsSchema: z.ZodObject<{
26
29
  cdnNamespace: string;
27
30
  siteUrl: string;
28
31
  unoptimizedImages?: boolean | undefined;
32
+ categoryPrefix?: string | undefined;
33
+ authorPrefix?: string | undefined;
29
34
  cdnDomain?: string | undefined;
30
35
  pagesRouter?: boolean | undefined;
31
36
  }>;
@@ -37,6 +42,6 @@ type OpinlyOptions = z.infer<typeof opinlyOptionsSchema>;
37
42
  * @param opinlyOptions Additional options to configure Opinly.
38
43
  * @returns The modified config to be exported
39
44
  */
40
- declare const withOpinlyConfig: (opinlyOptions: OpinlyOptions) => (nextConfig: NextConfig) => NextConfig;
45
+ declare const withOpinlyConfig: (opinlyOptions: OpinlyOptions) => <T extends object>(nextConfig: T) => T;
41
46
 
42
47
  export { withOpinlyConfig };
package/dist/config.js CHANGED
@@ -18,6 +18,8 @@ const opinlyOptionsSchema = z.object({
18
18
  message: "siteUrl must be a valid URL"
19
19
  }),
20
20
  unoptimizedImages: z.boolean().optional(),
21
+ categoryPrefix: z.string().optional(),
22
+ authorPrefix: z.string().optional(),
21
23
  cdnDomain: z.string({
22
24
  description: "INTERNAL USE ONLY: The domain of the CDN. If not provided, the default domain will be used."
23
25
  }).url({
@@ -80,19 +82,26 @@ function addEnvVars(userNextConfig, opinlyOptions) {
80
82
  OPINLY_SITE_NAME: opinlyOptions.companyName,
81
83
  OPINLY_SITE_URL: opinlyOptions.siteUrl,
82
84
  OPINLY_UNOPTIMIZED_IMAGES: opinlyOptions.unoptimizedImages ? "true" : void 0,
83
- OPINLY_PAGES_ROUTER: opinlyOptions.pagesRouter ? "true" : void 0
85
+ OPINLY_PAGES_ROUTER: opinlyOptions.pagesRouter ? "true" : void 0,
86
+ OPINLY_CATEGORY_PREFIX: opinlyOptions.categoryPrefix,
87
+ OPINLY_AUTHOR_PREFIX: opinlyOptions.authorPrefix
84
88
  };
85
89
  userNextConfig.env = {
86
90
  ...userNextConfig.env || {},
87
91
  ...opinlyEnvVars
88
92
  };
89
93
  }
90
- const withOpinlyConfig = (opinlyOptions) => (nextConfig) => {
91
- validateOpinlyOptions(opinlyOptions);
92
- addEnvVars(nextConfig, opinlyOptions);
93
- processRewrites(nextConfig, opinlyOptions);
94
- return nextConfig;
95
- };
94
+ const withOpinlyConfig = (opinlyOptions) => (
95
+ // Generic over the config type so this composes with any Next version's
96
+ // `NextConfig` (the consumer's next may differ from the one this package was
97
+ // built against). We only read/write `env` and `rewrites` internally.
98
+ (nextConfig) => {
99
+ validateOpinlyOptions(opinlyOptions);
100
+ addEnvVars(nextConfig, opinlyOptions);
101
+ processRewrites(nextConfig, opinlyOptions);
102
+ return nextConfig;
103
+ }
104
+ );
96
105
  export {
97
106
  withOpinlyConfig
98
107
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { NextConfig } from \"next\";\nimport { Rewrite } from \"next/dist/lib/load-custom-routes\";\nimport type { OpinlyEnvVars } from \"./utils/sdk-config\";\nimport { z } from \"zod\";\n\ninterface WithOpinlyOptions {\n imagesPath: `/${string}`;\n blogPath: `/${string}`;\n companyName: string;\n cdnNamespace: string;\n siteUrl: string;\n unoptimizedImages?: boolean;\n}\n\ntype ResolvedRewrites = ReturnType<\n NonNullable<Awaited<NextConfig[\"rewrites\"]>>\n>;\n\nconst opinlyOptionsSchema = z.object({\n imagesPath: z\n .string({})\n .refine(\n (val) => val.startsWith(\"/\") || z.string().url().safeParse(val).success,\n {\n message: \"imagesPath must start with a leading slash (e.g. '/images')\",\n }\n ),\n blogPath: z.string({}).startsWith(\"/\", {\n message: \"blogPath must start with a leading slash i.e. `/blog`\",\n }),\n companyName: z.string({\n required_error: \"companyName is required\",\n invalid_type_error: \"companyName must be a string\",\n }),\n cdnNamespace: z\n .string()\n .min(21, \"CDN namespace must be 21 characters long\")\n .max(21, \"CDN namespace must be 21 characters long\"),\n siteUrl: z.string().url({\n message: \"siteUrl must be a valid URL\",\n }),\n unoptimizedImages: z.boolean().optional(),\n cdnDomain: z\n .string({\n description:\n \"INTERNAL USE ONLY: The domain of the CDN. If not provided, the default domain will be used.\",\n })\n .url({\n message: \"cdnDomain must be a valid URL\",\n })\n .optional(),\n pagesRouter: z.boolean().optional(),\n});\n\ntype OpinlyOptions = z.infer<typeof opinlyOptionsSchema>;\n\nconst validateOpinlyOptions = (opinlyOptions: OpinlyOptions) => {\n if (!opinlyOptions) {\n throw new Error(\n \"[@opinly/next] `opts` is required. Please provide the options object.\"\n );\n }\n\n const parsedOpinlyOptions = opinlyOptionsSchema.safeParse(opinlyOptions);\n\n if (!parsedOpinlyOptions.success) {\n throw new Error(\n `[@opinly/next] Invalid options provided in next.config.js: ${parsedOpinlyOptions.error.message}`\n );\n }\n};\n\nconst processRewrites = (\n userNextConfig: NextConfig,\n opinlyOptions: OpinlyOptions\n): void => {\n const imagesPath = opinlyOptions.imagesPath;\n\n if (!imagesPath.startsWith(\"/\")) {\n console.warn(\n `[@opinly/next] You have provided a url for imagesPath. This is only valid for internal testing and rewrites will be skipped.`\n );\n\n return;\n }\n\n const originalRewrites = userNextConfig.rewrites;\n\n userNextConfig.rewrites = async () => {\n const opinlyRewrite = {\n source: `${opinlyOptions.imagesPath}/:path*`,\n destination: `${opinlyOptions.cdnDomain || \"https://cdn.opinly.ai\"}/${\n opinlyOptions.cdnNamespace\n }/:path*`,\n };\n\n const newRewrites = [opinlyRewrite];\n\n if (opinlyOptions.pagesRouter) {\n newRewrites.push({\n source: \"/sitemap.xml\",\n destination: \"/sitemap\",\n });\n }\n\n if (typeof originalRewrites !== \"function\") {\n return newRewrites;\n }\n\n const resolvedRewrites = await originalRewrites();\n\n if (Array.isArray(resolvedRewrites)) {\n return [...resolvedRewrites, opinlyRewrite];\n } else {\n return {\n ...resolvedRewrites,\n beforeFiles: [...(resolvedRewrites.beforeFiles || []), ...newRewrites],\n };\n }\n };\n};\n\nfunction addEnvVars(userNextConfig: NextConfig, opinlyOptions: OpinlyOptions) {\n const opinlyEnvVars: OpinlyEnvVars = {\n OPINLY_IMAGES_PREFIX: opinlyOptions.imagesPath,\n OPINLY_BLOG_PREFIX: opinlyOptions.blogPath,\n OPINLY_SITE_NAME: opinlyOptions.companyName,\n OPINLY_SITE_URL: opinlyOptions.siteUrl,\n OPINLY_UNOPTIMIZED_IMAGES: opinlyOptions.unoptimizedImages\n ? \"true\"\n : undefined,\n OPINLY_PAGES_ROUTER: opinlyOptions.pagesRouter ? \"true\" : undefined,\n };\n\n userNextConfig.env = {\n ...(userNextConfig.env || {}),\n ...opinlyEnvVars,\n };\n}\n\n/**\n * Modifies the passed in Next.js configuration with image rewrites and environment variables.\n *\n * @param nextConfig A Next.js configuration object, as usually exported in `next.config.js` or `next.config.mjs`.\n * @param opinlyOptions Additional options to configure Opinly.\n * @returns The modified config to be exported\n */\nexport const withOpinlyConfig =\n (opinlyOptions: OpinlyOptions) =>\n (nextConfig: NextConfig): NextConfig => {\n validateOpinlyOptions(opinlyOptions);\n\n addEnvVars(nextConfig, opinlyOptions);\n\n processRewrites(nextConfig, opinlyOptions);\n\n return nextConfig;\n };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { NextConfig } from \"next\";\nimport { Rewrite } from \"next/dist/lib/load-custom-routes\";\nimport type { OpinlyEnvVars } from \"./utils/sdk-config\";\nimport { z } from \"zod\";\n\ninterface WithOpinlyOptions {\n imagesPath: `/${string}`;\n blogPath: `/${string}`;\n companyName: string;\n cdnNamespace: string;\n siteUrl: string;\n unoptimizedImages?: boolean;\n /** URL segment categories live under (relative to blogPath). Default: bare. */\n categoryPrefix?: string;\n /** URL segment authors live under (relative to blogPath). Default: \"authors\". */\n authorPrefix?: string;\n}\n\ntype ResolvedRewrites = ReturnType<\n NonNullable<Awaited<NextConfig[\"rewrites\"]>>\n>;\n\nconst opinlyOptionsSchema = z.object({\n imagesPath: z\n .string({})\n .refine(\n (val) => val.startsWith(\"/\") || z.string().url().safeParse(val).success,\n {\n message: \"imagesPath must start with a leading slash (e.g. '/images')\",\n }\n ),\n blogPath: z.string({}).startsWith(\"/\", {\n message: \"blogPath must start with a leading slash i.e. `/blog`\",\n }),\n companyName: z.string({\n required_error: \"companyName is required\",\n invalid_type_error: \"companyName must be a string\",\n }),\n cdnNamespace: z\n .string()\n .min(21, \"CDN namespace must be 21 characters long\")\n .max(21, \"CDN namespace must be 21 characters long\"),\n siteUrl: z.string().url({\n message: \"siteUrl must be a valid URL\",\n }),\n unoptimizedImages: z.boolean().optional(),\n categoryPrefix: z.string().optional(),\n authorPrefix: z.string().optional(),\n cdnDomain: z\n .string({\n description:\n \"INTERNAL USE ONLY: The domain of the CDN. If not provided, the default domain will be used.\",\n })\n .url({\n message: \"cdnDomain must be a valid URL\",\n })\n .optional(),\n pagesRouter: z.boolean().optional(),\n});\n\ntype OpinlyOptions = z.infer<typeof opinlyOptionsSchema>;\n\nconst validateOpinlyOptions = (opinlyOptions: OpinlyOptions) => {\n if (!opinlyOptions) {\n throw new Error(\n \"[@opinly/next] `opts` is required. Please provide the options object.\"\n );\n }\n\n const parsedOpinlyOptions = opinlyOptionsSchema.safeParse(opinlyOptions);\n\n if (!parsedOpinlyOptions.success) {\n throw new Error(\n `[@opinly/next] Invalid options provided in next.config.js: ${parsedOpinlyOptions.error.message}`\n );\n }\n};\n\nconst processRewrites = (\n userNextConfig: NextConfig,\n opinlyOptions: OpinlyOptions\n): void => {\n const imagesPath = opinlyOptions.imagesPath;\n\n if (!imagesPath.startsWith(\"/\")) {\n console.warn(\n `[@opinly/next] You have provided a url for imagesPath. This is only valid for internal testing and rewrites will be skipped.`\n );\n\n return;\n }\n\n const originalRewrites = userNextConfig.rewrites;\n\n userNextConfig.rewrites = async () => {\n const opinlyRewrite = {\n source: `${opinlyOptions.imagesPath}/:path*`,\n destination: `${opinlyOptions.cdnDomain || \"https://cdn.opinly.ai\"}/${\n opinlyOptions.cdnNamespace\n }/:path*`,\n };\n\n const newRewrites = [opinlyRewrite];\n\n if (opinlyOptions.pagesRouter) {\n newRewrites.push({\n source: \"/sitemap.xml\",\n destination: \"/sitemap\",\n });\n }\n\n if (typeof originalRewrites !== \"function\") {\n return newRewrites;\n }\n\n const resolvedRewrites = await originalRewrites();\n\n if (Array.isArray(resolvedRewrites)) {\n return [...resolvedRewrites, opinlyRewrite];\n } else {\n return {\n ...resolvedRewrites,\n beforeFiles: [...(resolvedRewrites.beforeFiles || []), ...newRewrites],\n };\n }\n };\n};\n\nfunction addEnvVars(userNextConfig: NextConfig, opinlyOptions: OpinlyOptions) {\n const opinlyEnvVars: OpinlyEnvVars = {\n OPINLY_IMAGES_PREFIX: opinlyOptions.imagesPath,\n OPINLY_BLOG_PREFIX: opinlyOptions.blogPath,\n OPINLY_SITE_NAME: opinlyOptions.companyName,\n OPINLY_SITE_URL: opinlyOptions.siteUrl,\n OPINLY_UNOPTIMIZED_IMAGES: opinlyOptions.unoptimizedImages\n ? \"true\"\n : undefined,\n OPINLY_PAGES_ROUTER: opinlyOptions.pagesRouter ? \"true\" : undefined,\n OPINLY_CATEGORY_PREFIX: opinlyOptions.categoryPrefix,\n OPINLY_AUTHOR_PREFIX: opinlyOptions.authorPrefix,\n };\n\n userNextConfig.env = {\n ...(userNextConfig.env || {}),\n ...opinlyEnvVars,\n };\n}\n\n/**\n * Modifies the passed in Next.js configuration with image rewrites and environment variables.\n *\n * @param nextConfig A Next.js configuration object, as usually exported in `next.config.js` or `next.config.mjs`.\n * @param opinlyOptions Additional options to configure Opinly.\n * @returns The modified config to be exported\n */\nexport const withOpinlyConfig =\n (opinlyOptions: OpinlyOptions) =>\n // Generic over the config type so this composes with any Next version's\n // `NextConfig` (the consumer's next may differ from the one this package was\n // built against). We only read/write `env` and `rewrites` internally.\n <T extends object>(nextConfig: T): T => {\n validateOpinlyOptions(opinlyOptions);\n\n addEnvVars(nextConfig as NextConfig, opinlyOptions);\n\n processRewrites(nextConfig as NextConfig, opinlyOptions);\n\n return nextConfig;\n };\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -3,6 +3,10 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
6
10
  var __copyProps = (to, from, except, desc) => {
7
11
  if (from && typeof from === "object" || typeof from === "function") {
8
12
  for (let key of __getOwnPropNames(from))
@@ -11,13 +15,39 @@ var __copyProps = (to, from, except, desc) => {
11
15
  }
12
16
  return to;
13
17
  };
14
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
19
  var index_exports = {};
20
+ __export(index_exports, {
21
+ OpinlyJsonLd: () => import_json_ld.OpinlyJsonLd,
22
+ buildBlogPostingJsonLd: () => import_json_ld.buildBlogPostingJsonLd,
23
+ buildFaqJsonLd: () => import_json_ld.buildFaqJsonLd,
24
+ cn: () => import_merge.cn,
25
+ formatDate: () => import_dates.formatDate,
26
+ generateOpinlyMetadata: () => import_generate_metadata.generateOpinlyMetadata,
27
+ generateSiteMapXML: () => import_generate_sitemap_xml.generateSiteMapXML,
28
+ opinlyConfig: () => import_sdk_config.opinlyConfig,
29
+ setOpinlyConfig: () => import_sdk_config.setOpinlyConfig,
30
+ withOpinlyConfig: () => import_config.withOpinlyConfig
31
+ });
17
32
  module.exports = __toCommonJS(index_exports);
18
- __reExport(index_exports, require("./components/opinly-blog"), module.exports);
33
+ var import_config = require("./config");
34
+ var import_generate_metadata = require("./utils/generate-metadata");
35
+ var import_json_ld = require("./json-ld");
36
+ var import_sdk_config = require("./utils/sdk-config");
37
+ var import_generate_sitemap_xml = require("./utils/generate-sitemap-xml");
38
+ var import_dates = require("./utils/dates");
39
+ var import_merge = require("./utils/merge");
19
40
  // Annotate the CommonJS export names for ESM import in node:
20
41
  0 && (module.exports = {
21
- ...require("./components/opinly-blog")
42
+ OpinlyJsonLd,
43
+ buildBlogPostingJsonLd,
44
+ buildFaqJsonLd,
45
+ cn,
46
+ formatDate,
47
+ generateOpinlyMetadata,
48
+ generateSiteMapXML,
49
+ opinlyConfig,
50
+ setOpinlyConfig,
51
+ withOpinlyConfig
22
52
  });
23
53
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./components/opinly-blog\";\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,qCAAd;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { withOpinlyConfig } from \"./config\";\nexport { generateOpinlyMetadata } from \"./utils/generate-metadata\";\nexport {\n OpinlyJsonLd,\n buildBlogPostingJsonLd,\n buildFaqJsonLd,\n} from \"./json-ld\";\nexport {\n opinlyConfig,\n setOpinlyConfig,\n type OpinlyEnvVars,\n} from \"./utils/sdk-config\";\nexport { generateSiteMapXML } from \"./utils/generate-sitemap-xml\";\nexport { formatDate } from \"./utils/dates\";\nexport { cn } from \"./utils/merge\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAiC;AACjC,+BAAuC;AACvC,qBAIO;AACP,wBAIO;AACP,kCAAmC;AACnC,mBAA2B;AAC3B,mBAAmB;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,8 +1,14 @@
1
- export { OpinlyBlog } from './components/opinly-blog.cjs';
1
+ export { withOpinlyConfig } from './config.cjs';
2
+ export { generateOpinlyMetadata } from './utils/generate-metadata.cjs';
3
+ export { OpinlyJsonLd, buildBlogPostingJsonLd, buildFaqJsonLd } from './json-ld.cjs';
4
+ export { OpinlyEnvVars, opinlyConfig, setOpinlyConfig } from './utils/sdk-config.cjs';
5
+ export { generateSiteMapXML } from './utils/generate-sitemap-xml.cjs';
6
+ export { formatDate } from './utils/dates.cjs';
7
+ export { cn } from './utils/merge.cjs';
8
+ import 'zod';
9
+ import 'next';
10
+ import '@opinly/shared';
11
+ import 'schema-dts';
2
12
  import 'react/jsx-runtime';
3
- import './components/blog-post/index.cjs';
4
- import 'react';
5
- import './components/blog-post/_types/blog-post.cjs';
6
13
  import '@opinly/backend';
7
- import './components/blog-post/_types/class-names.cjs';
8
- import './components/home-page/index.cjs';
14
+ import 'clsx';
package/dist/index.d.ts CHANGED
@@ -1,8 +1,14 @@
1
- export { OpinlyBlog } from './components/opinly-blog.js';
1
+ export { withOpinlyConfig } from './config.js';
2
+ export { generateOpinlyMetadata } from './utils/generate-metadata.js';
3
+ export { OpinlyJsonLd, buildBlogPostingJsonLd, buildFaqJsonLd } from './json-ld.js';
4
+ export { OpinlyEnvVars, opinlyConfig, setOpinlyConfig } from './utils/sdk-config.js';
5
+ export { generateSiteMapXML } from './utils/generate-sitemap-xml.js';
6
+ export { formatDate } from './utils/dates.js';
7
+ export { cn } from './utils/merge.js';
8
+ import 'zod';
9
+ import 'next';
10
+ import '@opinly/shared';
11
+ import 'schema-dts';
2
12
  import 'react/jsx-runtime';
3
- import './components/blog-post/index.js';
4
- import 'react';
5
- import './components/blog-post/_types/blog-post.js';
6
13
  import '@opinly/backend';
7
- import './components/blog-post/_types/class-names.js';
8
- import './components/home-page/index.js';
14
+ import 'clsx';
package/dist/index.js CHANGED
@@ -1,2 +1,27 @@
1
- export * from "./components/opinly-blog";
1
+ import { withOpinlyConfig } from "./config";
2
+ import { generateOpinlyMetadata } from "./utils/generate-metadata";
3
+ import {
4
+ OpinlyJsonLd,
5
+ buildBlogPostingJsonLd,
6
+ buildFaqJsonLd
7
+ } from "./json-ld";
8
+ import {
9
+ opinlyConfig,
10
+ setOpinlyConfig
11
+ } from "./utils/sdk-config";
12
+ import { generateSiteMapXML } from "./utils/generate-sitemap-xml";
13
+ import { formatDate } from "./utils/dates";
14
+ import { cn } from "./utils/merge";
15
+ export {
16
+ OpinlyJsonLd,
17
+ buildBlogPostingJsonLd,
18
+ buildFaqJsonLd,
19
+ cn,
20
+ formatDate,
21
+ generateOpinlyMetadata,
22
+ generateSiteMapXML,
23
+ opinlyConfig,
24
+ setOpinlyConfig,
25
+ withOpinlyConfig
26
+ };
2
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./components/opinly-blog\";\n"],"mappings":"AAAA,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { withOpinlyConfig } from \"./config\";\nexport { generateOpinlyMetadata } from \"./utils/generate-metadata\";\nexport {\n OpinlyJsonLd,\n buildBlogPostingJsonLd,\n buildFaqJsonLd,\n} from \"./json-ld\";\nexport {\n opinlyConfig,\n setOpinlyConfig,\n type OpinlyEnvVars,\n} from \"./utils/sdk-config\";\nexport { generateSiteMapXML } from \"./utils/generate-sitemap-xml\";\nexport { formatDate } from \"./utils/dates\";\nexport { cn } from \"./utils/merge\";\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,0BAA0B;AACnC,SAAS,kBAAkB;AAC3B,SAAS,UAAU;","names":[]}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var json_ld_exports = {};
20
+ __export(json_ld_exports, {
21
+ OpinlyJsonLd: () => OpinlyJsonLd,
22
+ buildBlogPostingJsonLd: () => buildBlogPostingJsonLd,
23
+ buildFaqJsonLd: () => buildFaqJsonLd
24
+ });
25
+ module.exports = __toCommonJS(json_ld_exports);
26
+ var import_jsx_runtime = require("react/jsx-runtime");
27
+ var import_shared = require("@opinly/shared");
28
+ var import_sdk_config = require("./utils/sdk-config");
29
+ const rendererConfig = () => ({
30
+ imagesPrefix: import_sdk_config.opinlyConfig.imagesPrefix,
31
+ siteUrl: import_sdk_config.opinlyConfig.siteUrl,
32
+ blogPrefix: import_sdk_config.opinlyConfig.blogPrefix,
33
+ siteName: import_sdk_config.opinlyConfig.siteName
34
+ });
35
+ const OpinlyJsonLd = ({ data }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
36
+ "script",
37
+ {
38
+ type: "application/ld+json",
39
+ dangerouslySetInnerHTML: { __html: JSON.stringify(data) }
40
+ }
41
+ );
42
+ const buildBlogPostingJsonLd = (post) => (0, import_shared.buildBlogPostingJsonLd)(
43
+ {
44
+ title: post.title,
45
+ description: post.description,
46
+ content: post.content,
47
+ firstPublishedAt: post.firstPublishedAt,
48
+ modifiedAt: post.modifiedAt,
49
+ author: post.author ? { name: post.author.name } : null,
50
+ imageFileKey: post.titleFile?.fileKey
51
+ },
52
+ rendererConfig()
53
+ );
54
+ const buildFaqJsonLd = import_shared.buildFaqJsonLd;
55
+ // Annotate the CommonJS export names for ESM import in node:
56
+ 0 && (module.exports = {
57
+ OpinlyJsonLd,
58
+ buildBlogPostingJsonLd,
59
+ buildFaqJsonLd
60
+ });
61
+ //# sourceMappingURL=json-ld.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/json-ld.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n buildBlogPostingJsonLd as coreBlogPostingJsonLd,\n buildFaqJsonLd as coreFaqJsonLd,\n type OpinlyNode,\n type OpinlyConfig,\n} from \"@opinly/shared\";\nimport type { FullPost } from \"@opinly/backend\";\nimport { opinlyConfig } from \"./utils/sdk-config\";\n\nconst rendererConfig = (): OpinlyConfig => ({\n imagesPrefix: opinlyConfig.imagesPrefix,\n siteUrl: opinlyConfig.siteUrl,\n blogPrefix: opinlyConfig.blogPrefix,\n siteName: opinlyConfig.siteName,\n});\n\n/** Renders a JSON-LD `<script>` tag (the Next-specific bit). */\nexport const OpinlyJsonLd = ({ data }: { data: object }) => (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}\n />\n);\n\n/** BlogPosting structured data from a resolved post. Delegates to @opinly/shared. */\nexport const buildBlogPostingJsonLd = (post: FullPost) =>\n coreBlogPostingJsonLd(\n {\n title: post.title,\n description: post.description,\n content: post.content as OpinlyNode,\n firstPublishedAt: post.firstPublishedAt,\n modifiedAt: post.modifiedAt,\n author: post.author ? { name: post.author.name } : null,\n imageFileKey: post.titleFile?.fileKey,\n },\n rendererConfig(),\n );\n\n/** FAQPage structured data. Re-exported from @opinly/shared. */\nexport const buildFaqJsonLd = coreFaqJsonLd;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBE;AAlBF,oBAKO;AAEP,wBAA6B;AAE7B,MAAM,iBAAiB,OAAqB;AAAA,EAC1C,cAAc,+BAAa;AAAA,EAC3B,SAAS,+BAAa;AAAA,EACtB,YAAY,+BAAa;AAAA,EACzB,UAAU,+BAAa;AACzB;AAGO,MAAM,eAAe,CAAC,EAAE,KAAK,MAClC;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,IAAI,EAAE;AAAA;AAC1D;AAIK,MAAM,yBAAyB,CAAC,aACrC,cAAAA;AAAA,EACE;AAAA,IACE,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,kBAAkB,KAAK;AAAA,IACvB,YAAY,KAAK;AAAA,IACjB,QAAQ,KAAK,SAAS,EAAE,MAAM,KAAK,OAAO,KAAK,IAAI;AAAA,IACnD,cAAc,KAAK,WAAW;AAAA,EAChC;AAAA,EACA,eAAe;AACjB;AAGK,MAAM,iBAAiB,cAAAC;","names":["coreBlogPostingJsonLd","coreFaqJsonLd"]}
@@ -0,0 +1,17 @@
1
+ import * as schema_dts from 'schema-dts';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { FullPost } from '@opinly/backend';
4
+
5
+ /** Renders a JSON-LD `<script>` tag (the Next-specific bit). */
6
+ declare const OpinlyJsonLd: ({ data }: {
7
+ data: object;
8
+ }) => react_jsx_runtime.JSX.Element;
9
+ /** BlogPosting structured data from a resolved post. Delegates to @opinly/shared. */
10
+ declare const buildBlogPostingJsonLd: (post: FullPost) => schema_dts.WithContext<schema_dts.BlogPosting>;
11
+ /** FAQPage structured data. Re-exported from @opinly/shared. */
12
+ declare const buildFaqJsonLd: (faqs: {
13
+ question: string;
14
+ answer: string;
15
+ }[]) => schema_dts.WithContext<schema_dts.FAQPage>;
16
+
17
+ export { OpinlyJsonLd, buildBlogPostingJsonLd, buildFaqJsonLd };
@@ -0,0 +1,17 @@
1
+ import * as schema_dts from 'schema-dts';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { FullPost } from '@opinly/backend';
4
+
5
+ /** Renders a JSON-LD `<script>` tag (the Next-specific bit). */
6
+ declare const OpinlyJsonLd: ({ data }: {
7
+ data: object;
8
+ }) => react_jsx_runtime.JSX.Element;
9
+ /** BlogPosting structured data from a resolved post. Delegates to @opinly/shared. */
10
+ declare const buildBlogPostingJsonLd: (post: FullPost) => schema_dts.WithContext<schema_dts.BlogPosting>;
11
+ /** FAQPage structured data. Re-exported from @opinly/shared. */
12
+ declare const buildFaqJsonLd: (faqs: {
13
+ question: string;
14
+ answer: string;
15
+ }[]) => schema_dts.WithContext<schema_dts.FAQPage>;
16
+
17
+ export { OpinlyJsonLd, buildBlogPostingJsonLd, buildFaqJsonLd };
@@ -0,0 +1,38 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import {
3
+ buildBlogPostingJsonLd as coreBlogPostingJsonLd,
4
+ buildFaqJsonLd as coreFaqJsonLd
5
+ } from "@opinly/shared";
6
+ import { opinlyConfig } from "./utils/sdk-config";
7
+ const rendererConfig = () => ({
8
+ imagesPrefix: opinlyConfig.imagesPrefix,
9
+ siteUrl: opinlyConfig.siteUrl,
10
+ blogPrefix: opinlyConfig.blogPrefix,
11
+ siteName: opinlyConfig.siteName
12
+ });
13
+ const OpinlyJsonLd = ({ data }) => /* @__PURE__ */ jsx(
14
+ "script",
15
+ {
16
+ type: "application/ld+json",
17
+ dangerouslySetInnerHTML: { __html: JSON.stringify(data) }
18
+ }
19
+ );
20
+ const buildBlogPostingJsonLd = (post) => coreBlogPostingJsonLd(
21
+ {
22
+ title: post.title,
23
+ description: post.description,
24
+ content: post.content,
25
+ firstPublishedAt: post.firstPublishedAt,
26
+ modifiedAt: post.modifiedAt,
27
+ author: post.author ? { name: post.author.name } : null,
28
+ imageFileKey: post.titleFile?.fileKey
29
+ },
30
+ rendererConfig()
31
+ );
32
+ const buildFaqJsonLd = coreFaqJsonLd;
33
+ export {
34
+ OpinlyJsonLd,
35
+ buildBlogPostingJsonLd,
36
+ buildFaqJsonLd
37
+ };
38
+ //# sourceMappingURL=json-ld.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/json-ld.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n buildBlogPostingJsonLd as coreBlogPostingJsonLd,\n buildFaqJsonLd as coreFaqJsonLd,\n type OpinlyNode,\n type OpinlyConfig,\n} from \"@opinly/shared\";\nimport type { FullPost } from \"@opinly/backend\";\nimport { opinlyConfig } from \"./utils/sdk-config\";\n\nconst rendererConfig = (): OpinlyConfig => ({\n imagesPrefix: opinlyConfig.imagesPrefix,\n siteUrl: opinlyConfig.siteUrl,\n blogPrefix: opinlyConfig.blogPrefix,\n siteName: opinlyConfig.siteName,\n});\n\n/** Renders a JSON-LD `<script>` tag (the Next-specific bit). */\nexport const OpinlyJsonLd = ({ data }: { data: object }) => (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}\n />\n);\n\n/** BlogPosting structured data from a resolved post. Delegates to @opinly/shared. */\nexport const buildBlogPostingJsonLd = (post: FullPost) =>\n coreBlogPostingJsonLd(\n {\n title: post.title,\n description: post.description,\n content: post.content as OpinlyNode,\n firstPublishedAt: post.firstPublishedAt,\n modifiedAt: post.modifiedAt,\n author: post.author ? { name: post.author.name } : null,\n imageFileKey: post.titleFile?.fileKey,\n },\n rendererConfig(),\n );\n\n/** FAQPage structured data. Re-exported from @opinly/shared. */\nexport const buildFaqJsonLd = coreFaqJsonLd;\n"],"mappings":"AAmBE;AAlBF;AAAA,EACE,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,OAGb;AAEP,SAAS,oBAAoB;AAE7B,MAAM,iBAAiB,OAAqB;AAAA,EAC1C,cAAc,aAAa;AAAA,EAC3B,SAAS,aAAa;AAAA,EACtB,YAAY,aAAa;AAAA,EACzB,UAAU,aAAa;AACzB;AAGO,MAAM,eAAe,CAAC,EAAE,KAAK,MAClC;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,IAAI,EAAE;AAAA;AAC1D;AAIK,MAAM,yBAAyB,CAAC,SACrC;AAAA,EACE;AAAA,IACE,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,kBAAkB,KAAK;AAAA,IACvB,YAAY,KAAK;AAAA,IACjB,QAAQ,KAAK,SAAS,EAAE,MAAM,KAAK,OAAO,KAAK,IAAI;AAAA,IACnD,cAAc,KAAK,WAAW;AAAA,EAChC;AAAA,EACA,eAAe;AACjB;AAGK,MAAM,iBAAiB;","names":[]}
@@ -21,86 +21,30 @@ __export(generate_metadata_exports, {
21
21
  generateOpinlyMetadata: () => generateOpinlyMetadata
22
22
  });
23
23
  module.exports = __toCommonJS(generate_metadata_exports);
24
+ var import_shared = require("@opinly/shared");
24
25
  var import_sdk_config = require("./sdk-config");
25
- const generateOpinlyMetadata = async (client, params, parent) => {
26
- const blog = await client.content.blog(params);
27
- if (blog.type === "not-found") {
28
- return parent;
29
- }
30
- const previousImages = (await parent).openGraph?.images || [];
31
- if (blog.type === "home") {
32
- return {
33
- ...parent,
34
- title: `${import_sdk_config.opinlyConfig.siteName} Blog`,
35
- description: `Explore the latest articles from the ${import_sdk_config.opinlyConfig.siteName} Blog`,
36
- openGraph: {
37
- title: `${import_sdk_config.opinlyConfig.siteName} Blog`,
38
- description: `Explore the latest articles from the ${import_sdk_config.opinlyConfig.siteName} Blog`
39
- }
40
- };
41
- }
42
- if (blog.type === "post") {
43
- const openGraphImageKey = blog.data?.titleFile?.fileKey;
44
- const images = openGraphImageKey ? [`${import_sdk_config.opinlyConfig.imagesPrefix}/${openGraphImageKey}`, ...previousImages] : previousImages;
45
- return {
46
- ...parent,
47
- title: blog.data.title,
48
- description: blog.data.description,
49
- openGraph: {
50
- images,
51
- type: "article",
52
- authors: blog.data.author && [
53
- `${import_sdk_config.opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`
54
- ],
55
- title: blog.data.title
56
- },
57
- // keywords: [blog.data.keywords],
58
- authors: blog.data.author && [
59
- {
60
- name: blog.data.author.name,
61
- url: `${import_sdk_config.opinlyConfig.imagesPrefix}/authors/${blog.data.author.slug}`
62
- }
63
- ],
64
- other: {}
65
- };
66
- }
67
- if (blog.type === "author") {
68
- const authorImageKey = blog.data.image?.fileKey;
69
- const images = authorImageKey ? [`${import_sdk_config.opinlyConfig.imagesPrefix}/${authorImageKey}`] : [];
70
- return {
71
- ...parent,
72
- title: blog.data.name,
73
- description: blog.data.bio || void 0,
74
- openGraph: {
75
- images: images.length > 0 ? images : void 0,
76
- title: blog.data.name,
77
- description: blog.data.bio || void 0
78
- }
79
- };
80
- }
81
- if (blog.type === "authors") {
82
- return {
83
- ...parent,
84
- title: `${import_sdk_config.opinlyConfig.siteName} Blog - Authors`,
85
- description: `Browse all authors on the ${import_sdk_config.opinlyConfig.siteName} Blog`,
86
- openGraph: {
87
- title: `${import_sdk_config.opinlyConfig.siteName} Blog - Authors`,
88
- description: `Browse all authors on the ${import_sdk_config.opinlyConfig.siteName} Blog`
89
- }
90
- };
91
- }
92
- if (blog.type === "folder") {
93
- return {
94
- ...parent,
95
- title: `${import_sdk_config.opinlyConfig.siteName} Blog - Folder: ${blog.data.name}`,
96
- description: blog.data.description || void 0,
97
- openGraph: {
98
- title: `${import_sdk_config.opinlyConfig.siteName} Blog - Folder: ${blog.data.name}`,
99
- description: blog.data.description || void 0
100
- }
101
- };
102
- }
103
- return parent;
26
+ const generateOpinlyMetadata = async (resolved, parent) => {
27
+ const base = await parent;
28
+ const meta = (0, import_shared.buildMetadata)(resolved, {
29
+ imagesPrefix: import_sdk_config.opinlyConfig.imagesPrefix,
30
+ siteUrl: import_sdk_config.opinlyConfig.siteUrl,
31
+ blogPrefix: import_sdk_config.opinlyConfig.blogPrefix,
32
+ siteName: import_sdk_config.opinlyConfig.siteName,
33
+ categoryPrefix: import_sdk_config.opinlyConfig.categoryPrefix,
34
+ authorPrefix: import_sdk_config.opinlyConfig.authorPrefix
35
+ });
36
+ return {
37
+ ...base,
38
+ title: meta.title,
39
+ description: meta.description,
40
+ openGraph: {
41
+ title: meta.title,
42
+ description: meta.description,
43
+ type: meta.ogType ?? "website",
44
+ images: meta.ogImage ? [meta.ogImage] : void 0
45
+ },
46
+ ...meta.authors ? { authors: meta.authors } : {}
47
+ };
104
48
  };
105
49
  // Annotate the CommonJS export names for ESM import in node:
106
50
  0 && (module.exports = {