vinext 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/build/static-export.d.ts +78 -0
  4. package/dist/build/static-export.d.ts.map +1 -0
  5. package/dist/build/static-export.js +553 -0
  6. package/dist/build/static-export.js.map +1 -0
  7. package/dist/check.d.ts +52 -0
  8. package/dist/check.d.ts.map +1 -0
  9. package/dist/check.js +483 -0
  10. package/dist/check.js.map +1 -0
  11. package/dist/cli.d.ts +15 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +565 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/client/entry.d.ts +2 -0
  16. package/dist/client/entry.d.ts.map +1 -0
  17. package/dist/client/entry.js +85 -0
  18. package/dist/client/entry.js.map +1 -0
  19. package/dist/cloudflare/index.d.ts +8 -0
  20. package/dist/cloudflare/index.d.ts.map +1 -0
  21. package/dist/cloudflare/index.js +8 -0
  22. package/dist/cloudflare/index.js.map +1 -0
  23. package/dist/cloudflare/kv-cache-handler.d.ts +68 -0
  24. package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -0
  25. package/dist/cloudflare/kv-cache-handler.js +304 -0
  26. package/dist/cloudflare/kv-cache-handler.js.map +1 -0
  27. package/dist/cloudflare/tpr.d.ts +78 -0
  28. package/dist/cloudflare/tpr.d.ts.map +1 -0
  29. package/dist/cloudflare/tpr.js +672 -0
  30. package/dist/cloudflare/tpr.js.map +1 -0
  31. package/dist/config/config-matchers.d.ts +106 -0
  32. package/dist/config/config-matchers.d.ts.map +1 -0
  33. package/dist/config/config-matchers.js +499 -0
  34. package/dist/config/config-matchers.js.map +1 -0
  35. package/dist/config/next-config.d.ts +153 -0
  36. package/dist/config/next-config.d.ts.map +1 -0
  37. package/dist/config/next-config.js +274 -0
  38. package/dist/config/next-config.js.map +1 -0
  39. package/dist/deploy.d.ts +87 -0
  40. package/dist/deploy.d.ts.map +1 -0
  41. package/dist/deploy.js +644 -0
  42. package/dist/deploy.js.map +1 -0
  43. package/dist/index.d.ts +156 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +3287 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/init.d.ts +55 -0
  48. package/dist/init.d.ts.map +1 -0
  49. package/dist/init.js +201 -0
  50. package/dist/init.js.map +1 -0
  51. package/dist/routing/app-router.d.ts +96 -0
  52. package/dist/routing/app-router.d.ts.map +1 -0
  53. package/dist/routing/app-router.js +815 -0
  54. package/dist/routing/app-router.js.map +1 -0
  55. package/dist/routing/pages-router.d.ts +52 -0
  56. package/dist/routing/pages-router.d.ts.map +1 -0
  57. package/dist/routing/pages-router.js +239 -0
  58. package/dist/routing/pages-router.js.map +1 -0
  59. package/dist/server/api-handler.d.ts +18 -0
  60. package/dist/server/api-handler.d.ts.map +1 -0
  61. package/dist/server/api-handler.js +169 -0
  62. package/dist/server/api-handler.js.map +1 -0
  63. package/dist/server/app-dev-server.d.ts +42 -0
  64. package/dist/server/app-dev-server.d.ts.map +1 -0
  65. package/dist/server/app-dev-server.js +2718 -0
  66. package/dist/server/app-dev-server.js.map +1 -0
  67. package/dist/server/app-router-entry.d.ts +18 -0
  68. package/dist/server/app-router-entry.d.ts.map +1 -0
  69. package/dist/server/app-router-entry.js +34 -0
  70. package/dist/server/app-router-entry.js.map +1 -0
  71. package/dist/server/dev-server.d.ts +40 -0
  72. package/dist/server/dev-server.d.ts.map +1 -0
  73. package/dist/server/dev-server.js +758 -0
  74. package/dist/server/dev-server.js.map +1 -0
  75. package/dist/server/html.d.ts +22 -0
  76. package/dist/server/html.d.ts.map +1 -0
  77. package/dist/server/html.js +29 -0
  78. package/dist/server/html.js.map +1 -0
  79. package/dist/server/image-optimization.d.ts +56 -0
  80. package/dist/server/image-optimization.d.ts.map +1 -0
  81. package/dist/server/image-optimization.js +103 -0
  82. package/dist/server/image-optimization.js.map +1 -0
  83. package/dist/server/instrumentation.d.ts +68 -0
  84. package/dist/server/instrumentation.d.ts.map +1 -0
  85. package/dist/server/instrumentation.js +90 -0
  86. package/dist/server/instrumentation.js.map +1 -0
  87. package/dist/server/isr-cache.d.ts +61 -0
  88. package/dist/server/isr-cache.d.ts.map +1 -0
  89. package/dist/server/isr-cache.js +134 -0
  90. package/dist/server/isr-cache.js.map +1 -0
  91. package/dist/server/metadata-routes.d.ts +103 -0
  92. package/dist/server/metadata-routes.d.ts.map +1 -0
  93. package/dist/server/metadata-routes.js +270 -0
  94. package/dist/server/metadata-routes.js.map +1 -0
  95. package/dist/server/middleware.d.ts +77 -0
  96. package/dist/server/middleware.d.ts.map +1 -0
  97. package/dist/server/middleware.js +228 -0
  98. package/dist/server/middleware.js.map +1 -0
  99. package/dist/server/prod-server.d.ts +78 -0
  100. package/dist/server/prod-server.d.ts.map +1 -0
  101. package/dist/server/prod-server.js +712 -0
  102. package/dist/server/prod-server.js.map +1 -0
  103. package/dist/shims/amp.d.ts +17 -0
  104. package/dist/shims/amp.d.ts.map +1 -0
  105. package/dist/shims/amp.js +21 -0
  106. package/dist/shims/amp.js.map +1 -0
  107. package/dist/shims/app.d.ts +12 -0
  108. package/dist/shims/app.d.ts.map +1 -0
  109. package/dist/shims/app.js +2 -0
  110. package/dist/shims/app.js.map +1 -0
  111. package/dist/shims/cache-runtime.d.ts +68 -0
  112. package/dist/shims/cache-runtime.d.ts.map +1 -0
  113. package/dist/shims/cache-runtime.js +437 -0
  114. package/dist/shims/cache-runtime.js.map +1 -0
  115. package/dist/shims/cache.d.ts +243 -0
  116. package/dist/shims/cache.d.ts.map +1 -0
  117. package/dist/shims/cache.js +415 -0
  118. package/dist/shims/cache.js.map +1 -0
  119. package/dist/shims/client-only.d.ts +18 -0
  120. package/dist/shims/client-only.d.ts.map +1 -0
  121. package/dist/shims/client-only.js +18 -0
  122. package/dist/shims/client-only.js.map +1 -0
  123. package/dist/shims/config.d.ts +27 -0
  124. package/dist/shims/config.d.ts.map +1 -0
  125. package/dist/shims/config.js +30 -0
  126. package/dist/shims/config.js.map +1 -0
  127. package/dist/shims/constants.d.ts +13 -0
  128. package/dist/shims/constants.d.ts.map +1 -0
  129. package/dist/shims/constants.js +13 -0
  130. package/dist/shims/constants.js.map +1 -0
  131. package/dist/shims/document.d.ts +33 -0
  132. package/dist/shims/document.d.ts.map +1 -0
  133. package/dist/shims/document.js +32 -0
  134. package/dist/shims/document.js.map +1 -0
  135. package/dist/shims/dynamic.d.ts +33 -0
  136. package/dist/shims/dynamic.d.ts.map +1 -0
  137. package/dist/shims/dynamic.js +148 -0
  138. package/dist/shims/dynamic.js.map +1 -0
  139. package/dist/shims/error-boundary.d.ts +33 -0
  140. package/dist/shims/error-boundary.d.ts.map +1 -0
  141. package/dist/shims/error-boundary.js +88 -0
  142. package/dist/shims/error-boundary.js.map +1 -0
  143. package/dist/shims/error.d.ts +16 -0
  144. package/dist/shims/error.d.ts.map +1 -0
  145. package/dist/shims/error.js +45 -0
  146. package/dist/shims/error.js.map +1 -0
  147. package/dist/shims/fetch-cache.d.ts +61 -0
  148. package/dist/shims/fetch-cache.d.ts.map +1 -0
  149. package/dist/shims/fetch-cache.js +307 -0
  150. package/dist/shims/fetch-cache.js.map +1 -0
  151. package/dist/shims/font-google.d.ts +122 -0
  152. package/dist/shims/font-google.d.ts.map +1 -0
  153. package/dist/shims/font-google.js +387 -0
  154. package/dist/shims/font-google.js.map +1 -0
  155. package/dist/shims/font-local.d.ts +61 -0
  156. package/dist/shims/font-local.d.ts.map +1 -0
  157. package/dist/shims/font-local.js +303 -0
  158. package/dist/shims/font-local.js.map +1 -0
  159. package/dist/shims/form.d.ts +30 -0
  160. package/dist/shims/form.d.ts.map +1 -0
  161. package/dist/shims/form.js +78 -0
  162. package/dist/shims/form.js.map +1 -0
  163. package/dist/shims/head-state.d.ts +11 -0
  164. package/dist/shims/head-state.d.ts.map +1 -0
  165. package/dist/shims/head-state.js +47 -0
  166. package/dist/shims/head-state.js.map +1 -0
  167. package/dist/shims/head.d.ts +28 -0
  168. package/dist/shims/head.d.ts.map +1 -0
  169. package/dist/shims/head.js +148 -0
  170. package/dist/shims/head.js.map +1 -0
  171. package/dist/shims/headers.d.ts +150 -0
  172. package/dist/shims/headers.d.ts.map +1 -0
  173. package/dist/shims/headers.js +412 -0
  174. package/dist/shims/headers.js.map +1 -0
  175. package/dist/shims/image-config.d.ts +30 -0
  176. package/dist/shims/image-config.d.ts.map +1 -0
  177. package/dist/shims/image-config.js +91 -0
  178. package/dist/shims/image-config.js.map +1 -0
  179. package/dist/shims/image.d.ts +63 -0
  180. package/dist/shims/image.d.ts.map +1 -0
  181. package/dist/shims/image.js +284 -0
  182. package/dist/shims/image.js.map +1 -0
  183. package/dist/shims/internal/api-utils.d.ts +12 -0
  184. package/dist/shims/internal/api-utils.d.ts.map +1 -0
  185. package/dist/shims/internal/api-utils.js +7 -0
  186. package/dist/shims/internal/api-utils.js.map +1 -0
  187. package/dist/shims/internal/app-router-context.d.ts +21 -0
  188. package/dist/shims/internal/app-router-context.d.ts.map +1 -0
  189. package/dist/shims/internal/app-router-context.js +15 -0
  190. package/dist/shims/internal/app-router-context.js.map +1 -0
  191. package/dist/shims/internal/cookies.d.ts +9 -0
  192. package/dist/shims/internal/cookies.d.ts.map +1 -0
  193. package/dist/shims/internal/cookies.js +9 -0
  194. package/dist/shims/internal/cookies.js.map +1 -0
  195. package/dist/shims/internal/router-context.d.ts +2 -0
  196. package/dist/shims/internal/router-context.d.ts.map +1 -0
  197. package/dist/shims/internal/router-context.js +9 -0
  198. package/dist/shims/internal/router-context.js.map +1 -0
  199. package/dist/shims/internal/utils.d.ts +48 -0
  200. package/dist/shims/internal/utils.d.ts.map +1 -0
  201. package/dist/shims/internal/utils.js +35 -0
  202. package/dist/shims/internal/utils.js.map +1 -0
  203. package/dist/shims/internal/work-unit-async-storage.d.ts +12 -0
  204. package/dist/shims/internal/work-unit-async-storage.d.ts.map +1 -0
  205. package/dist/shims/internal/work-unit-async-storage.js +13 -0
  206. package/dist/shims/internal/work-unit-async-storage.js.map +1 -0
  207. package/dist/shims/layout-segment-context.d.ts +21 -0
  208. package/dist/shims/layout-segment-context.d.ts.map +1 -0
  209. package/dist/shims/layout-segment-context.js +27 -0
  210. package/dist/shims/layout-segment-context.js.map +1 -0
  211. package/dist/shims/legacy-image.d.ts +52 -0
  212. package/dist/shims/legacy-image.d.ts.map +1 -0
  213. package/dist/shims/legacy-image.js +46 -0
  214. package/dist/shims/legacy-image.js.map +1 -0
  215. package/dist/shims/link.d.ts +48 -0
  216. package/dist/shims/link.d.ts.map +1 -0
  217. package/dist/shims/link.js +395 -0
  218. package/dist/shims/link.js.map +1 -0
  219. package/dist/shims/metadata.d.ts +184 -0
  220. package/dist/shims/metadata.d.ts.map +1 -0
  221. package/dist/shims/metadata.js +472 -0
  222. package/dist/shims/metadata.js.map +1 -0
  223. package/dist/shims/navigation-state.d.ts +14 -0
  224. package/dist/shims/navigation-state.d.ts.map +1 -0
  225. package/dist/shims/navigation-state.js +77 -0
  226. package/dist/shims/navigation-state.js.map +1 -0
  227. package/dist/shims/navigation.d.ts +201 -0
  228. package/dist/shims/navigation.d.ts.map +1 -0
  229. package/dist/shims/navigation.js +672 -0
  230. package/dist/shims/navigation.js.map +1 -0
  231. package/dist/shims/og.d.ts +20 -0
  232. package/dist/shims/og.d.ts.map +1 -0
  233. package/dist/shims/og.js +19 -0
  234. package/dist/shims/og.js.map +1 -0
  235. package/dist/shims/router-state.d.ts +11 -0
  236. package/dist/shims/router-state.d.ts.map +1 -0
  237. package/dist/shims/router-state.js +56 -0
  238. package/dist/shims/router-state.js.map +1 -0
  239. package/dist/shims/router.d.ts +103 -0
  240. package/dist/shims/router.d.ts.map +1 -0
  241. package/dist/shims/router.js +536 -0
  242. package/dist/shims/router.js.map +1 -0
  243. package/dist/shims/script.d.ts +58 -0
  244. package/dist/shims/script.d.ts.map +1 -0
  245. package/dist/shims/script.js +163 -0
  246. package/dist/shims/script.js.map +1 -0
  247. package/dist/shims/server-only.d.ts +19 -0
  248. package/dist/shims/server-only.d.ts.map +1 -0
  249. package/dist/shims/server-only.js +19 -0
  250. package/dist/shims/server-only.js.map +1 -0
  251. package/dist/shims/server.d.ts +178 -0
  252. package/dist/shims/server.d.ts.map +1 -0
  253. package/dist/shims/server.js +377 -0
  254. package/dist/shims/server.js.map +1 -0
  255. package/dist/shims/web-vitals.d.ts +24 -0
  256. package/dist/shims/web-vitals.d.ts.map +1 -0
  257. package/dist/shims/web-vitals.js +17 -0
  258. package/dist/shims/web-vitals.js.map +1 -0
  259. package/dist/utils/hash.d.ts +6 -0
  260. package/dist/utils/hash.d.ts.map +1 -0
  261. package/dist/utils/hash.js +20 -0
  262. package/dist/utils/hash.js.map +1 -0
  263. package/dist/utils/project.d.ts +36 -0
  264. package/dist/utils/project.d.ts.map +1 -0
  265. package/dist/utils/project.js +112 -0
  266. package/dist/utils/project.js.map +1 -0
  267. package/dist/utils/query.d.ts +10 -0
  268. package/dist/utils/query.d.ts.map +1 -0
  269. package/dist/utils/query.js +27 -0
  270. package/dist/utils/query.js.map +1 -0
  271. package/package.json +65 -7
  272. package/index.js +0 -1
