@puzzle-ui/seo 0.0.0-stage → 0.5.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 (220) hide show
  1. package/README.md +755 -2
  2. package/dist/LICENSE +21 -0
  3. package/dist/context/config.cjs +82 -0
  4. package/dist/context/config.cjs.map +1 -0
  5. package/dist/context/config.d.cts +6 -0
  6. package/dist/context/config.d.ts +6 -0
  7. package/dist/context/config.js +80 -0
  8. package/dist/context/config.js.map +1 -0
  9. package/dist/context/index.cjs +6 -0
  10. package/dist/context/index.d.cts +4 -0
  11. package/dist/context/index.d.ts +4 -0
  12. package/dist/context/index.js +3 -0
  13. package/dist/context/types.d.cts +46 -0
  14. package/dist/context/types.d.ts +46 -0
  15. package/dist/core/graph.cjs +464 -0
  16. package/dist/core/graph.cjs.map +1 -0
  17. package/dist/core/graph.d.cts +62 -0
  18. package/dist/core/graph.d.ts +62 -0
  19. package/dist/core/graph.js +456 -0
  20. package/dist/core/graph.js.map +1 -0
  21. package/dist/core/index.cjs +11 -0
  22. package/dist/core/index.d.cts +3 -0
  23. package/dist/core/index.d.ts +3 -0
  24. package/dist/core/index.js +1 -0
  25. package/dist/core/types.d.cts +92 -0
  26. package/dist/core/types.d.ts +92 -0
  27. package/dist/index.cjs +96 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +48 -0
  30. package/dist/index.d.ts +38 -0
  31. package/dist/index.js +19 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/metadata/index.cjs +4 -0
  34. package/dist/metadata/index.d.cts +3 -0
  35. package/dist/metadata/index.d.ts +3 -0
  36. package/dist/metadata/index.js +1 -0
  37. package/dist/metadata/resolve.cjs +122 -0
  38. package/dist/metadata/resolve.cjs.map +1 -0
  39. package/dist/metadata/resolve.d.cts +4 -0
  40. package/dist/metadata/resolve.d.ts +4 -0
  41. package/dist/metadata/resolve.js +121 -0
  42. package/dist/metadata/resolve.js.map +1 -0
  43. package/dist/metadata/types.d.cts +82 -0
  44. package/dist/metadata/types.d.ts +82 -0
  45. package/dist/next/index.cjs +13 -0
  46. package/dist/next/index.cjs.map +1 -0
  47. package/dist/next/index.d.cts +15 -0
  48. package/dist/next/index.d.ts +14 -0
  49. package/dist/next/index.js +12 -0
  50. package/dist/next/index.js.map +1 -0
  51. package/dist/react/context.cjs +30 -0
  52. package/dist/react/context.cjs.map +1 -0
  53. package/dist/react/context.d.cts +14 -0
  54. package/dist/react/context.d.ts +14 -0
  55. package/dist/react/context.js +27 -0
  56. package/dist/react/context.js.map +1 -0
  57. package/dist/react/index.cjs +48 -0
  58. package/dist/react/index.d.cts +6 -0
  59. package/dist/react/index.d.ts +6 -0
  60. package/dist/react/index.js +5 -0
  61. package/dist/react/metadata.cjs +100 -0
  62. package/dist/react/metadata.cjs.map +1 -0
  63. package/dist/react/metadata.d.cts +18 -0
  64. package/dist/react/metadata.d.ts +18 -0
  65. package/dist/react/metadata.js +99 -0
  66. package/dist/react/metadata.js.map +1 -0
  67. package/dist/react/provider.cjs +42 -0
  68. package/dist/react/provider.cjs.map +1 -0
  69. package/dist/react/provider.d.cts +3 -0
  70. package/dist/react/provider.d.ts +3 -0
  71. package/dist/react/provider.js +42 -0
  72. package/dist/react/provider.js.map +1 -0
  73. package/dist/react/schema-components.cjs +294 -0
  74. package/dist/react/schema-components.cjs.map +1 -0
  75. package/dist/react/schema-components.d.cts +84 -0
  76. package/dist/react/schema-components.d.ts +80 -0
  77. package/dist/react/schema-components.js +254 -0
  78. package/dist/react/schema-components.js.map +1 -0
  79. package/dist/react/types.d.cts +81 -0
  80. package/dist/react/types.d.ts +80 -0
  81. package/dist/react-router/index.cjs +13 -0
  82. package/dist/react-router/index.cjs.map +1 -0
  83. package/dist/react-router/index.d.cts +21 -0
  84. package/dist/react-router/index.d.ts +20 -0
  85. package/dist/react-router/index.js +12 -0
  86. package/dist/react-router/index.js.map +1 -0
  87. package/dist/robots/generate.cjs +88 -0
  88. package/dist/robots/generate.cjs.map +1 -0
  89. package/dist/robots/generate.d.cts +4 -0
  90. package/dist/robots/generate.d.ts +4 -0
  91. package/dist/robots/generate.js +86 -0
  92. package/dist/robots/generate.js.map +1 -0
  93. package/dist/robots/index.cjs +5 -0
  94. package/dist/robots/index.d.cts +3 -0
  95. package/dist/robots/index.d.ts +3 -0
  96. package/dist/robots/index.js +1 -0
  97. package/dist/robots/types.d.cts +27 -0
  98. package/dist/robots/types.d.ts +27 -0
  99. package/dist/schema/create-registry.cjs +12 -0
  100. package/dist/schema/create-registry.cjs.map +1 -0
  101. package/dist/schema/create-registry.d.cts +2 -0
  102. package/dist/schema/create-registry.d.ts +2 -0
  103. package/dist/schema/create-registry.js +12 -0
  104. package/dist/schema/create-registry.js.map +1 -0
  105. package/dist/schema/generated/index.d.cts +2 -0
  106. package/dist/schema/generated/schemaorg.cjs +36386 -0
  107. package/dist/schema/generated/schemaorg.cjs.map +1 -0
  108. package/dist/schema/generated/schemaorg.d.cts +945 -0
  109. package/dist/schema/generated/schemaorg.d.ts +945 -0
  110. package/dist/schema/generated/schemaorg.js +36384 -0
  111. package/dist/schema/generated/schemaorg.js.map +1 -0
  112. package/dist/schema/index.cjs +11 -0
  113. package/dist/schema/index.d.cts +7 -0
  114. package/dist/schema/index.d.ts +6 -0
  115. package/dist/schema/index.js +5 -0
  116. package/dist/schema/registry.cjs +194 -0
  117. package/dist/schema/registry.cjs.map +1 -0
  118. package/dist/schema/registry.d.cts +2 -0
  119. package/dist/schema/registry.d.ts +2 -0
  120. package/dist/schema/registry.js +194 -0
  121. package/dist/schema/registry.js.map +1 -0
  122. package/dist/schema/types.d.cts +79 -0
  123. package/dist/schema/types.d.ts +79 -0
  124. package/dist/schema/validate.cjs +131 -0
  125. package/dist/schema/validate.cjs.map +1 -0
  126. package/dist/schema/validate.d.cts +16 -0
  127. package/dist/schema/validate.d.ts +16 -0
  128. package/dist/schema/validate.js +131 -0
  129. package/dist/schema/validate.js.map +1 -0
  130. package/dist/server/handlers.cjs +96 -0
  131. package/dist/server/handlers.cjs.map +1 -0
  132. package/dist/server/handlers.d.cts +3 -0
  133. package/dist/server/handlers.d.ts +3 -0
  134. package/dist/server/handlers.js +95 -0
  135. package/dist/server/handlers.js.map +1 -0
  136. package/dist/server/index.cjs +6 -0
  137. package/dist/server/index.d.cts +4 -0
  138. package/dist/server/index.d.ts +4 -0
  139. package/dist/server/index.js +3 -0
  140. package/dist/server/routes.cjs +17 -0
  141. package/dist/server/routes.cjs.map +1 -0
  142. package/dist/server/routes.d.cts +2 -0
  143. package/dist/server/routes.d.ts +2 -0
  144. package/dist/server/routes.js +17 -0
  145. package/dist/server/routes.js.map +1 -0
  146. package/dist/server/types.d.cts +61 -0
  147. package/dist/server/types.d.ts +61 -0
  148. package/dist/sitemap/generate.cjs +147 -0
  149. package/dist/sitemap/generate.cjs.map +1 -0
  150. package/dist/sitemap/generate.d.cts +3 -0
  151. package/dist/sitemap/generate.d.ts +3 -0
  152. package/dist/sitemap/generate.js +146 -0
  153. package/dist/sitemap/generate.js.map +1 -0
  154. package/dist/sitemap/index.cjs +11 -0
  155. package/dist/sitemap/index.d.cts +4 -0
  156. package/dist/sitemap/index.d.ts +4 -0
  157. package/dist/sitemap/index.js +3 -0
  158. package/dist/sitemap/types.d.cts +82 -0
  159. package/dist/sitemap/types.d.ts +82 -0
  160. package/dist/sitemap/xml.cjs +215 -0
  161. package/dist/sitemap/xml.cjs.map +1 -0
  162. package/dist/sitemap/xml.d.cts +16 -0
  163. package/dist/sitemap/xml.d.ts +16 -0
  164. package/dist/sitemap/xml.js +210 -0
  165. package/dist/sitemap/xml.js.map +1 -0
  166. package/dist/tanstack/index.cjs +13 -0
  167. package/dist/tanstack/index.cjs.map +1 -0
  168. package/dist/tanstack/index.d.cts +19 -0
  169. package/dist/tanstack/index.d.ts +18 -0
  170. package/dist/tanstack/index.js +12 -0
  171. package/dist/tanstack/index.js.map +1 -0
  172. package/dist/testing/diagnostics.cjs +27 -0
  173. package/dist/testing/diagnostics.cjs.map +1 -0
  174. package/dist/testing/diagnostics.d.cts +3 -0
  175. package/dist/testing/diagnostics.d.ts +3 -0
  176. package/dist/testing/diagnostics.js +27 -0
  177. package/dist/testing/diagnostics.js.map +1 -0
  178. package/dist/testing/fixture.cjs +80 -0
  179. package/dist/testing/fixture.cjs.map +1 -0
  180. package/dist/testing/fixture.d.cts +4 -0
  181. package/dist/testing/fixture.d.ts +4 -0
  182. package/dist/testing/fixture.js +78 -0
  183. package/dist/testing/fixture.js.map +1 -0
  184. package/dist/testing/index.cjs +9 -0
  185. package/dist/testing/index.d.cts +5 -0
  186. package/dist/testing/index.d.ts +5 -0
  187. package/dist/testing/index.js +4 -0
  188. package/dist/testing/inspect.cjs +63 -0
  189. package/dist/testing/inspect.cjs.map +1 -0
  190. package/dist/testing/inspect.d.cts +5 -0
  191. package/dist/testing/inspect.d.ts +5 -0
  192. package/dist/testing/inspect.js +63 -0
  193. package/dist/testing/inspect.js.map +1 -0
  194. package/dist/testing/types.d.cts +40 -0
  195. package/dist/testing/types.d.ts +40 -0
  196. package/dist/urls/index.cjs +8 -0
  197. package/dist/urls/index.d.cts +3 -0
  198. package/dist/urls/index.d.ts +3 -0
  199. package/dist/urls/index.js +1 -0
  200. package/dist/urls/normalize.cjs +65 -0
  201. package/dist/urls/normalize.cjs.map +1 -0
  202. package/dist/urls/normalize.d.cts +14 -0
  203. package/dist/urls/normalize.d.ts +14 -0
  204. package/dist/urls/normalize.js +60 -0
  205. package/dist/urls/normalize.js.map +1 -0
  206. package/dist/urls/types.d.cts +22 -0
  207. package/dist/urls/types.d.ts +22 -0
  208. package/dist/validation/index.cjs +5 -0
  209. package/dist/validation/index.d.cts +3 -0
  210. package/dist/validation/index.d.ts +3 -0
  211. package/dist/validation/index.js +1 -0
  212. package/dist/validation/types.d.cts +75 -0
  213. package/dist/validation/types.d.ts +75 -0
  214. package/dist/validation/validate.cjs +452 -0
  215. package/dist/validation/validate.cjs.map +1 -0
  216. package/dist/validation/validate.d.cts +7 -0
  217. package/dist/validation/validate.d.ts +6 -0
  218. package/dist/validation/validate.js +450 -0
  219. package/dist/validation/validate.js.map +1 -0
  220. package/package.json +203 -4
@@ -0,0 +1,100 @@
1
+ "use client";
2
+ const require_resolve = require("../metadata/resolve.cjs");
3
+ const require_context = require("./context.cjs");
4
+ let react = require("react");
5
+ // src/react/metadata.tsx
6
+ const meta = (name, content) => {
7
+ if (content === void 0 || content === "") return null;
8
+ return (0, react.createElement)("meta", {
9
+ key: `name:${name}`,
10
+ name,
11
+ content
12
+ });
13
+ };
14
+ const property = (propertyName, content) => {
15
+ if (content === void 0 || content === "") return null;
16
+ return (0, react.createElement)("meta", {
17
+ key: `property:${propertyName}`,
18
+ property: propertyName,
19
+ content
20
+ });
21
+ };
22
+ const imageMeta = (image, index) => {
23
+ return [
24
+ property("og:image", image.url),
25
+ property("og:image:alt", image.alt),
26
+ property("og:image:width", image.width !== void 0 ? String(image.width) : void 0),
27
+ property("og:image:height", image.height !== void 0 ? String(image.height) : void 0),
28
+ property("og:image:type", image.type)
29
+ ].map((element, itemIndex) => element ? (0, react.createElement)(react.Fragment, {
30
+ key: `og-image:${index}:${itemIndex}`,
31
+ children: element
32
+ }) : null);
33
+ };
34
+ const renderMetadata = (resolved, config) => {
35
+ const robots = require_resolve.resolveSeoRobots(resolved, config);
36
+ return [
37
+ resolved.title ? (0, react.createElement)("title", {
38
+ key: "title",
39
+ children: resolved.title
40
+ }) : null,
41
+ meta("description", resolved.description),
42
+ meta("robots", robots),
43
+ meta("author", resolved.author),
44
+ meta("keywords", resolved.keywords?.join(", ")),
45
+ resolved.canonical ? (0, react.createElement)("link", {
46
+ key: "canonical",
47
+ rel: "canonical",
48
+ href: resolved.canonical
49
+ }) : null,
50
+ property("og:title", resolved.openGraph.title),
51
+ property("og:description", resolved.openGraph.description),
52
+ property("og:type", resolved.openGraph.type),
53
+ property("og:url", resolved.openGraph.url),
54
+ property("og:site_name", resolved.openGraph.siteName),
55
+ property("og:locale", resolved.openGraph.locale),
56
+ meta("twitter:card", resolved.twitter.card),
57
+ meta("twitter:title", resolved.twitter.title),
58
+ meta("twitter:description", resolved.twitter.description),
59
+ meta("twitter:site", resolved.twitter.site),
60
+ meta("twitter:creator", resolved.twitter.creator),
61
+ meta("twitter:image:alt", resolved.twitter.imageAlt),
62
+ ...(resolved.twitter.images ?? []).map((url, index) => meta(index === 0 ? "twitter:image" : `twitter:image${index + 1}`, url)),
63
+ ...(resolved.openGraph.images ?? []).flatMap(imageMeta),
64
+ ...(resolved.alternates?.alternates ?? []).map((alternate) => (0, react.createElement)("link", {
65
+ key: `alternate:${alternate.locale}`,
66
+ rel: "alternate",
67
+ hrefLang: alternate.locale,
68
+ href: alternate.url
69
+ })),
70
+ resolved.publishedTime ? property("article:published_time", resolved.publishedTime) : null,
71
+ resolved.modifiedTime ? property("article:modified_time", resolved.modifiedTime) : null
72
+ ].filter(Boolean);
73
+ };
74
+ /**
75
+ * Creates a nested metadata scope.
76
+ *
77
+ * Metadata is resolved once and shared with descendants.
78
+ */
79
+ const SeoMetadata = ({ metadata, children }) => {
80
+ const parent = require_context.useSeoReactContext();
81
+ const resolvedMetadata = require_resolve.resolveSeoMetadata(metadata, parent.config);
82
+ return (0, react.createElement)(require_context.SeoReactContext.Provider, { value: {
83
+ config: parent.config,
84
+ metadata: resolvedMetadata
85
+ } }, (0, react.createElement)(react.Fragment, null, ...renderMetadata(resolvedMetadata, parent.config), children));
86
+ };
87
+ /**
88
+ * Renders the active metadata scope.
89
+ *
90
+ * Prefer one metadata output component per document.
91
+ */
92
+ const SeoHead = () => {
93
+ const { config, metadata } = require_context.useSeoReactContext();
94
+ if (!metadata) return null;
95
+ return (0, react.createElement)(react.Fragment, null, ...renderMetadata(metadata, config));
96
+ };
97
+ exports.SeoHead = SeoHead;
98
+ exports.SeoMetadata = SeoMetadata;
99
+
100
+ //# sourceMappingURL=metadata.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.cjs","names":["createElement","Fragment","resolveSeoRobots","useSeoReactContext","resolveSeoMetadata","SeoReactContext"],"sources":["../../src/react/metadata.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, Fragment } from \"react\";\n\nimport type { ReactNode } from \"react\";\n\nimport type { ResolvedSeoMetadata, SeoSocialImage } from \"../metadata/types\";\n\nimport { resolveSeoMetadata, resolveSeoRobots } from \"../metadata\";\n\nimport type { SeoMetadataProps } from \"./types\";\n\nimport { SeoReactContext, useSeoReactContext } from \"./context\";\n\n// ---------------------------------------------------------------------------\n// Meta helpers\n// ---------------------------------------------------------------------------\n\nconst meta = (name: string, content: string | undefined) => {\n if (content === undefined || content === \"\") {\n return null;\n }\n\n return createElement(\"meta\", {\n key: `name:${name}`,\n name,\n content,\n });\n};\n\nconst property = (propertyName: string, content: string | undefined) => {\n if (content === undefined || content === \"\") {\n return null;\n }\n\n return createElement(\"meta\", {\n key: `property:${propertyName}`,\n property: propertyName,\n content,\n });\n};\n\nconst imageMeta = (image: SeoSocialImage, index: number) => {\n const entries = [\n property(\"og:image\", image.url),\n\n property(\"og:image:alt\", image.alt),\n\n property(\n \"og:image:width\",\n image.width !== undefined ? String(image.width) : undefined,\n ),\n\n property(\n \"og:image:height\",\n image.height !== undefined ? String(image.height) : undefined,\n ),\n\n property(\"og:image:type\", image.type),\n ];\n\n return entries.map((element, itemIndex) =>\n element\n ? createElement(Fragment, {\n key: `og-image:${index}:${itemIndex}`,\n children: element,\n })\n : null,\n );\n};\n\n// ---------------------------------------------------------------------------\n// Shared metadata renderer\n// ---------------------------------------------------------------------------\n\nconst renderMetadata = (\n resolved: ResolvedSeoMetadata,\n config: ReturnType<typeof useSeoReactContext>[\"config\"],\n) => {\n const robots = resolveSeoRobots(resolved, config);\n\n const elements = [\n resolved.title\n ? createElement(\"title\", {\n key: \"title\",\n children: resolved.title,\n })\n : null,\n\n meta(\"description\", resolved.description),\n\n meta(\"robots\", robots),\n\n meta(\"author\", resolved.author),\n\n meta(\"keywords\", resolved.keywords?.join(\", \")),\n\n resolved.canonical\n ? createElement(\"link\", {\n key: \"canonical\",\n rel: \"canonical\",\n href: resolved.canonical,\n })\n : null,\n\n // Open Graph\n property(\"og:title\", resolved.openGraph.title),\n\n property(\"og:description\", resolved.openGraph.description),\n\n property(\"og:type\", resolved.openGraph.type),\n\n property(\"og:url\", resolved.openGraph.url),\n\n property(\"og:site_name\", resolved.openGraph.siteName),\n\n property(\"og:locale\", resolved.openGraph.locale),\n\n // Twitter / X\n meta(\"twitter:card\", resolved.twitter.card),\n\n meta(\"twitter:title\", resolved.twitter.title),\n\n meta(\"twitter:description\", resolved.twitter.description),\n\n meta(\"twitter:site\", resolved.twitter.site),\n\n meta(\"twitter:creator\", resolved.twitter.creator),\n\n meta(\"twitter:image:alt\", resolved.twitter.imageAlt),\n\n ...(resolved.twitter.images ?? []).map((url, index) =>\n meta(index === 0 ? \"twitter:image\" : `twitter:image${index + 1}`, url),\n ),\n\n // Open Graph images\n ...(resolved.openGraph.images ?? []).flatMap(imageMeta),\n\n // Hreflang\n ...(resolved.alternates?.alternates ?? []).map((alternate) =>\n createElement(\"link\", {\n key: `alternate:${alternate.locale}`,\n rel: \"alternate\",\n hrefLang: alternate.locale,\n href: alternate.url,\n }),\n ),\n\n // Article metadata\n resolved.publishedTime\n ? property(\"article:published_time\", resolved.publishedTime)\n : null,\n\n resolved.modifiedTime\n ? property(\"article:modified_time\", resolved.modifiedTime)\n : null,\n ];\n\n return elements.filter(Boolean);\n};\n\n// ---------------------------------------------------------------------------\n// SeoMetadata\n// ---------------------------------------------------------------------------\n\nexport interface SeoMetadataComponentProps extends SeoMetadataProps {\n children?: ReactNode;\n}\n\n/**\n * Creates a nested metadata scope.\n *\n * Metadata is resolved once and shared with descendants.\n */\nexport const SeoMetadata = ({\n metadata,\n children,\n}: SeoMetadataComponentProps) => {\n const parent = useSeoReactContext();\n\n const resolvedMetadata = resolveSeoMetadata(metadata, parent.config);\n\n return createElement(\n SeoReactContext.Provider,\n {\n value: {\n config: parent.config,\n metadata: resolvedMetadata,\n },\n },\n createElement(\n Fragment,\n null,\n ...renderMetadata(resolvedMetadata, parent.config),\n children,\n ),\n );\n};\n\n// ---------------------------------------------------------------------------\n// SeoHead\n// ---------------------------------------------------------------------------\n\n/**\n * Renders the active metadata scope.\n *\n * Prefer one metadata output component per document.\n */\nexport const SeoHead = () => {\n const { config, metadata } = useSeoReactContext();\n\n if (!metadata) {\n return null;\n }\n\n return createElement(Fragment, null, ...renderMetadata(metadata, config));\n};\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { SeoReactContextValue } from "./context.cjs";
2
+ import { SeoMetadataProps } from "./types.cjs";
3
+ import { ReactNode } from "react";
4
+ export interface SeoMetadataComponentProps extends SeoMetadataProps {
5
+ children?: ReactNode;
6
+ }
7
+ /**
8
+ * Creates a nested metadata scope.
9
+ *
10
+ * Metadata is resolved once and shared with descendants.
11
+ */
12
+ export declare const SeoMetadata: ({ metadata, children }: SeoMetadataComponentProps) => import("react").FunctionComponentElement<import("react").ProviderProps<SeoReactContextValue | null>>;
13
+ /**
14
+ * Renders the active metadata scope.
15
+ *
16
+ * Prefer one metadata output component per document.
17
+ */
18
+ export declare const SeoHead: () => import("react").FunctionComponentElement<import("react").FragmentProps> | null;
@@ -0,0 +1,18 @@
1
+ import { SeoReactContextValue } from "./context.js";
2
+ import { SeoMetadataProps } from "./types.js";
3
+ import { ReactNode } from "react";
4
+ export interface SeoMetadataComponentProps extends SeoMetadataProps {
5
+ children?: ReactNode;
6
+ }
7
+ /**
8
+ * Creates a nested metadata scope.
9
+ *
10
+ * Metadata is resolved once and shared with descendants.
11
+ */
12
+ export declare const SeoMetadata: ({ metadata, children }: SeoMetadataComponentProps) => import("react").FunctionComponentElement<import("react").ProviderProps<SeoReactContextValue | null>>;
13
+ /**
14
+ * Renders the active metadata scope.
15
+ *
16
+ * Prefer one metadata output component per document.
17
+ */
18
+ export declare const SeoHead: () => import("react").FunctionComponentElement<import("react").FragmentProps> | null;
@@ -0,0 +1,99 @@
1
+ "use client";
2
+ import { resolveSeoMetadata, resolveSeoRobots } from "../metadata/resolve.js";
3
+ import { SeoReactContext, useSeoReactContext } from "./context.js";
4
+ import { Fragment, createElement } from "react";
5
+ // src/react/metadata.tsx
6
+ const meta = (name, content) => {
7
+ if (content === void 0 || content === "") return null;
8
+ return createElement("meta", {
9
+ key: `name:${name}`,
10
+ name,
11
+ content
12
+ });
13
+ };
14
+ const property = (propertyName, content) => {
15
+ if (content === void 0 || content === "") return null;
16
+ return createElement("meta", {
17
+ key: `property:${propertyName}`,
18
+ property: propertyName,
19
+ content
20
+ });
21
+ };
22
+ const imageMeta = (image, index) => {
23
+ return [
24
+ property("og:image", image.url),
25
+ property("og:image:alt", image.alt),
26
+ property("og:image:width", image.width !== void 0 ? String(image.width) : void 0),
27
+ property("og:image:height", image.height !== void 0 ? String(image.height) : void 0),
28
+ property("og:image:type", image.type)
29
+ ].map((element, itemIndex) => element ? createElement(Fragment, {
30
+ key: `og-image:${index}:${itemIndex}`,
31
+ children: element
32
+ }) : null);
33
+ };
34
+ const renderMetadata = (resolved, config) => {
35
+ const robots = resolveSeoRobots(resolved, config);
36
+ return [
37
+ resolved.title ? createElement("title", {
38
+ key: "title",
39
+ children: resolved.title
40
+ }) : null,
41
+ meta("description", resolved.description),
42
+ meta("robots", robots),
43
+ meta("author", resolved.author),
44
+ meta("keywords", resolved.keywords?.join(", ")),
45
+ resolved.canonical ? createElement("link", {
46
+ key: "canonical",
47
+ rel: "canonical",
48
+ href: resolved.canonical
49
+ }) : null,
50
+ property("og:title", resolved.openGraph.title),
51
+ property("og:description", resolved.openGraph.description),
52
+ property("og:type", resolved.openGraph.type),
53
+ property("og:url", resolved.openGraph.url),
54
+ property("og:site_name", resolved.openGraph.siteName),
55
+ property("og:locale", resolved.openGraph.locale),
56
+ meta("twitter:card", resolved.twitter.card),
57
+ meta("twitter:title", resolved.twitter.title),
58
+ meta("twitter:description", resolved.twitter.description),
59
+ meta("twitter:site", resolved.twitter.site),
60
+ meta("twitter:creator", resolved.twitter.creator),
61
+ meta("twitter:image:alt", resolved.twitter.imageAlt),
62
+ ...(resolved.twitter.images ?? []).map((url, index) => meta(index === 0 ? "twitter:image" : `twitter:image${index + 1}`, url)),
63
+ ...(resolved.openGraph.images ?? []).flatMap(imageMeta),
64
+ ...(resolved.alternates?.alternates ?? []).map((alternate) => createElement("link", {
65
+ key: `alternate:${alternate.locale}`,
66
+ rel: "alternate",
67
+ hrefLang: alternate.locale,
68
+ href: alternate.url
69
+ })),
70
+ resolved.publishedTime ? property("article:published_time", resolved.publishedTime) : null,
71
+ resolved.modifiedTime ? property("article:modified_time", resolved.modifiedTime) : null
72
+ ].filter(Boolean);
73
+ };
74
+ /**
75
+ * Creates a nested metadata scope.
76
+ *
77
+ * Metadata is resolved once and shared with descendants.
78
+ */
79
+ const SeoMetadata = ({ metadata, children }) => {
80
+ const parent = useSeoReactContext();
81
+ const resolvedMetadata = resolveSeoMetadata(metadata, parent.config);
82
+ return createElement(SeoReactContext.Provider, { value: {
83
+ config: parent.config,
84
+ metadata: resolvedMetadata
85
+ } }, createElement(Fragment, null, ...renderMetadata(resolvedMetadata, parent.config), children));
86
+ };
87
+ /**
88
+ * Renders the active metadata scope.
89
+ *
90
+ * Prefer one metadata output component per document.
91
+ */
92
+ const SeoHead = () => {
93
+ const { config, metadata } = useSeoReactContext();
94
+ if (!metadata) return null;
95
+ return createElement(Fragment, null, ...renderMetadata(metadata, config));
96
+ };
97
+ export { SeoHead, SeoMetadata };
98
+
99
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","names":[],"sources":["../../src/react/metadata.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, Fragment } from \"react\";\n\nimport type { ReactNode } from \"react\";\n\nimport type { ResolvedSeoMetadata, SeoSocialImage } from \"../metadata/types\";\n\nimport { resolveSeoMetadata, resolveSeoRobots } from \"../metadata\";\n\nimport type { SeoMetadataProps } from \"./types\";\n\nimport { SeoReactContext, useSeoReactContext } from \"./context\";\n\n// ---------------------------------------------------------------------------\n// Meta helpers\n// ---------------------------------------------------------------------------\n\nconst meta = (name: string, content: string | undefined) => {\n if (content === undefined || content === \"\") {\n return null;\n }\n\n return createElement(\"meta\", {\n key: `name:${name}`,\n name,\n content,\n });\n};\n\nconst property = (propertyName: string, content: string | undefined) => {\n if (content === undefined || content === \"\") {\n return null;\n }\n\n return createElement(\"meta\", {\n key: `property:${propertyName}`,\n property: propertyName,\n content,\n });\n};\n\nconst imageMeta = (image: SeoSocialImage, index: number) => {\n const entries = [\n property(\"og:image\", image.url),\n\n property(\"og:image:alt\", image.alt),\n\n property(\n \"og:image:width\",\n image.width !== undefined ? String(image.width) : undefined,\n ),\n\n property(\n \"og:image:height\",\n image.height !== undefined ? String(image.height) : undefined,\n ),\n\n property(\"og:image:type\", image.type),\n ];\n\n return entries.map((element, itemIndex) =>\n element\n ? createElement(Fragment, {\n key: `og-image:${index}:${itemIndex}`,\n children: element,\n })\n : null,\n );\n};\n\n// ---------------------------------------------------------------------------\n// Shared metadata renderer\n// ---------------------------------------------------------------------------\n\nconst renderMetadata = (\n resolved: ResolvedSeoMetadata,\n config: ReturnType<typeof useSeoReactContext>[\"config\"],\n) => {\n const robots = resolveSeoRobots(resolved, config);\n\n const elements = [\n resolved.title\n ? createElement(\"title\", {\n key: \"title\",\n children: resolved.title,\n })\n : null,\n\n meta(\"description\", resolved.description),\n\n meta(\"robots\", robots),\n\n meta(\"author\", resolved.author),\n\n meta(\"keywords\", resolved.keywords?.join(\", \")),\n\n resolved.canonical\n ? createElement(\"link\", {\n key: \"canonical\",\n rel: \"canonical\",\n href: resolved.canonical,\n })\n : null,\n\n // Open Graph\n property(\"og:title\", resolved.openGraph.title),\n\n property(\"og:description\", resolved.openGraph.description),\n\n property(\"og:type\", resolved.openGraph.type),\n\n property(\"og:url\", resolved.openGraph.url),\n\n property(\"og:site_name\", resolved.openGraph.siteName),\n\n property(\"og:locale\", resolved.openGraph.locale),\n\n // Twitter / X\n meta(\"twitter:card\", resolved.twitter.card),\n\n meta(\"twitter:title\", resolved.twitter.title),\n\n meta(\"twitter:description\", resolved.twitter.description),\n\n meta(\"twitter:site\", resolved.twitter.site),\n\n meta(\"twitter:creator\", resolved.twitter.creator),\n\n meta(\"twitter:image:alt\", resolved.twitter.imageAlt),\n\n ...(resolved.twitter.images ?? []).map((url, index) =>\n meta(index === 0 ? \"twitter:image\" : `twitter:image${index + 1}`, url),\n ),\n\n // Open Graph images\n ...(resolved.openGraph.images ?? []).flatMap(imageMeta),\n\n // Hreflang\n ...(resolved.alternates?.alternates ?? []).map((alternate) =>\n createElement(\"link\", {\n key: `alternate:${alternate.locale}`,\n rel: \"alternate\",\n hrefLang: alternate.locale,\n href: alternate.url,\n }),\n ),\n\n // Article metadata\n resolved.publishedTime\n ? property(\"article:published_time\", resolved.publishedTime)\n : null,\n\n resolved.modifiedTime\n ? property(\"article:modified_time\", resolved.modifiedTime)\n : null,\n ];\n\n return elements.filter(Boolean);\n};\n\n// ---------------------------------------------------------------------------\n// SeoMetadata\n// ---------------------------------------------------------------------------\n\nexport interface SeoMetadataComponentProps extends SeoMetadataProps {\n children?: ReactNode;\n}\n\n/**\n * Creates a nested metadata scope.\n *\n * Metadata is resolved once and shared with descendants.\n */\nexport const SeoMetadata = ({\n metadata,\n children,\n}: SeoMetadataComponentProps) => {\n const parent = useSeoReactContext();\n\n const resolvedMetadata = resolveSeoMetadata(metadata, parent.config);\n\n return createElement(\n SeoReactContext.Provider,\n {\n value: {\n config: parent.config,\n metadata: resolvedMetadata,\n },\n },\n createElement(\n Fragment,\n null,\n ...renderMetadata(resolvedMetadata, parent.config),\n children,\n ),\n );\n};\n\n// ---------------------------------------------------------------------------\n// SeoHead\n// ---------------------------------------------------------------------------\n\n/**\n * Renders the active metadata scope.\n *\n * Prefer one metadata output component per document.\n */\nexport const SeoHead = () => {\n const { config, metadata } = useSeoReactContext();\n\n if (!metadata) {\n return null;\n }\n\n return createElement(Fragment, null, ...renderMetadata(metadata, config));\n};\n"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ const require_config = require("../context/config.cjs");
3
+ const require_resolve = require("../metadata/resolve.cjs");
4
+ const require_context = require("./context.cjs");
5
+ const require_schema_components = require("./schema-components.cjs");
6
+ const require_validate = require("../validation/validate.cjs");
7
+ let react = require("react");
8
+ // src/react/provider.tsx
9
+ const SeoProvider = ({ config, metadata, children, validation, onValidation, ...schemaOptions }) => {
10
+ const resolvedConfig = (0, react.useMemo)(() => require_config.normalizeSeoConfig(config), [config]);
11
+ const resolvedMetadata = (0, react.useMemo)(() => {
12
+ try {
13
+ return require_resolve.resolveSeoMetadata(metadata ?? {}, resolvedConfig);
14
+ } catch (error) {
15
+ const options = require_schema_components.normalizeValidation(validation ?? {});
16
+ if (options !== false && metadata) require_schema_components.assertSeoValidationReport(require_validate.validateSeo({ metadata }, {
17
+ ...options,
18
+ baseUrl: options.baseUrl ?? resolvedConfig.siteUrl
19
+ }));
20
+ throw error;
21
+ }
22
+ }, [
23
+ metadata,
24
+ resolvedConfig,
25
+ validation
26
+ ]);
27
+ const contextValue = (0, react.useMemo)(() => ({
28
+ config: resolvedConfig,
29
+ metadata: resolvedMetadata
30
+ }), [resolvedConfig, resolvedMetadata]);
31
+ return (0, react.createElement)(require_context.SeoReactContext.Provider, { value: contextValue }, (0, react.createElement)(require_schema_components.SeoProvider, {
32
+ config: resolvedConfig,
33
+ metadata: resolvedMetadata,
34
+ validation,
35
+ onValidation,
36
+ ...schemaOptions,
37
+ children
38
+ }));
39
+ };
40
+ exports.SeoProvider = SeoProvider;
41
+
42
+ //# sourceMappingURL=provider.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.cjs","names":["useMemo","normalizeSeoConfig","resolveSeoMetadata","normalizeValidation","validateSeo","createElement","SeoReactContext","SeoSchemaProvider"],"sources":["../../src/react/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, useMemo } from \"react\";\n\nimport { normalizeSeoConfig } from \"../context\";\n\nimport { resolveSeoMetadata } from \"../metadata\";\n\nimport type { SeoProviderProps } from \"./types\";\n\nimport { SeoReactContext } from \"./context\";\n\nimport {\n assertSeoValidationReport,\n normalizeValidation,\n SeoProvider as SeoSchemaProvider,\n} from \"./schema-components\";\n\nimport { validateSeo } from \"../validation/validate\";\n\nexport const SeoProvider = ({\n config,\n metadata,\n children,\n validation,\n onValidation,\n ...schemaOptions\n}: SeoProviderProps) => {\n const resolvedConfig = useMemo(() => normalizeSeoConfig(config), [config]);\n\n const resolvedMetadata = useMemo(() => {\n try {\n return resolveSeoMetadata(metadata ?? {}, resolvedConfig);\n } catch (error) {\n // Report unresolvable metadata (e.g. unsafe URLs) as validation\n // errors in strict mode instead of the raw resolution error.\n const options = normalizeValidation(validation ?? {});\n\n if (options !== false && metadata) {\n assertSeoValidationReport(\n validateSeo(\n { metadata },\n {\n ...options,\n baseUrl: options.baseUrl ?? resolvedConfig.siteUrl,\n },\n ),\n );\n }\n\n throw error;\n }\n }, [metadata, resolvedConfig, validation]);\n\n const contextValue = useMemo(\n () => ({\n config: resolvedConfig,\n metadata: resolvedMetadata,\n }),\n [resolvedConfig, resolvedMetadata],\n );\n\n return createElement(\n SeoReactContext.Provider,\n {\n value: contextValue,\n },\n createElement(SeoSchemaProvider, {\n config: resolvedConfig,\n metadata: resolvedMetadata,\n validation,\n onValidation,\n ...schemaOptions,\n children,\n }),\n );\n};\n"],"mappings":";;;;;;;;AAoBA,MAAa,eAAe,EAC1B,QACA,UACA,UACA,YACA,cACA,GAAG,oBACmB;CACtB,MAAM,kBAAA,GAAiBA,MAAAA,QAAAA,OAAcC,eAAAA,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzE,MAAM,oBAAA,GAAmBD,MAAAA,QAAAA,OAAc;EACrC,IAAI;GACF,OAAOE,gBAAAA,mBAAmB,YAAY,CAAC,GAAG,cAAc;EAC1D,SAAS,OAAO;GAGd,MAAM,UAAUC,0BAAAA,oBAAoB,cAAc,CAAC,CAAC;GAEpD,IAAI,YAAY,SAAS,UACvB,0BAAA,0BACEC,iBAAAA,YACE,EAAE,SAAS,GACX;IACE,GAAG;IACH,SAAS,QAAQ,WAAW,eAAe;GAC7C,CACF,CACF;GAGF,MAAM;EACR;CACF,GAAG;EAAC;EAAU;EAAgB;CAAU,CAAC;CAEzC,MAAM,gBAAA,GAAeJ,MAAAA,QAAAA,QACZ;EACL,QAAQ;EACR,UAAU;CACZ,IACA,CAAC,gBAAgB,gBAAgB,CACnC;CAEA,QAAA,GAAOK,MAAAA,cAAAA,CACLC,gBAAAA,gBAAgB,UAChB,EACE,OAAO,aACT,IAAA,GACAD,MAAAA,cAAAA,CAAcE,0BAAAA,aAAmB;EAC/B,QAAQ;EACR,UAAU;EACV;EACA;EACA,GAAG;EACH;CACF,CAAC,CACH;AACF"}
@@ -0,0 +1,3 @@
1
+ import { SeoReactContextValue } from "./context.cjs";
2
+ import { SeoProviderProps } from "./types.cjs";
3
+ export declare const SeoProvider: ({ config, metadata, children, validation, onValidation, ...schemaOptions }: SeoProviderProps) => import("react").FunctionComponentElement<import("react").ProviderProps<SeoReactContextValue | null>>;
@@ -0,0 +1,3 @@
1
+ import { SeoReactContextValue } from "./context.js";
2
+ import { SeoProviderProps } from "./types.js";
3
+ export declare const SeoProvider: ({ config, metadata, children, validation, onValidation, ...schemaOptions }: SeoProviderProps) => import("react").FunctionComponentElement<import("react").ProviderProps<SeoReactContextValue | null>>;
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { normalizeSeoConfig } from "../context/config.js";
3
+ import { resolveSeoMetadata } from "../metadata/resolve.js";
4
+ import { SeoReactContext } from "./context.js";
5
+ import { SeoProvider as SeoProvider$1, assertSeoValidationReport, normalizeValidation } from "./schema-components.js";
6
+ import { validateSeo } from "../validation/validate.js";
7
+ import { createElement, useMemo } from "react";
8
+ // src/react/provider.tsx
9
+ const SeoProvider = ({ config, metadata, children, validation, onValidation, ...schemaOptions }) => {
10
+ const resolvedConfig = useMemo(() => normalizeSeoConfig(config), [config]);
11
+ const resolvedMetadata = useMemo(() => {
12
+ try {
13
+ return resolveSeoMetadata(metadata ?? {}, resolvedConfig);
14
+ } catch (error) {
15
+ const options = normalizeValidation(validation ?? {});
16
+ if (options !== false && metadata) assertSeoValidationReport(validateSeo({ metadata }, {
17
+ ...options,
18
+ baseUrl: options.baseUrl ?? resolvedConfig.siteUrl
19
+ }));
20
+ throw error;
21
+ }
22
+ }, [
23
+ metadata,
24
+ resolvedConfig,
25
+ validation
26
+ ]);
27
+ const contextValue = useMemo(() => ({
28
+ config: resolvedConfig,
29
+ metadata: resolvedMetadata
30
+ }), [resolvedConfig, resolvedMetadata]);
31
+ return createElement(SeoReactContext.Provider, { value: contextValue }, createElement(SeoProvider$1, {
32
+ config: resolvedConfig,
33
+ metadata: resolvedMetadata,
34
+ validation,
35
+ onValidation,
36
+ ...schemaOptions,
37
+ children
38
+ }));
39
+ };
40
+ export { SeoProvider };
41
+
42
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","names":["SeoSchemaProvider"],"sources":["../../src/react/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, useMemo } from \"react\";\n\nimport { normalizeSeoConfig } from \"../context\";\n\nimport { resolveSeoMetadata } from \"../metadata\";\n\nimport type { SeoProviderProps } from \"./types\";\n\nimport { SeoReactContext } from \"./context\";\n\nimport {\n assertSeoValidationReport,\n normalizeValidation,\n SeoProvider as SeoSchemaProvider,\n} from \"./schema-components\";\n\nimport { validateSeo } from \"../validation/validate\";\n\nexport const SeoProvider = ({\n config,\n metadata,\n children,\n validation,\n onValidation,\n ...schemaOptions\n}: SeoProviderProps) => {\n const resolvedConfig = useMemo(() => normalizeSeoConfig(config), [config]);\n\n const resolvedMetadata = useMemo(() => {\n try {\n return resolveSeoMetadata(metadata ?? {}, resolvedConfig);\n } catch (error) {\n // Report unresolvable metadata (e.g. unsafe URLs) as validation\n // errors in strict mode instead of the raw resolution error.\n const options = normalizeValidation(validation ?? {});\n\n if (options !== false && metadata) {\n assertSeoValidationReport(\n validateSeo(\n { metadata },\n {\n ...options,\n baseUrl: options.baseUrl ?? resolvedConfig.siteUrl,\n },\n ),\n );\n }\n\n throw error;\n }\n }, [metadata, resolvedConfig, validation]);\n\n const contextValue = useMemo(\n () => ({\n config: resolvedConfig,\n metadata: resolvedMetadata,\n }),\n [resolvedConfig, resolvedMetadata],\n );\n\n return createElement(\n SeoReactContext.Provider,\n {\n value: contextValue,\n },\n createElement(SeoSchemaProvider, {\n config: resolvedConfig,\n metadata: resolvedMetadata,\n validation,\n onValidation,\n ...schemaOptions,\n children,\n }),\n );\n};\n"],"mappings":";;;;;;;;AAoBA,MAAa,eAAe,EAC1B,QACA,UACA,UACA,YACA,cACA,GAAG,oBACmB;CACtB,MAAM,iBAAiB,cAAc,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzE,MAAM,mBAAmB,cAAc;EACrC,IAAI;GACF,OAAO,mBAAmB,YAAY,CAAC,GAAG,cAAc;EAC1D,SAAS,OAAO;GAGd,MAAM,UAAU,oBAAoB,cAAc,CAAC,CAAC;GAEpD,IAAI,YAAY,SAAS,UACvB,0BACE,YACE,EAAE,SAAS,GACX;IACE,GAAG;IACH,SAAS,QAAQ,WAAW,eAAe;GAC7C,CACF,CACF;GAGF,MAAM;EACR;CACF,GAAG;EAAC;EAAU;EAAgB;CAAU,CAAC;CAEzC,MAAM,eAAe,eACZ;EACL,QAAQ;EACR,UAAU;CACZ,IACA,CAAC,gBAAgB,gBAAgB,CACnC;CAEA,OAAO,cACL,gBAAgB,UAChB,EACE,OAAO,aACT,GACA,cAAcA,eAAmB;EAC/B,QAAQ;EACR,UAAU;EACV;EACA;EACA,GAAG;EACH;CACF,CAAC,CACH;AACF"}