@@ -0,0 +1,184 @@
1
+ export interface Viewport {
2
+ /** Viewport width (default: "device-width") */
3
+ width?: string | number;
4
+ /** Viewport height */
5
+ height?: string | number;
6
+ /** Initial scale */
7
+ initialScale?: number;
8
+ /** Minimum scale */
9
+ minimumScale?: number;
10
+ /** Maximum scale */
11
+ maximumScale?: number;
12
+ /** Whether user can scale */
13
+ userScalable?: boolean;
14
+ /** Theme color — single color or array of { media, color } */
15
+ themeColor?: string | Array<{
16
+ media?: string;
17
+ color: string;
18
+ }>;
19
+ /** Color scheme: 'light' | 'dark' | 'light dark' | 'normal' */
20
+ colorScheme?: string;
21
+ }
22
+ /**
23
+ * Resolve viewport config from a module. Handles both static `viewport` export
24
+ * and async `generateViewport()` function.
25
+ */
26
+ export declare function resolveModuleViewport(mod: Record<string, unknown>, params: Record<string, string | string[]>): Promise<Viewport | null>;
27
+ /**
28
+ * Merge viewport configs from multiple sources (layouts + page).
29
+ * Later entries override earlier ones.
30
+ */
31
+ export declare function mergeViewport(viewportList: Viewport[]): Viewport;
32
+ /**
33
+ * React component that renders viewport meta tags into <head>.
34
+ */
35
+ export declare function ViewportHead({ viewport }: {
36
+ viewport: Viewport;
37
+ }): import("react/jsx-runtime").JSX.Element;
38
+ export interface Metadata {
39
+ title?: string | {
40
+ default?: string;
41
+ template?: string;
42
+ absolute?: string;
43
+ };
44
+ description?: string;
45
+ generator?: string;
46
+ applicationName?: string;
47
+ referrer?: string;
48
+ keywords?: string | string[];
49
+ authors?: Array<{
50
+ name?: string;
51
+ url?: string;
52
+ }> | {
53
+ name?: string;
54
+ url?: string;
55
+ };
56
+ creator?: string;
57
+ publisher?: string;
58
+ robots?: string | {
59
+ index?: boolean;
60
+ follow?: boolean;
61
+ googleBot?: string | {
62
+ index?: boolean;
63
+ follow?: boolean;
64
+ [key: string]: unknown;
65
+ };
66
+ [key: string]: unknown;
67
+ };
68
+ openGraph?: {
69
+ title?: string;
70
+ description?: string;
71
+ url?: string;
72
+ siteName?: string;
73
+ images?: string | Array<{
74
+ url: string;
75
+ width?: number;
76
+ height?: number;
77
+ alt?: string;
78
+ }>;
79
+ videos?: Array<{
80
+ url: string;
81
+ width?: number;
82
+ height?: number;
83
+ }>;
84
+ audio?: Array<{
85
+ url: string;
86
+ }>;
87
+ locale?: string;
88
+ type?: string;
89
+ publishedTime?: string;
90
+ modifiedTime?: string;
91
+ authors?: string[];
92
+ };
93
+ twitter?: {
94
+ card?: string;
95
+ site?: string;
96
+ siteId?: string;
97
+ title?: string;
98
+ description?: string;
99
+ images?: string | string[] | Array<{
100
+ url: string;
101
+ alt?: string;
102
+ width?: number;
103
+ height?: number;
104
+ }>;
105
+ creator?: string;
106
+ creatorId?: string;
107
+ };
108
+ icons?: {
109
+ icon?: string | Array<{
110
+ url: string;
111
+ sizes?: string;
112
+ type?: string;
113
+ media?: string;
114
+ }>;
115
+ shortcut?: string | string[];
116
+ apple?: string | Array<{
117
+ url: string;
118
+ sizes?: string;
119
+ type?: string;
120
+ }>;
121
+ other?: Array<{
122
+ rel: string;
123
+ url: string;
124
+ sizes?: string;
125
+ type?: string;
126
+ }>;
127
+ };
128
+ manifest?: string;
129
+ alternates?: {
130
+ canonical?: string;
131
+ languages?: Record<string, string>;
132
+ media?: Record<string, string>;
133
+ types?: Record<string, string>;
134
+ };
135
+ verification?: {
136
+ google?: string;
137
+ yahoo?: string;
138
+ yandex?: string;
139
+ other?: Record<string, string | string[]>;
140
+ };
141
+ metadataBase?: URL | null;
142
+ appleWebApp?: {
143
+ capable?: boolean;
144
+ title?: string;
145
+ statusBarStyle?: string;
146
+ startupImage?: string | Array<{
147
+ url: string;
148
+ media?: string;
149
+ }>;
150
+ };
151
+ formatDetection?: {
152
+ email?: boolean;
153
+ address?: boolean;
154
+ telephone?: boolean;
155
+ };
156
+ category?: string;
157
+ other?: Record<string, string | string[]>;
158
+ [key: string]: unknown;
159
+ }
160
+ /**
161
+ * Merge metadata from multiple sources (layouts + page).
162
+ *
163
+ * The list is ordered [rootLayout, nestedLayout, ..., page].
164
+ * Title template from layouts applies to the page title but NOT to
165
+ * the segment that defines the template itself. `title.absolute`
166
+ * skips all templates. `title.default` is the fallback when no
167
+ * child provides a title.
168
+ *
169
+ * Shallow merge: later entries override earlier ones (per Next.js docs).
170
+ */
171
+ export declare function mergeMetadata(metadataList: Metadata[]): Metadata;
172
+ /**
173
+ * Resolve metadata from a module. Handles both static `metadata` export
174
+ * and async `generateMetadata()` function.
175
+ */
176
+ export declare function resolveModuleMetadata(mod: Record<string, unknown>, params: Record<string, string | string[]>, searchParams?: Record<string, string>): Promise<Metadata | null>;
177
+ /**
178
+ * React component that renders metadata as HTML head elements.
179
+ * Used by the RSC entry to inject into the <head>.
180
+ */
181
+ export declare function MetadataHead({ metadata }: {
182
+ metadata: Metadata;
183
+ }): import("react/jsx-runtime").JSX.Element;
184
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/shims/metadata.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,472 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * Resolve viewport config from a module. Handles both static `viewport` export
4
+ * and async `generateViewport()` function.
5
+ */
6
+ export async function resolveModuleViewport(mod, params) {
7
+ if (typeof mod.generateViewport === "function") {
8
+ const asyncParams = Object.assign(Promise.resolve(params), params);
9
+ return await mod.generateViewport({ params: asyncParams });
10
+ }
11
+ if (mod.viewport && typeof mod.viewport === "object") {
12
+ return mod.viewport;
13
+ }
14
+ return null;
15
+ }
16
+ /**
17
+ * Merge viewport configs from multiple sources (layouts + page).
18
+ * Later entries override earlier ones.
19
+ */
20
+ export function mergeViewport(viewportList) {
21
+ const merged = {};
22
+ for (const vp of viewportList) {
23
+ Object.assign(merged, vp);
24
+ }
25
+ return merged;
26
+ }
27
+ /**
28
+ * React component that renders viewport meta tags into <head>.
29
+ */
30
+ export function ViewportHead({ viewport }) {
31
+ const elements = [];
32
+ let key = 0;
33
+ // Build viewport content string
34
+ const parts = [];
35
+ if (viewport.width !== undefined)
36
+ parts.push(`width=${viewport.width}`);
37
+ if (viewport.height !== undefined)
38
+ parts.push(`height=${viewport.height}`);
39
+ if (viewport.initialScale !== undefined)
40
+ parts.push(`initial-scale=${viewport.initialScale}`);
41
+ if (viewport.minimumScale !== undefined)
42
+ parts.push(`minimum-scale=${viewport.minimumScale}`);
43
+ if (viewport.maximumScale !== undefined)
44
+ parts.push(`maximum-scale=${viewport.maximumScale}`);
45
+ if (viewport.userScalable !== undefined)
46
+ parts.push(`user-scalable=${viewport.userScalable ? "yes" : "no"}`);
47
+ if (parts.length > 0) {
48
+ elements.push(_jsx("meta", { name: "viewport", content: parts.join(", ") }, key++));
49
+ }
50
+ // Theme color
51
+ if (viewport.themeColor) {
52
+ if (typeof viewport.themeColor === "string") {
53
+ elements.push(_jsx("meta", { name: "theme-color", content: viewport.themeColor }, key++));
54
+ }
55
+ else if (Array.isArray(viewport.themeColor)) {
56
+ for (const entry of viewport.themeColor) {
57
+ elements.push(_jsx("meta", { name: "theme-color", content: entry.color, ...(entry.media ? { media: entry.media } : {}) }, key++));
58
+ }
59
+ }
60
+ }
61
+ // Color scheme
62
+ if (viewport.colorScheme) {
63
+ elements.push(_jsx("meta", { name: "color-scheme", content: viewport.colorScheme }, key++));
64
+ }
65
+ return _jsx(_Fragment, { children: elements });
66
+ }
67
+ /**
68
+ * Merge metadata from multiple sources (layouts + page).
69
+ *
70
+ * The list is ordered [rootLayout, nestedLayout, ..., page].
71
+ * Title template from layouts applies to the page title but NOT to
72
+ * the segment that defines the template itself. `title.absolute`
73
+ * skips all templates. `title.default` is the fallback when no
74
+ * child provides a title.
75
+ *
76
+ * Shallow merge: later entries override earlier ones (per Next.js docs).
77
+ */
78
+ export function mergeMetadata(metadataList) {
79
+ if (metadataList.length === 0)
80
+ return {};
81
+ const merged = {};
82
+ // Track the most recent title template from LAYOUTS (not from page).
83
+ // The page is always the last entry in metadataList.
84
+ let parentTemplate;
85
+ for (let i = 0; i < metadataList.length; i++) {
86
+ const meta = metadataList[i];
87
+ const isPage = i === metadataList.length - 1;
88
+ // Collect template from layouts only (page templates are ignored per Next.js spec)
89
+ if (!isPage && meta.title && typeof meta.title === "object" && meta.title.template) {
90
+ parentTemplate = meta.title.template;
91
+ }
92
+ // Shallow merge — later entries override earlier for top-level keys
93
+ for (const key of Object.keys(meta)) {
94
+ if (key === "title")
95
+ continue; // Handle title separately below
96
+ merged[key] = meta[key];
97
+ }
98
+ // Title resolution
99
+ if (meta.title !== undefined) {
100
+ merged.title = meta.title;
101
+ }
102
+ }
103
+ // Now resolve the final title, applying the parent template if applicable
104
+ const finalTitle = merged.title;
105
+ if (finalTitle) {
106
+ if (typeof finalTitle === "string") {
107
+ // Simple string title — apply parent template
108
+ if (parentTemplate) {
109
+ merged.title = parentTemplate.replace("%s", finalTitle);
110
+ }
111
+ }
112
+ else if (typeof finalTitle === "object") {
113
+ if (finalTitle.absolute) {
114
+ // Absolute title — skip all templates
115
+ merged.title = finalTitle.absolute;
116
+ }
117
+ else if (finalTitle.default) {
118
+ // Title object with default — this is used when the segment IS the
119
+ // defining layout (its own default doesn't get template-wrapped)
120
+ merged.title = finalTitle.default;
121
+ }
122
+ else if (finalTitle.template && !finalTitle.default && !finalTitle.absolute) {
123
+ // Template only with no default — no title to render
124
+ merged.title = undefined;
125
+ }
126
+ }
127
+ }
128
+ return merged;
129
+ }
130
+ /**
131
+ * Resolve metadata from a module. Handles both static `metadata` export
132
+ * and async `generateMetadata()` function.
133
+ */
134
+ export async function resolveModuleMetadata(mod, params, searchParams) {
135
+ if (typeof mod.generateMetadata === "function") {
136
+ // Next.js 16 passes params/searchParams as Promises (async pattern).
137
+ // Create thenable objects that work both as Promises and plain objects.
138
+ const asyncParams = Object.assign(Promise.resolve(params), params);
139
+ const sp = searchParams ?? {};
140
+ const asyncSp = Object.assign(Promise.resolve(sp), sp);
141
+ return await mod.generateMetadata({ params: asyncParams, searchParams: asyncSp });
142
+ }
143
+ if (mod.metadata && typeof mod.metadata === "object") {
144
+ return mod.metadata;
145
+ }
146
+ return null;
147
+ }
148
+ /**
149
+ * React component that renders metadata as HTML head elements.
150
+ * Used by the RSC entry to inject into the <head>.
151
+ */
152
+ export function MetadataHead({ metadata }) {
153
+ const elements = [];
154
+ let key = 0;
155
+ // Resolve metadataBase for URL composition
156
+ const base = metadata.metadataBase;
157
+ function resolveUrl(url) {
158
+ if (!url)
159
+ return undefined;
160
+ if (!base)
161
+ return url;
162
+ if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("//"))
163
+ return url;
164
+ try {
165
+ return new URL(url, base).toString();
166
+ }
167
+ catch {
168
+ return url;
169
+ }
170
+ }
171
+ // Title
172
+ const title = typeof metadata.title === "string"
173
+ ? metadata.title
174
+ : typeof metadata.title === "object"
175
+ ? metadata.title.absolute || metadata.title.default
176
+ : undefined;
177
+ if (title) {
178
+ elements.push(_jsx("title", { children: title }, key++));
179
+ }
180
+ // Description
181
+ if (metadata.description) {
182
+ elements.push(_jsx("meta", { name: "description", content: metadata.description }, key++));
183
+ }
184
+ // Generator
185
+ if (metadata.generator) {
186
+ elements.push(_jsx("meta", { name: "generator", content: metadata.generator }, key++));
187
+ }
188
+ // Application name
189
+ if (metadata.applicationName) {
190
+ elements.push(_jsx("meta", { name: "application-name", content: metadata.applicationName }, key++));
191
+ }
192
+ // Referrer
193
+ if (metadata.referrer) {
194
+ elements.push(_jsx("meta", { name: "referrer", content: metadata.referrer }, key++));
195
+ }
196
+ // Keywords
197
+ if (metadata.keywords) {
198
+ const kw = Array.isArray(metadata.keywords)
199
+ ? metadata.keywords.join(",")
200
+ : metadata.keywords;
201
+ elements.push(_jsx("meta", { name: "keywords", content: kw }, key++));
202
+ }
203
+ // Authors
204
+ if (metadata.authors) {
205
+ const authorList = Array.isArray(metadata.authors)
206
+ ? metadata.authors
207
+ : [metadata.authors];
208
+ for (const author of authorList) {
209
+ if (author.name) {
210
+ elements.push(_jsx("meta", { name: "author", content: author.name }, key++));
211
+ }
212
+ if (author.url) {
213
+ elements.push(_jsx("link", { rel: "author", href: author.url }, key++));
214
+ }
215
+ }
216
+ }
217
+ // Creator
218
+ if (metadata.creator) {
219
+ elements.push(_jsx("meta", { name: "creator", content: metadata.creator }, key++));
220
+ }
221
+ // Publisher
222
+ if (metadata.publisher) {
223
+ elements.push(_jsx("meta", { name: "publisher", content: metadata.publisher }, key++));
224
+ }
225
+ // Format detection
226
+ if (metadata.formatDetection) {
227
+ const parts = [];
228
+ if (metadata.formatDetection.telephone === false)
229
+ parts.push("telephone=no");
230
+ if (metadata.formatDetection.address === false)
231
+ parts.push("address=no");
232
+ if (metadata.formatDetection.email === false)
233
+ parts.push("email=no");
234
+ if (parts.length > 0) {
235
+ elements.push(_jsx("meta", { name: "format-detection", content: parts.join(", ") }, key++));
236
+ }
237
+ }
238
+ // Category
239
+ if (metadata.category) {
240
+ elements.push(_jsx("meta", { name: "category", content: metadata.category }, key++));
241
+ }
242
+ // Robots
243
+ if (metadata.robots) {
244
+ if (typeof metadata.robots === "string") {
245
+ elements.push(_jsx("meta", { name: "robots", content: metadata.robots }, key++));
246
+ }
247
+ else {
248
+ const { googleBot, ...robotsRest } = metadata.robots;
249
+ const robotParts = [];
250
+ for (const [k, v] of Object.entries(robotsRest)) {
251
+ if (v === true)
252
+ robotParts.push(k);
253
+ else if (v === false)
254
+ robotParts.push(`no${k}`);
255
+ else if (typeof v === "string" || typeof v === "number")
256
+ robotParts.push(`${k}:${v}`);
257
+ }
258
+ if (robotParts.length > 0) {
259
+ elements.push(_jsx("meta", { name: "robots", content: robotParts.join(", ") }, key++));
260
+ }
261
+ // googlebot
262
+ if (googleBot) {
263
+ if (typeof googleBot === "string") {
264
+ elements.push(_jsx("meta", { name: "googlebot", content: googleBot }, key++));
265
+ }
266
+ else {
267
+ const gbParts = [];
268
+ for (const [k, v] of Object.entries(googleBot)) {
269
+ if (v === true)
270
+ gbParts.push(k);
271
+ else if (v === false)
272
+ gbParts.push(`no${k}`);
273
+ else if (typeof v === "string" || typeof v === "number")
274
+ gbParts.push(`${k}:${v}`);
275
+ }
276
+ if (gbParts.length > 0) {
277
+ elements.push(_jsx("meta", { name: "googlebot", content: gbParts.join(", ") }, key++));
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+ // Open Graph
284
+ if (metadata.openGraph) {
285
+ const og = metadata.openGraph;
286
+ if (og.title)
287
+ elements.push(_jsx("meta", { property: "og:title", content: og.title }, key++));
288
+ if (og.description)
289
+ elements.push(_jsx("meta", { property: "og:description", content: og.description }, key++));
290
+ if (og.url)
291
+ elements.push(_jsx("meta", { property: "og:url", content: resolveUrl(og.url) ?? og.url }, key++));
292
+ if (og.siteName)
293
+ elements.push(_jsx("meta", { property: "og:site_name", content: og.siteName }, key++));
294
+ if (og.type)
295
+ elements.push(_jsx("meta", { property: "og:type", content: og.type }, key++));
296
+ if (og.locale)
297
+ elements.push(_jsx("meta", { property: "og:locale", content: og.locale }, key++));
298
+ if (og.publishedTime)
299
+ elements.push(_jsx("meta", { property: "article:published_time", content: og.publishedTime }, key++));
300
+ if (og.modifiedTime)
301
+ elements.push(_jsx("meta", { property: "article:modified_time", content: og.modifiedTime }, key++));
302
+ if (og.authors) {
303
+ for (const author of og.authors) {
304
+ elements.push(_jsx("meta", { property: "article:author", content: author }, key++));
305
+ }
306
+ }
307
+ if (og.images) {
308
+ const imgList = typeof og.images === "string" ? [{ url: og.images }] : og.images;
309
+ for (const img of imgList) {
310
+ const imgUrl = typeof img === "string" ? img : img.url;
311
+ elements.push(_jsx("meta", { property: "og:image", content: resolveUrl(imgUrl) ?? imgUrl }, key++));
312
+ if (typeof img !== "string") {
313
+ if (img.width)
314
+ elements.push(_jsx("meta", { property: "og:image:width", content: String(img.width) }, key++));
315
+ if (img.height)
316
+ elements.push(_jsx("meta", { property: "og:image:height", content: String(img.height) }, key++));
317
+ if (img.alt)
318
+ elements.push(_jsx("meta", { property: "og:image:alt", content: img.alt }, key++));
319
+ }
320
+ }
321
+ }
322
+ if (og.videos) {
323
+ for (const video of og.videos) {
324
+ elements.push(_jsx("meta", { property: "og:video", content: resolveUrl(video.url) ?? video.url }, key++));
325
+ if (video.width)
326
+ elements.push(_jsx("meta", { property: "og:video:width", content: String(video.width) }, key++));
327
+ if (video.height)
328
+ elements.push(_jsx("meta", { property: "og:video:height", content: String(video.height) }, key++));
329
+ }
330
+ }
331
+ if (og.audio) {
332
+ for (const audio of og.audio) {
333
+ elements.push(_jsx("meta", { property: "og:audio", content: resolveUrl(audio.url) ?? audio.url }, key++));
334
+ }
335
+ }
336
+ }
337
+ // Twitter
338
+ if (metadata.twitter) {
339
+ const tw = metadata.twitter;
340
+ if (tw.card)
341
+ elements.push(_jsx("meta", { name: "twitter:card", content: tw.card }, key++));
342
+ if (tw.site)
343
+ elements.push(_jsx("meta", { name: "twitter:site", content: tw.site }, key++));
344
+ if (tw.siteId)
345
+ elements.push(_jsx("meta", { name: "twitter:site:id", content: tw.siteId }, key++));
346
+ if (tw.title)
347
+ elements.push(_jsx("meta", { name: "twitter:title", content: tw.title }, key++));
348
+ if (tw.description)
349
+ elements.push(_jsx("meta", { name: "twitter:description", content: tw.description }, key++));
350
+ if (tw.creator)
351
+ elements.push(_jsx("meta", { name: "twitter:creator", content: tw.creator }, key++));
352
+ if (tw.creatorId)
353
+ elements.push(_jsx("meta", { name: "twitter:creator:id", content: tw.creatorId }, key++));
354
+ if (tw.images) {
355
+ const imgList = typeof tw.images === "string"
356
+ ? [tw.images]
357
+ : Array.isArray(tw.images) ? tw.images : [];
358
+ for (const img of imgList) {
359
+ const imgUrl = typeof img === "string" ? img : img.url;
360
+ elements.push(_jsx("meta", { name: "twitter:image", content: resolveUrl(imgUrl) ?? imgUrl }, key++));
361
+ if (typeof img !== "string" && img.alt) {
362
+ elements.push(_jsx("meta", { name: "twitter:image:alt", content: img.alt }, key++));
363
+ }
364
+ }
365
+ }
366
+ }
367
+ // Icons
368
+ if (metadata.icons) {
369
+ const { icon, shortcut, apple, other } = metadata.icons;
370
+ // Shortcut icon
371
+ if (shortcut) {
372
+ const shortcuts = Array.isArray(shortcut) ? shortcut : [shortcut];
373
+ for (const s of shortcuts) {
374
+ elements.push(_jsx("link", { rel: "shortcut icon", href: resolveUrl(s) ?? s }, key++));
375
+ }
376
+ }
377
+ // Icon
378
+ if (icon) {
379
+ const icons = typeof icon === "string" ? [{ url: icon }] : icon;
380
+ for (const i of icons) {
381
+ elements.push(_jsx("link", { rel: "icon", href: resolveUrl(i.url) ?? i.url, ...(i.sizes ? { sizes: i.sizes } : {}), ...(i.type ? { type: i.type } : {}), ...(i.media ? { media: i.media } : {}) }, key++));
382
+ }
383
+ }
384
+ // Apple touch icon
385
+ if (apple) {
386
+ const apples = typeof apple === "string" ? [{ url: apple }] : apple;
387
+ for (const a of apples) {
388
+ elements.push(_jsx("link", { rel: "apple-touch-icon", href: resolveUrl(a.url) ?? a.url, ...(a.sizes ? { sizes: a.sizes } : {}), ...(a.type ? { type: a.type } : {}) }, key++));
389
+ }
390
+ }
391
+ // Other custom icon relations
392
+ if (other) {
393
+ for (const o of other) {
394
+ elements.push(_jsx("link", { rel: o.rel, href: resolveUrl(o.url) ?? o.url, ...(o.sizes ? { sizes: o.sizes } : {}) }, key++));
395
+ }
396
+ }
397
+ }
398
+ // Manifest
399
+ if (metadata.manifest) {
400
+ elements.push(_jsx("link", { rel: "manifest", href: resolveUrl(metadata.manifest) ?? metadata.manifest }, key++));
401
+ }
402
+ // Alternates
403
+ if (metadata.alternates) {
404
+ const alt = metadata.alternates;
405
+ if (alt.canonical) {
406
+ elements.push(_jsx("link", { rel: "canonical", href: resolveUrl(alt.canonical) ?? alt.canonical }, key++));
407
+ }
408
+ if (alt.languages) {
409
+ for (const [lang, href] of Object.entries(alt.languages)) {
410
+ elements.push(_jsx("link", { rel: "alternate", hrefLang: lang, href: resolveUrl(href) ?? href }, key++));
411
+ }
412
+ }
413
+ if (alt.media) {
414
+ for (const [media, href] of Object.entries(alt.media)) {
415
+ elements.push(_jsx("link", { rel: "alternate", media: media, href: resolveUrl(href) ?? href }, key++));
416
+ }
417
+ }
418
+ if (alt.types) {
419
+ for (const [type, href] of Object.entries(alt.types)) {
420
+ elements.push(_jsx("link", { rel: "alternate", type: type, href: resolveUrl(href) ?? href }, key++));
421
+ }
422
+ }
423
+ }
424
+ // Verification
425
+ if (metadata.verification) {
426
+ const v = metadata.verification;
427
+ if (v.google)
428
+ elements.push(_jsx("meta", { name: "google-site-verification", content: v.google }, key++));
429
+ if (v.yahoo)
430
+ elements.push(_jsx("meta", { name: "y_key", content: v.yahoo }, key++));
431
+ if (v.yandex)
432
+ elements.push(_jsx("meta", { name: "yandex-verification", content: v.yandex }, key++));
433
+ if (v.other) {
434
+ for (const [name, content] of Object.entries(v.other)) {
435
+ const values = Array.isArray(content) ? content : [content];
436
+ for (const val of values) {
437
+ elements.push(_jsx("meta", { name: name, content: val }, key++));
438
+ }
439
+ }
440
+ }
441
+ }
442
+ // Apple Web App
443
+ if (metadata.appleWebApp) {
444
+ const awa = metadata.appleWebApp;
445
+ if (awa.capable !== false) {
446
+ elements.push(_jsx("meta", { name: "mobile-web-app-capable", content: "yes" }, key++));
447
+ }
448
+ if (awa.title) {
449
+ elements.push(_jsx("meta", { name: "apple-mobile-web-app-title", content: awa.title }, key++));
450
+ }
451
+ if (awa.statusBarStyle) {
452
+ elements.push(_jsx("meta", { name: "apple-mobile-web-app-status-bar-style", content: awa.statusBarStyle }, key++));
453
+ }
454
+ if (awa.startupImage) {
455
+ const imgs = typeof awa.startupImage === "string" ? [{ url: awa.startupImage }] : awa.startupImage;
456
+ for (const img of imgs) {
457
+ elements.push(_jsx("link", { rel: "apple-touch-startup-image", href: resolveUrl(img.url) ?? img.url, ...(img.media ? { media: img.media } : {}) }, key++));
458
+ }
459
+ }
460
+ }
461
+ // Other custom meta tags
462
+ if (metadata.other) {
463
+ for (const [name, content] of Object.entries(metadata.other)) {
464
+ const values = Array.isArray(content) ? content : [content];
465
+ for (const val of values) {
466
+ elements.push(_jsx("meta", { name: name, content: val }, key++));
467
+ }
468
+ }
469
+ }
470
+ return _jsx(_Fragment, { children: elements });
471
+ }
472
+ //# sourceMappingURL=metadata.js.map