@withl5e/l5e 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/entry-server.js +123 -90
- package/dist/entry-server.js.map +1 -1
- package/dist/{generateMetadata-DLMaI0EO.js → generateMetadata-CIFVlViV.js} +4 -4
- package/dist/{generateMetadata-DLMaI0EO.js.map → generateMetadata-CIFVlViV.js.map} +1 -1
- package/dist/index.js +39 -37
- package/dist/island/runtime.js +9 -8
- package/dist/island/runtime.js.map +1 -1
- package/dist/island.js +36 -23
- package/dist/island.js.map +1 -1
- package/dist/{jsx-runtime-DVQ9eOji.js → jsx-runtime-Bokflh8Q.js} +68 -55
- package/dist/jsx-runtime-Bokflh8Q.js.map +1 -0
- package/dist/jsx-runtime.js +12 -10
- package/dist/{render-BF7iTagJ.js → render-DTXfJu0d.js} +2 -2
- package/dist/{render-BF7iTagJ.js.map → render-DTXfJu0d.js.map} +1 -1
- package/dist/seo.js +2 -2
- package/dist/server.js +1 -1
- package/dist/vite-plugin.js +69 -67
- package/dist/vite-plugin.js.map +1 -1
- package/package.json +17 -1
- package/src/core/entry-server.ts +67 -1
- package/src/core/jsx-runtime.ts +33 -0
- package/src/core/vite-plugin.ts +12 -0
- package/src/island/ClientIsland.ts +36 -1
- package/src/island/runtime.ts +10 -3
- package/src/island/types.ts +1 -0
- package/dist/jsx-runtime-DVQ9eOji.js.map +0 -1
package/dist/entry-server.js
CHANGED
|
@@ -1,124 +1,157 @@
|
|
|
1
|
-
import { r as
|
|
2
|
-
import { M as
|
|
3
|
-
import { N as
|
|
4
|
-
import {
|
|
5
|
-
import { viewLoaders as
|
|
6
|
-
import
|
|
7
|
-
import { globalLoader as
|
|
8
|
-
import { loadMiddleware as
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { r as g, s as _ } from "./render-DTXfJu0d.js";
|
|
2
|
+
import { M as z } from "./generateMetadata-CIFVlViV.js";
|
|
3
|
+
import { N as G, I as b, R as U, H as Y, S as H } from "./exceptions-CHPz01DJ.js";
|
|
4
|
+
import { s as K, t as V, b as P, p as T, n as N, l as w, i as Q, a as W, H as X, d as D, e as j, h as Z, g as B, f as A, j as q } from "./jsx-runtime-Bokflh8Q.js";
|
|
5
|
+
import { viewLoaders as k, viewComponents as f } from "virtual:l5e-views";
|
|
6
|
+
import ee from "virtual:l5e-route";
|
|
7
|
+
import { globalLoader as y } from "virtual:l5e-global-loader";
|
|
8
|
+
import { loadMiddleware as we } from "virtual:l5e-middleware";
|
|
9
|
+
import { islandModules as te } from "virtual:l5e-islands";
|
|
10
|
+
async function ae(o) {
|
|
11
|
+
const s = q();
|
|
12
|
+
if (s.length === 0) return o;
|
|
13
|
+
let t, n;
|
|
14
|
+
try {
|
|
15
|
+
[{ renderToString: t }, { createElement: n }] = await Promise.all([
|
|
16
|
+
import("react-dom/server"),
|
|
17
|
+
import("react")
|
|
18
|
+
]);
|
|
19
|
+
} catch (a) {
|
|
20
|
+
console.error("[l5e-island] SSR requires react-dom/server + react:", a);
|
|
21
|
+
for (const r of s)
|
|
22
|
+
o = o.replace(`<!--${r.token}-->`, "").replace(` data-island-ssr="${r.token}"`, "");
|
|
23
|
+
return o;
|
|
24
|
+
}
|
|
25
|
+
for (const a of s)
|
|
26
|
+
try {
|
|
27
|
+
const r = te["/" + a.src];
|
|
28
|
+
if (!r)
|
|
29
|
+
throw new Error(`island module not found in glob: /${a.src}`);
|
|
30
|
+
const c = await r(), i = c[a.name] ?? c.default;
|
|
31
|
+
if (!i)
|
|
32
|
+
throw new Error(`no export "${a.name}" or default in /${a.src}`);
|
|
33
|
+
const d = t(n(i, a.props));
|
|
34
|
+
o = o.replace(`<!--${a.token}-->`, () => d).replace(`data-island-ssr="${a.token}"`, 'data-island-ssr="1"');
|
|
35
|
+
} catch (r) {
|
|
36
|
+
console.error(`[l5e-island] Failed to SSR island "${a.name}":`, r), o = o.replace(`<!--${a.token}-->`, "").replace(` data-island-ssr="${a.token}"`, "");
|
|
37
|
+
}
|
|
38
|
+
return o;
|
|
39
|
+
}
|
|
40
|
+
async function O(o, s) {
|
|
41
|
+
const t = "_error", n = `/src/views/${t}/index.tsx`;
|
|
11
42
|
V(t);
|
|
12
|
-
const
|
|
13
|
-
if (
|
|
14
|
-
const
|
|
15
|
-
statusCode:
|
|
16
|
-
message:
|
|
17
|
-
data:
|
|
18
|
-
},
|
|
43
|
+
const a = f[n] ? await f[n]() : null;
|
|
44
|
+
if (a?.default) {
|
|
45
|
+
const r = {
|
|
46
|
+
statusCode: o.statusCode,
|
|
47
|
+
message: o.message,
|
|
48
|
+
data: o.data
|
|
49
|
+
}, c = a.default, i = g(w(c, r)), d = D(), v = j(), u = A(), E = u.length > 0 ? u.map((l) => g(l)).join(`
|
|
19
50
|
`) : void 0;
|
|
20
51
|
return {
|
|
21
|
-
html:
|
|
22
|
-
scripts:
|
|
23
|
-
styles: v.map((
|
|
52
|
+
html: i,
|
|
53
|
+
scripts: d.map((l) => l.path),
|
|
54
|
+
styles: v.map((l) => l.path),
|
|
24
55
|
head: E,
|
|
25
|
-
lang:
|
|
26
|
-
statusCode:
|
|
56
|
+
lang: s,
|
|
57
|
+
statusCode: o.statusCode
|
|
27
58
|
};
|
|
28
59
|
} else {
|
|
29
|
-
const
|
|
60
|
+
const r = w("div", {}, `${o.statusCode} - ${o.message}`);
|
|
30
61
|
return {
|
|
31
|
-
html:
|
|
32
|
-
statusCode:
|
|
62
|
+
html: g(r),
|
|
63
|
+
statusCode: o.statusCode
|
|
33
64
|
};
|
|
34
65
|
}
|
|
35
66
|
}
|
|
36
|
-
async function
|
|
37
|
-
return
|
|
67
|
+
async function ge(o, s = {}) {
|
|
68
|
+
return K(async () => {
|
|
38
69
|
try {
|
|
39
|
-
const t = await
|
|
70
|
+
const t = await ee(s);
|
|
40
71
|
if (!t)
|
|
41
|
-
throw new
|
|
42
|
-
path:
|
|
43
|
-
pathname:
|
|
44
|
-
url:
|
|
72
|
+
throw new G("Page not found", {
|
|
73
|
+
path: s.path,
|
|
74
|
+
pathname: s.pathname,
|
|
75
|
+
url: s.url?.href
|
|
45
76
|
});
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
let
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
51
|
-
if (
|
|
52
|
-
console.info(`Global loader ignored for view: ${
|
|
77
|
+
const n = typeof t == "string" ? t : t.view;
|
|
78
|
+
s.params = typeof t == "string" ? {} : t.params ?? {}, V(n);
|
|
79
|
+
let a = {}, r;
|
|
80
|
+
const c = "/src/global-loader.ts", i = y[c] ? await y[c]() : null;
|
|
81
|
+
if (i?.loader)
|
|
82
|
+
if (i.shouldIgnore?.(n) || !1)
|
|
83
|
+
console.info(`Global loader ignored for view: ${n}`);
|
|
53
84
|
else {
|
|
54
|
-
const
|
|
55
|
-
|
|
85
|
+
const m = await i.loader(s);
|
|
86
|
+
a = m.props || {}, r = m.lang, m.cacheTags && P(m.cacheTags);
|
|
56
87
|
}
|
|
57
|
-
let
|
|
58
|
-
const x = `/src/views/${
|
|
59
|
-
if (
|
|
60
|
-
const e = await
|
|
88
|
+
let d = {}, v, u, E, l = !1;
|
|
89
|
+
const x = `/src/views/${n}/loader.ts`, p = k[x] ? await k[x]() : null;
|
|
90
|
+
if (p?.loader) {
|
|
91
|
+
const e = await p.loader(s);
|
|
61
92
|
if (e.rawResponse)
|
|
62
93
|
return {
|
|
63
94
|
rawResponse: e.rawResponse,
|
|
64
95
|
statusCode: e.rawResponse.statusCode || 200
|
|
65
96
|
};
|
|
66
|
-
|
|
97
|
+
d = e.props || {}, v = e.maxAge, u = e.sMaxAge, E = e.swr, l = e.rawHtml || !1, e.cacheTags && P(e.cacheTags), e.lang && (r = e.lang);
|
|
67
98
|
} else
|
|
68
|
-
console.info(`No loader for view: ${
|
|
69
|
-
const h = { ...
|
|
70
|
-
if (
|
|
71
|
-
const e =
|
|
72
|
-
e && P(e);
|
|
73
|
-
}
|
|
74
|
-
if (c?.generateMetadata) {
|
|
75
|
-
const e = c.generateMetadata(a, h);
|
|
76
|
-
e && P(e);
|
|
77
|
-
}
|
|
78
|
-
if (s?.generateSchema) {
|
|
79
|
-
const e = s.generateSchema(a, h);
|
|
99
|
+
console.info(`No loader for view: ${n}`);
|
|
100
|
+
const h = { ...a, ...d };
|
|
101
|
+
if (i?.generateMetadata) {
|
|
102
|
+
const e = i.generateMetadata(s, h);
|
|
80
103
|
e && T(e);
|
|
81
104
|
}
|
|
82
|
-
if (
|
|
83
|
-
const e =
|
|
105
|
+
if (p?.generateMetadata) {
|
|
106
|
+
const e = p.generateMetadata(s, h);
|
|
84
107
|
e && T(e);
|
|
85
108
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
109
|
+
if (i?.generateSchema) {
|
|
110
|
+
const e = i.generateSchema(s, h);
|
|
111
|
+
e && N(e);
|
|
112
|
+
}
|
|
113
|
+
if (p?.generateSchema) {
|
|
114
|
+
const e = p.generateSchema(s, h);
|
|
115
|
+
e && N(e);
|
|
116
|
+
}
|
|
117
|
+
const S = `/src/views/${n}/index.tsx`, $ = (f[S] ? await f[S]() : null)?.default;
|
|
118
|
+
if (!$)
|
|
119
|
+
throw console.error(`View component not found: ${n}`), process.env.NODE_ENV !== "production" ? new b(`View component not found: "${n}"`, {
|
|
120
|
+
viewName: n,
|
|
121
|
+
expectedPath: S,
|
|
122
|
+
availableViews: Object.keys(f),
|
|
123
|
+
hint: `Make sure the view component exists at ${S} and exports a default component`,
|
|
93
124
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
94
|
-
}) : new
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
priority:
|
|
99
|
-
children:
|
|
125
|
+
}) : new b("Internal Server Error");
|
|
126
|
+
g(w(z, {})), Q().forEach((e) => {
|
|
127
|
+
const m = _(e, { isJSON: !0 });
|
|
128
|
+
W({
|
|
129
|
+
priority: X.SEO,
|
|
130
|
+
children: w("script", {
|
|
100
131
|
type: "application/ld+json",
|
|
101
|
-
setHtml:
|
|
132
|
+
setHtml: m
|
|
102
133
|
})
|
|
103
134
|
});
|
|
104
135
|
});
|
|
105
|
-
|
|
136
|
+
let C = g(w($, h));
|
|
137
|
+
C = await ae(C);
|
|
138
|
+
const I = D(), L = j(), M = Z(), F = B(), R = A(), J = R.length > 0 ? R.map((e) => g(e)).join(`
|
|
106
139
|
`) : void 0;
|
|
107
140
|
return {
|
|
108
|
-
html:
|
|
109
|
-
scripts:
|
|
110
|
-
styles:
|
|
141
|
+
html: C,
|
|
142
|
+
scripts: I.map((e) => e.path),
|
|
143
|
+
styles: L.map((e) => e.path),
|
|
111
144
|
islands: M.length > 0 ? M : void 0,
|
|
112
|
-
head:
|
|
113
|
-
lang:
|
|
145
|
+
head: J,
|
|
146
|
+
lang: r,
|
|
114
147
|
maxAge: v,
|
|
115
|
-
sMaxAge:
|
|
148
|
+
sMaxAge: u,
|
|
116
149
|
swr: E,
|
|
117
|
-
cacheTags:
|
|
118
|
-
rawHtml:
|
|
150
|
+
cacheTags: F,
|
|
151
|
+
rawHtml: l
|
|
119
152
|
};
|
|
120
153
|
} catch (t) {
|
|
121
|
-
if (t instanceof
|
|
154
|
+
if (t instanceof U)
|
|
122
155
|
return {
|
|
123
156
|
html: "",
|
|
124
157
|
redirect: {
|
|
@@ -126,20 +159,20 @@ async function ce(n, a = {}) {
|
|
|
126
159
|
statusCode: t.statusCode
|
|
127
160
|
}
|
|
128
161
|
};
|
|
129
|
-
if (t instanceof
|
|
162
|
+
if (t instanceof Y)
|
|
130
163
|
return await O(t);
|
|
131
164
|
console.error("Failed to render:", t);
|
|
132
|
-
const
|
|
165
|
+
const a = process.env.NODE_ENV === "production" ? new H("Internal Server Error") : new H(t.message || "Internal Server Error", {
|
|
133
166
|
originalError: t.name,
|
|
134
167
|
stack: t.stack,
|
|
135
168
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
136
169
|
});
|
|
137
|
-
return await O(
|
|
170
|
+
return await O(a);
|
|
138
171
|
}
|
|
139
|
-
},
|
|
172
|
+
}, s);
|
|
140
173
|
}
|
|
141
174
|
export {
|
|
142
|
-
|
|
143
|
-
|
|
175
|
+
we as loadMiddleware,
|
|
176
|
+
ge as render
|
|
144
177
|
};
|
|
145
178
|
//# sourceMappingURL=entry-server.js.map
|
package/dist/entry-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-server.js","sources":["../src/core/entry-server.ts"],"sourcesContent":["/// <reference path=\"./jsx-types.d.ts\" />\nimport serialize from 'serialize-javascript';\nimport { MetadataRenderer } from '../seo/generateMetadata';\nimport type { Metadata } from '../seo/types';\nimport {\n HttpException,\n InternalServerErrorException,\n NotFoundException,\n RedirectException,\n ServiceUnavailableException,\n} from './exceptions';\nimport { HEAD_PRIORITY } from './head-priority';\nimport {\n addCacheTag,\n getCacheTags,\n getClientJsEntries,\n getCssEntries,\n getHeadContent,\n getIslandEntries,\n getSchemas,\n jsxFactory as h,\n Head,\n pushMetadata,\n pushSchema,\n runInRenderContext,\n setViewName,\n} from './jsx-runtime';\nimport { renderJsxToHtmlString } from './render';\n// @ts-ignore - Virtual modules provided by Vite plugin\nimport { viewComponents, viewLoaders } from 'virtual:l5e-views';\n// @ts-ignore - Virtual modules provided by Vite plugin\nimport routeHandler from 'virtual:l5e-route';\n// @ts-ignore - Virtual modules provided by Vite plugin\nimport { globalLoader } from 'virtual:l5e-global-loader';\n// @ts-ignore - Virtual modules provided by Vite plugin\nexport { loadMiddleware } from 'virtual:l5e-middleware';\n\nexport interface RawResponse {\n body: string | Buffer;\n contentType: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderResult {\n html?: string;\n scripts?: string[];\n styles?: string[];\n islands?: Array<{ key: string; src: string; name: string }>;\n head?: string;\n lang?: string;\n statusCode?: number;\n maxAge?: number;\n sMaxAge?: number;\n swr?: number;\n cacheTags?: string[];\n redirect?: { url: string; statusCode: number };\n rawResponse?: RawResponse;\n rawHtml?: boolean;\n}\n\nexport interface RequestInfo {\n url?: URL;\n path?: string;\n pathname?: string;\n method?: string;\n headers?: Record<string, any>;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n ip?: string;\n locals?: Record<string, unknown>;\n params?: Record<string, any>;\n}\n\nexport type RouteResult =\n | string\n | null\n | { view: string; params?: Record<string, any> };\n\n// SchemaMarkup type - có thể là single schema hoặc array of schemas\n// Sử dụng any để tương thích với schema-dts types từ frontend\nexport type SchemaMarkup = any | Array<any>;\n\nexport interface LoaderResult {\n props?: Record<string, any>;\n lang?: string;\n maxAge?: number;\n sMaxAge?: number;\n swr?: number;\n cacheTags?: string[] | Record<string, boolean>;\n rawResponse?: RawResponse;\n rawHtml?: boolean;\n}\n\nexport type LoaderFunction = (requestInfo: RequestInfo) => Promise<LoaderResult>;\n\nexport type GenerateMetadataFunction = (requestInfo: RequestInfo, props: any) => Metadata | null;\n\nexport type GenerateSchemaFunction = (requestInfo: RequestInfo, props: any) => SchemaMarkup | null;\n\nexport interface GlobalLoaderModule {\n loader: LoaderFunction;\n generateMetadata?: GenerateMetadataFunction;\n generateSchema?: GenerateSchemaFunction;\n shouldIgnore?: (viewName: string) => boolean;\n}\n\n/**\n * Helper function to render error view\n */\nasync function renderErrorView(err: HttpException, lang?: string): Promise<RenderResult> {\n const errorViewName = `_error`;\n const errorComponentPath = `/src/views/${errorViewName}/index.tsx`;\n\n // Set error view name in context\n setViewName(errorViewName);\n\n // Try to load error view\n const errorComponentModule = viewComponents[errorComponentPath]\n ? await viewComponents[errorComponentPath]()\n : null;\n\n if (errorComponentModule?.default) {\n // Render error view with exception data\n const errorProps = {\n statusCode: err.statusCode,\n message: err.message,\n data: err.data,\n };\n\n const Component = errorComponentModule.default;\n const htmlBody = renderJsxToHtmlString(h(Component, errorProps));\n const clientEntries = getClientJsEntries();\n const cssEntries = getCssEntries();\n const headContent = getHeadContent();\n\n const headHtml =\n headContent.length > 0\n ? headContent.map((content) => renderJsxToHtmlString(content)).join('\\n ')\n : undefined;\n\n return {\n html: htmlBody,\n scripts: clientEntries.map((entry) => entry.path),\n styles: cssEntries.map((entry) => entry.path),\n head: headHtml,\n lang,\n statusCode: err.statusCode,\n };\n } else {\n // No error view found, render default error message\n const html = h('div', {}, `${err.statusCode} - ${err.message}`);\n return {\n html: renderJsxToHtmlString(html),\n statusCode: err.statusCode,\n };\n }\n}\n\nexport async function render(url: string, requestInfo: RequestInfo = {}): Promise<RenderResult> {\n return runInRenderContext(async () => {\n try {\n // Step 1: Call route handler to get view name\n const rawRouteResult: RouteResult = await routeHandler(requestInfo);\n\n if (!rawRouteResult) {\n // Throw NotFoundException to render error_404 view\n throw new NotFoundException('Page not found', {\n path: requestInfo.path,\n pathname: requestInfo.pathname,\n url: requestInfo.url?.href,\n });\n }\n\n const viewName =\n typeof rawRouteResult === 'string' ? rawRouteResult : rawRouteResult.view;\n requestInfo.params =\n typeof rawRouteResult === 'string' ? {} : (rawRouteResult.params ?? {});\n\n // Set view name in render context\n setViewName(viewName);\n\n // Step 2: Load global loader (optional)\n let globalProps: Record<string, any> = {};\n let lang: string | undefined;\n\n // Try to load global loader\n const globalLoaderPathTs = '/src/global-loader.ts';\n\n const globalLoaderModule: GlobalLoaderModule | null = globalLoader[globalLoaderPathTs]\n ? await globalLoader[globalLoaderPathTs]()\n : null;\n\n // Run global loader if exists and not ignored\n if (globalLoaderModule?.loader) {\n const shouldIgnore = globalLoaderModule.shouldIgnore?.(viewName) || false;\n\n if (!shouldIgnore) {\n const globalLoaderResult = await globalLoaderModule.loader(requestInfo);\n\n globalProps = globalLoaderResult.props || {};\n lang = globalLoaderResult.lang; // Extract lang from global loader\n\n if (globalLoaderResult.cacheTags) {\n addCacheTag(globalLoaderResult.cacheTags);\n }\n\n // generateMetadata và generateSchema sẽ được gọi sau khi có props\n } else {\n console.info(`Global loader ignored for view: ${viewName}`);\n }\n }\n\n // Step 3: Dynamic import view loader (optional)\n let viewProps: Record<string, any> = {};\n let maxAge: number | undefined;\n let sMaxAge: number | undefined;\n let swr: number | undefined;\n let rawHtml: boolean = false;\n const loaderPathTs = `/src/views/${viewName}/loader.ts`;\n\n // Try TypeScript loader formats only\n const loaderModule = viewLoaders[loaderPathTs] ? await viewLoaders[loaderPathTs]() : null;\n\n if (loaderModule?.loader) {\n const loaderResult = await loaderModule.loader(requestInfo);\n\n // Check if loader returns raw response\n if (loaderResult.rawResponse) {\n return {\n rawResponse: loaderResult.rawResponse,\n statusCode: loaderResult.rawResponse.statusCode || 200,\n };\n }\n\n viewProps = loaderResult.props || {};\n maxAge = loaderResult.maxAge;\n sMaxAge = loaderResult.sMaxAge;\n swr = loaderResult.swr;\n rawHtml = loaderResult.rawHtml || false;\n\n if (loaderResult.cacheTags) {\n addCacheTag(loaderResult.cacheTags);\n }\n\n // View loader lang overrides global loader lang\n if (loaderResult.lang) {\n lang = loaderResult.lang;\n }\n } else {\n console.info(`No loader for view: ${viewName}`);\n }\n\n // Merge props: global props first, then view props (view can override)\n const props = { ...globalProps, ...viewProps };\n\n // Step 3.5: Generate metadata và schema từ generateMetadata và generateSchema functions\n // Global generateMetadata (parent metadata)\n if (globalLoaderModule?.generateMetadata) {\n const globalMetadata = globalLoaderModule.generateMetadata(requestInfo, props);\n if (globalMetadata) {\n pushMetadata(globalMetadata);\n }\n }\n\n // View generateMetadata (child metadata, sẽ merge với parent)\n if (loaderModule?.generateMetadata) {\n const viewMetadata = loaderModule.generateMetadata(requestInfo, props);\n if (viewMetadata) {\n pushMetadata(viewMetadata);\n }\n }\n\n // Global generateSchema (base schemas)\n if (globalLoaderModule?.generateSchema) {\n const globalSchema = globalLoaderModule.generateSchema(requestInfo, props);\n if (globalSchema) {\n pushSchema(globalSchema);\n }\n }\n\n // View generateSchema (view-specific schemas)\n if (loaderModule?.generateSchema) {\n const viewSchema = loaderModule.generateSchema(requestInfo, props);\n if (viewSchema) {\n pushSchema(viewSchema);\n }\n }\n\n // Step 4: Dynamic import component (required)\n const componentPathTsx = `/src/views/${viewName}/index.tsx`;\n\n const componentModule = viewComponents[componentPathTsx]\n ? await viewComponents[componentPathTsx]()\n : null;\n\n const Component = componentModule?.default;\n\n if (!Component) {\n console.error(`View component not found: ${viewName}`);\n\n // Check if in development or production mode\n const isDevelopment = process.env.NODE_ENV !== 'production';\n\n if (isDevelopment) {\n // Development: provide detailed error information\n throw new InternalServerErrorException(`View component not found: \"${viewName}\"`, {\n viewName,\n expectedPath: componentPathTsx,\n availableViews: Object.keys(viewComponents),\n hint: `Make sure the view component exists at ${componentPathTsx} and exports a default component`,\n timestamp: new Date().toISOString(),\n });\n } else {\n // Production: simple error message\n throw new InternalServerErrorException('Internal Server Error');\n }\n }\n\n // Auto-render MetadataRenderer trước khi render component\n // MetadataRenderer sẽ push metadata vào headRegistry thông qua Head component\n renderJsxToHtmlString(h(MetadataRenderer, {}));\n\n // Auto-render schemas vào headRegistry\n const schemas = getSchemas();\n schemas.forEach((schema) => {\n // serialize-javascript escapes HTML-sensitive chars (<, >, &, U+2028/2029)\n // so schema values cannot break out of the <script> block (XSS).\n const schemaJson = serialize(schema, { isJSON: true });\n // Push schema vào headRegistry thông qua Head component\n // Head component chỉ push vào registry, không cần renderJsxToHtmlString\n Head({\n priority: HEAD_PRIORITY.SEO,\n children: h('script', {\n type: 'application/ld+json',\n setHtml: schemaJson,\n }),\n });\n });\n\n // Render component (có thể có Head components khác)\n const htmlBody = renderJsxToHtmlString(h(Component, props));\n const clientEntries = getClientJsEntries();\n const cssEntries = getCssEntries();\n const islandEntries = getIslandEntries();\n const cacheTags = getCacheTags();\n const headContent = getHeadContent();\n\n // Render head content to HTML string\n const headHtml =\n headContent.length > 0\n ? headContent.map((content) => renderJsxToHtmlString(content)).join('\\n ')\n : undefined;\n\n return {\n html: htmlBody,\n scripts: clientEntries.map((entry) => entry.path),\n styles: cssEntries.map((entry) => entry.path),\n islands: islandEntries.length > 0 ? islandEntries : undefined,\n head: headHtml,\n lang,\n maxAge,\n sMaxAge,\n swr,\n cacheTags,\n rawHtml,\n };\n } catch (err: any) {\n // Handle RedirectException\n if (err instanceof RedirectException) {\n return {\n html: '',\n redirect: {\n url: err.url,\n statusCode: err.statusCode,\n },\n };\n }\n\n // Handle HttpException\n if (err instanceof HttpException) {\n return await renderErrorView(err);\n }\n\n // For other (unexpected) errors, convert to ServiceUnavailableException.\n // Intentional HttpExceptions above keep their developer-authored message;\n // but an unexpected error's raw message/stack must not leak to the client\n // in production (it can carry internals, secrets, etc.). Dev keeps detail.\n console.error(`Failed to render:`, err);\n const isProduction = process.env.NODE_ENV === 'production';\n const serviceError = isProduction\n ? new ServiceUnavailableException('Internal Server Error')\n : new ServiceUnavailableException(err.message || 'Internal Server Error', {\n originalError: err.name,\n stack: err.stack,\n timestamp: new Date().toISOString(),\n });\n return await renderErrorView(serviceError);\n }\n }, requestInfo);\n}\n"],"names":["renderErrorView","err","lang","errorViewName","errorComponentPath","setViewName","errorComponentModule","viewComponents","errorProps","Component","htmlBody","renderJsxToHtmlString","h","clientEntries","getClientJsEntries","cssEntries","getCssEntries","headContent","getHeadContent","headHtml","content","entry","html","render","url","requestInfo","runInRenderContext","rawRouteResult","routeHandler","NotFoundException","viewName","globalProps","globalLoaderPathTs","globalLoaderModule","globalLoader","globalLoaderResult","addCacheTag","viewProps","maxAge","sMaxAge","swr","rawHtml","loaderPathTs","loaderModule","viewLoaders","loaderResult","props","globalMetadata","pushMetadata","viewMetadata","globalSchema","pushSchema","viewSchema","componentPathTsx","InternalServerErrorException","MetadataRenderer","getSchemas","schema","schemaJson","serialize","Head","HEAD_PRIORITY","islandEntries","getIslandEntries","cacheTags","getCacheTags","RedirectException","HttpException","serviceError","ServiceUnavailableException"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"entry-server.js","sources":["../src/core/entry-server.ts"],"sourcesContent":["/// <reference path=\"./jsx-types.d.ts\" />\nimport serialize from 'serialize-javascript';\nimport { MetadataRenderer } from '../seo/generateMetadata';\nimport type { Metadata } from '../seo/types';\nimport {\n HttpException,\n InternalServerErrorException,\n NotFoundException,\n RedirectException,\n ServiceUnavailableException,\n} from './exceptions';\nimport { HEAD_PRIORITY } from './head-priority';\nimport {\n addCacheTag,\n getCacheTags,\n getClientJsEntries,\n getCssEntries,\n getHeadContent,\n getIslandEntries,\n getSchemas,\n getSsrIslands,\n jsxFactory as h,\n Head,\n pushMetadata,\n pushSchema,\n runInRenderContext,\n setViewName,\n} from './jsx-runtime';\nimport { renderJsxToHtmlString } from './render';\n// @ts-ignore - Virtual modules provided by Vite plugin\nimport { viewComponents, viewLoaders } from 'virtual:l5e-views';\n// @ts-ignore - Virtual modules provided by Vite plugin\nimport routeHandler from 'virtual:l5e-route';\n// @ts-ignore - Virtual modules provided by Vite plugin\nimport { globalLoader } from 'virtual:l5e-global-loader';\n// @ts-ignore - Virtual modules provided by Vite plugin\nexport { loadMiddleware } from 'virtual:l5e-middleware';\n// @ts-ignore - Virtual modules provided by Vite plugin\nimport { islandModules } from 'virtual:l5e-islands';\n\n/**\n * Fill `ssr` island placeholders with server-rendered HTML.\n *\n * During the synchronous render pass, each `<ClientIsland ssr>` emits a unique\n * token (as `<!--token-->` body + `data-island-ssr=\"token\"`). Here — after the\n * pass — we can `await import()` the actual React component and renderToString it,\n * then string-replace the token. Only islands present on this page are imported.\n *\n * On failure we strip both the token and the `data-island-ssr` attribute so the\n * client cleanly falls back to a client-only mount (no hydration mismatch).\n */\nasync function fillSsrIslands(htmlBody: string): Promise<string> {\n const pending = getSsrIslands();\n if (pending.length === 0) return htmlBody;\n\n let renderToString: (el: any) => string;\n let createElement: (type: any, props: any) => any;\n try {\n [{ renderToString }, { createElement }] = await Promise.all([\n import('react-dom/server'),\n import('react'),\n ]);\n } catch (err) {\n console.error('[l5e-island] SSR requires react-dom/server + react:', err);\n // Strip every pending token/attr → client-only fallback for all.\n for (const island of pending) {\n htmlBody = htmlBody\n .replace(`<!--${island.token}-->`, '')\n .replace(` data-island-ssr=\"${island.token}\"`, '');\n }\n return htmlBody;\n }\n\n for (const island of pending) {\n try {\n const loader = islandModules['/' + island.src];\n if (!loader) {\n throw new Error(`island module not found in glob: /${island.src}`);\n }\n const mod: any = await loader();\n const Component = mod[island.name] ?? mod.default;\n if (!Component) {\n throw new Error(`no export \"${island.name}\" or default in /${island.src}`);\n }\n const out = renderToString(createElement(Component, island.props));\n // Replacer fn (not a string) so `$`-sequences in `out` (e.g. \"$&\", \"$$\")\n // aren't interpreted as special replacement patterns.\n htmlBody = htmlBody\n .replace(`<!--${island.token}-->`, () => out)\n .replace(`data-island-ssr=\"${island.token}\"`, 'data-island-ssr=\"1\"');\n } catch (err) {\n console.error(`[l5e-island] Failed to SSR island \"${island.name}\":`, err);\n htmlBody = htmlBody\n .replace(`<!--${island.token}-->`, '')\n .replace(` data-island-ssr=\"${island.token}\"`, '');\n }\n }\n\n return htmlBody;\n}\n\nexport interface RawResponse {\n body: string | Buffer;\n contentType: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderResult {\n html?: string;\n scripts?: string[];\n styles?: string[];\n islands?: Array<{ key: string; src: string; name: string }>;\n head?: string;\n lang?: string;\n statusCode?: number;\n maxAge?: number;\n sMaxAge?: number;\n swr?: number;\n cacheTags?: string[];\n redirect?: { url: string; statusCode: number };\n rawResponse?: RawResponse;\n rawHtml?: boolean;\n}\n\nexport interface RequestInfo {\n url?: URL;\n path?: string;\n pathname?: string;\n method?: string;\n headers?: Record<string, any>;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n ip?: string;\n locals?: Record<string, unknown>;\n params?: Record<string, any>;\n}\n\nexport type RouteResult =\n | string\n | null\n | { view: string; params?: Record<string, any> };\n\n// SchemaMarkup type - có thể là single schema hoặc array of schemas\n// Sử dụng any để tương thích với schema-dts types từ frontend\nexport type SchemaMarkup = any | Array<any>;\n\nexport interface LoaderResult {\n props?: Record<string, any>;\n lang?: string;\n maxAge?: number;\n sMaxAge?: number;\n swr?: number;\n cacheTags?: string[] | Record<string, boolean>;\n rawResponse?: RawResponse;\n rawHtml?: boolean;\n}\n\nexport type LoaderFunction = (requestInfo: RequestInfo) => Promise<LoaderResult>;\n\nexport type GenerateMetadataFunction = (requestInfo: RequestInfo, props: any) => Metadata | null;\n\nexport type GenerateSchemaFunction = (requestInfo: RequestInfo, props: any) => SchemaMarkup | null;\n\nexport interface GlobalLoaderModule {\n loader: LoaderFunction;\n generateMetadata?: GenerateMetadataFunction;\n generateSchema?: GenerateSchemaFunction;\n shouldIgnore?: (viewName: string) => boolean;\n}\n\n/**\n * Helper function to render error view\n */\nasync function renderErrorView(err: HttpException, lang?: string): Promise<RenderResult> {\n const errorViewName = `_error`;\n const errorComponentPath = `/src/views/${errorViewName}/index.tsx`;\n\n // Set error view name in context\n setViewName(errorViewName);\n\n // Try to load error view\n const errorComponentModule = viewComponents[errorComponentPath]\n ? await viewComponents[errorComponentPath]()\n : null;\n\n if (errorComponentModule?.default) {\n // Render error view with exception data\n const errorProps = {\n statusCode: err.statusCode,\n message: err.message,\n data: err.data,\n };\n\n const Component = errorComponentModule.default;\n const htmlBody = renderJsxToHtmlString(h(Component, errorProps));\n const clientEntries = getClientJsEntries();\n const cssEntries = getCssEntries();\n const headContent = getHeadContent();\n\n const headHtml =\n headContent.length > 0\n ? headContent.map((content) => renderJsxToHtmlString(content)).join('\\n ')\n : undefined;\n\n return {\n html: htmlBody,\n scripts: clientEntries.map((entry) => entry.path),\n styles: cssEntries.map((entry) => entry.path),\n head: headHtml,\n lang,\n statusCode: err.statusCode,\n };\n } else {\n // No error view found, render default error message\n const html = h('div', {}, `${err.statusCode} - ${err.message}`);\n return {\n html: renderJsxToHtmlString(html),\n statusCode: err.statusCode,\n };\n }\n}\n\nexport async function render(url: string, requestInfo: RequestInfo = {}): Promise<RenderResult> {\n return runInRenderContext(async () => {\n try {\n // Step 1: Call route handler to get view name\n const rawRouteResult: RouteResult = await routeHandler(requestInfo);\n\n if (!rawRouteResult) {\n // Throw NotFoundException to render error_404 view\n throw new NotFoundException('Page not found', {\n path: requestInfo.path,\n pathname: requestInfo.pathname,\n url: requestInfo.url?.href,\n });\n }\n\n const viewName =\n typeof rawRouteResult === 'string' ? rawRouteResult : rawRouteResult.view;\n requestInfo.params =\n typeof rawRouteResult === 'string' ? {} : (rawRouteResult.params ?? {});\n\n // Set view name in render context\n setViewName(viewName);\n\n // Step 2: Load global loader (optional)\n let globalProps: Record<string, any> = {};\n let lang: string | undefined;\n\n // Try to load global loader\n const globalLoaderPathTs = '/src/global-loader.ts';\n\n const globalLoaderModule: GlobalLoaderModule | null = globalLoader[globalLoaderPathTs]\n ? await globalLoader[globalLoaderPathTs]()\n : null;\n\n // Run global loader if exists and not ignored\n if (globalLoaderModule?.loader) {\n const shouldIgnore = globalLoaderModule.shouldIgnore?.(viewName) || false;\n\n if (!shouldIgnore) {\n const globalLoaderResult = await globalLoaderModule.loader(requestInfo);\n\n globalProps = globalLoaderResult.props || {};\n lang = globalLoaderResult.lang; // Extract lang from global loader\n\n if (globalLoaderResult.cacheTags) {\n addCacheTag(globalLoaderResult.cacheTags);\n }\n\n // generateMetadata và generateSchema sẽ được gọi sau khi có props\n } else {\n console.info(`Global loader ignored for view: ${viewName}`);\n }\n }\n\n // Step 3: Dynamic import view loader (optional)\n let viewProps: Record<string, any> = {};\n let maxAge: number | undefined;\n let sMaxAge: number | undefined;\n let swr: number | undefined;\n let rawHtml: boolean = false;\n const loaderPathTs = `/src/views/${viewName}/loader.ts`;\n\n // Try TypeScript loader formats only\n const loaderModule = viewLoaders[loaderPathTs] ? await viewLoaders[loaderPathTs]() : null;\n\n if (loaderModule?.loader) {\n const loaderResult = await loaderModule.loader(requestInfo);\n\n // Check if loader returns raw response\n if (loaderResult.rawResponse) {\n return {\n rawResponse: loaderResult.rawResponse,\n statusCode: loaderResult.rawResponse.statusCode || 200,\n };\n }\n\n viewProps = loaderResult.props || {};\n maxAge = loaderResult.maxAge;\n sMaxAge = loaderResult.sMaxAge;\n swr = loaderResult.swr;\n rawHtml = loaderResult.rawHtml || false;\n\n if (loaderResult.cacheTags) {\n addCacheTag(loaderResult.cacheTags);\n }\n\n // View loader lang overrides global loader lang\n if (loaderResult.lang) {\n lang = loaderResult.lang;\n }\n } else {\n console.info(`No loader for view: ${viewName}`);\n }\n\n // Merge props: global props first, then view props (view can override)\n const props = { ...globalProps, ...viewProps };\n\n // Step 3.5: Generate metadata và schema từ generateMetadata và generateSchema functions\n // Global generateMetadata (parent metadata)\n if (globalLoaderModule?.generateMetadata) {\n const globalMetadata = globalLoaderModule.generateMetadata(requestInfo, props);\n if (globalMetadata) {\n pushMetadata(globalMetadata);\n }\n }\n\n // View generateMetadata (child metadata, sẽ merge với parent)\n if (loaderModule?.generateMetadata) {\n const viewMetadata = loaderModule.generateMetadata(requestInfo, props);\n if (viewMetadata) {\n pushMetadata(viewMetadata);\n }\n }\n\n // Global generateSchema (base schemas)\n if (globalLoaderModule?.generateSchema) {\n const globalSchema = globalLoaderModule.generateSchema(requestInfo, props);\n if (globalSchema) {\n pushSchema(globalSchema);\n }\n }\n\n // View generateSchema (view-specific schemas)\n if (loaderModule?.generateSchema) {\n const viewSchema = loaderModule.generateSchema(requestInfo, props);\n if (viewSchema) {\n pushSchema(viewSchema);\n }\n }\n\n // Step 4: Dynamic import component (required)\n const componentPathTsx = `/src/views/${viewName}/index.tsx`;\n\n const componentModule = viewComponents[componentPathTsx]\n ? await viewComponents[componentPathTsx]()\n : null;\n\n const Component = componentModule?.default;\n\n if (!Component) {\n console.error(`View component not found: ${viewName}`);\n\n // Check if in development or production mode\n const isDevelopment = process.env.NODE_ENV !== 'production';\n\n if (isDevelopment) {\n // Development: provide detailed error information\n throw new InternalServerErrorException(`View component not found: \"${viewName}\"`, {\n viewName,\n expectedPath: componentPathTsx,\n availableViews: Object.keys(viewComponents),\n hint: `Make sure the view component exists at ${componentPathTsx} and exports a default component`,\n timestamp: new Date().toISOString(),\n });\n } else {\n // Production: simple error message\n throw new InternalServerErrorException('Internal Server Error');\n }\n }\n\n // Auto-render MetadataRenderer trước khi render component\n // MetadataRenderer sẽ push metadata vào headRegistry thông qua Head component\n renderJsxToHtmlString(h(MetadataRenderer, {}));\n\n // Auto-render schemas vào headRegistry\n const schemas = getSchemas();\n schemas.forEach((schema) => {\n // serialize-javascript escapes HTML-sensitive chars (<, >, &, U+2028/2029)\n // so schema values cannot break out of the <script> block (XSS).\n const schemaJson = serialize(schema, { isJSON: true });\n // Push schema vào headRegistry thông qua Head component\n // Head component chỉ push vào registry, không cần renderJsxToHtmlString\n Head({\n priority: HEAD_PRIORITY.SEO,\n children: h('script', {\n type: 'application/ld+json',\n setHtml: schemaJson,\n }),\n });\n });\n\n // Render component (có thể có Head components khác)\n let htmlBody = renderJsxToHtmlString(h(Component, props));\n // Fill any opt-in `ssr` island placeholders with server-rendered React HTML.\n htmlBody = await fillSsrIslands(htmlBody);\n const clientEntries = getClientJsEntries();\n const cssEntries = getCssEntries();\n const islandEntries = getIslandEntries();\n const cacheTags = getCacheTags();\n const headContent = getHeadContent();\n\n // Render head content to HTML string\n const headHtml =\n headContent.length > 0\n ? headContent.map((content) => renderJsxToHtmlString(content)).join('\\n ')\n : undefined;\n\n return {\n html: htmlBody,\n scripts: clientEntries.map((entry) => entry.path),\n styles: cssEntries.map((entry) => entry.path),\n islands: islandEntries.length > 0 ? islandEntries : undefined,\n head: headHtml,\n lang,\n maxAge,\n sMaxAge,\n swr,\n cacheTags,\n rawHtml,\n };\n } catch (err: any) {\n // Handle RedirectException\n if (err instanceof RedirectException) {\n return {\n html: '',\n redirect: {\n url: err.url,\n statusCode: err.statusCode,\n },\n };\n }\n\n // Handle HttpException\n if (err instanceof HttpException) {\n return await renderErrorView(err);\n }\n\n // For other (unexpected) errors, convert to ServiceUnavailableException.\n // Intentional HttpExceptions above keep their developer-authored message;\n // but an unexpected error's raw message/stack must not leak to the client\n // in production (it can carry internals, secrets, etc.). Dev keeps detail.\n console.error(`Failed to render:`, err);\n const isProduction = process.env.NODE_ENV === 'production';\n const serviceError = isProduction\n ? new ServiceUnavailableException('Internal Server Error')\n : new ServiceUnavailableException(err.message || 'Internal Server Error', {\n originalError: err.name,\n stack: err.stack,\n timestamp: new Date().toISOString(),\n });\n return await renderErrorView(serviceError);\n }\n }, requestInfo);\n}\n"],"names":["fillSsrIslands","htmlBody","pending","getSsrIslands","renderToString","createElement","err","island","loader","islandModules","mod","Component","out","renderErrorView","lang","errorViewName","errorComponentPath","setViewName","errorComponentModule","viewComponents","errorProps","renderJsxToHtmlString","h","clientEntries","getClientJsEntries","cssEntries","getCssEntries","headContent","getHeadContent","headHtml","content","entry","html","render","url","requestInfo","runInRenderContext","rawRouteResult","routeHandler","NotFoundException","viewName","globalProps","globalLoaderPathTs","globalLoaderModule","globalLoader","globalLoaderResult","addCacheTag","viewProps","maxAge","sMaxAge","swr","rawHtml","loaderPathTs","loaderModule","viewLoaders","loaderResult","props","globalMetadata","pushMetadata","viewMetadata","globalSchema","pushSchema","viewSchema","componentPathTsx","InternalServerErrorException","MetadataRenderer","getSchemas","schema","schemaJson","serialize","Head","HEAD_PRIORITY","islandEntries","getIslandEntries","cacheTags","getCacheTags","RedirectException","HttpException","serviceError","ServiceUnavailableException"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxFactory as t, Fragment as T } from "@withl5e/l5e/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
function
|
|
2
|
+
import { w as j, q as M, m as C, a as s, H as l, F as o } from "./jsx-runtime-Bokflh8Q.js";
|
|
3
|
+
function O({ metadata: h }) {
|
|
4
4
|
const { request: w } = j(), u = M(), e = h ? C(u, h) : u;
|
|
5
5
|
if (!e) return null;
|
|
6
6
|
const g = () => e.title ? typeof e.title == "string" ? e.title : e.title.default : null, G = () => {
|
|
@@ -139,6 +139,6 @@ function R({ metadata: h }) {
|
|
|
139
139
|
)))));
|
|
140
140
|
}
|
|
141
141
|
export {
|
|
142
|
-
|
|
142
|
+
O as M
|
|
143
143
|
};
|
|
144
|
-
//# sourceMappingURL=generateMetadata-
|
|
144
|
+
//# sourceMappingURL=generateMetadata-CIFVlViV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateMetadata-DLMaI0EO.js","sources":["../src/seo/generateMetadata.tsx"],"sourcesContent":["/// <reference types=\"../core/jsx-types\" />\nimport { HEAD_PRIORITY } from '../core/head-priority';\nimport { Fragment, Head, resolveMetadata, useRequest } from '../core/jsx-runtime';\n\nimport { mergeMetadata } from './mergeMetadata';\nimport type { Metadata } from './types';\n\n/**\n * Converts Metadata object to SEO meta tags\n * This is the core function that transforms the metadata object into actual HTML tags\n *\n * If metadata is provided, it will be merged with metadata from the stack (from global/page loaders)\n * If no metadata is provided, it will use resolved metadata from the stack\n */\nexport function MetadataRenderer({ metadata }: { metadata?: Metadata }) {\n const { request } = useRequest();\n\n // Resolve metadata from stack (hierarchical metadata from loaders)\n const stackMetadata = resolveMetadata();\n\n // Merge: stack metadata (parent) + provided metadata (child)\n // If metadata is provided, it overrides stack metadata\n // If not provided, use stack metadata only\n const resolvedMetadata = metadata ? mergeMetadata(stackMetadata, metadata) : stackMetadata;\n\n if (!resolvedMetadata) return null;\n\n // Helper to normalize title\n const getTitle = () => {\n if (!resolvedMetadata.title) return null;\n if (typeof resolvedMetadata.title === 'string') return resolvedMetadata.title;\n // Handle TemplateString\n return resolvedMetadata.title.default;\n };\n\n // Helper to normalize robots\n const getRobots = () => {\n // tránh tiêm query\n const queryNames = Object.keys(request.query || {});\n // mặc định nếu có query sẽ ép robots về noindex\n // tuy nhiên 1 số trường hợp đặc biệt ví dụ như page=1 có chủ đích `allowQueryNames` sẽ bỏ qua nguyên tắc này\n\n const noindex =\n queryNames.filter((name) => {\n if (typeof resolvedMetadata.robots === 'string') return false;\n if (Array.isArray(resolvedMetadata.robots?.allowQueryNames))\n return !resolvedMetadata.robots.allowQueryNames.includes(name);\n return name !== resolvedMetadata.robots?.allowQueryNames;\n }).length > 0;\n\n if (noindex) return 'noindex, follow';\n\n if (!resolvedMetadata.robots) return null;\n if (typeof resolvedMetadata.robots === 'string') return resolvedMetadata.robots;\n\n const parts: string[] = [];\n if (resolvedMetadata.robots.index === false) parts.push('noindex');\n else if (resolvedMetadata.robots.index === true) parts.push('index');\n\n if (resolvedMetadata.robots.follow === false) parts.push('nofollow');\n else if (resolvedMetadata.robots.follow === true) parts.push('follow');\n\n if (resolvedMetadata.robots.noarchive) parts.push('noarchive');\n if (resolvedMetadata.robots.nosnippet) parts.push('nosnippet');\n if (resolvedMetadata.robots.noimageindex) parts.push('noimageindex');\n if (resolvedMetadata.robots.nocache) parts.push('nocache');\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize viewport\n const getViewport = () => {\n if (!resolvedMetadata.viewport) return null;\n if (typeof resolvedMetadata.viewport === 'string') return resolvedMetadata.viewport;\n\n const parts: string[] = [];\n if (resolvedMetadata.viewport.width) parts.push(`width=${resolvedMetadata.viewport.width}`);\n if (resolvedMetadata.viewport.height) parts.push(`height=${resolvedMetadata.viewport.height}`);\n if (resolvedMetadata.viewport.initialScale)\n parts.push(`initial-scale=${resolvedMetadata.viewport.initialScale}`);\n if (resolvedMetadata.viewport.maximumScale)\n parts.push(`maximum-scale=${resolvedMetadata.viewport.maximumScale}`);\n if (resolvedMetadata.viewport.minimumScale)\n parts.push(`minimum-scale=${resolvedMetadata.viewport.minimumScale}`);\n if (resolvedMetadata.viewport.userScalable !== undefined) {\n parts.push(`user-scalable=${resolvedMetadata.viewport.userScalable ? 'yes' : 'no'}`);\n }\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize keywords\n const getKeywords = () => {\n if (!resolvedMetadata.keywords) return null;\n if (Array.isArray(resolvedMetadata.keywords)) return resolvedMetadata.keywords.join(', ');\n return resolvedMetadata.keywords;\n };\n\n // Helper to normalize authors\n const getAuthors = () => {\n if (!resolvedMetadata.author) return [];\n if (typeof resolvedMetadata.author === 'string') return [{ name: resolvedMetadata.author }];\n if (Array.isArray(resolvedMetadata.author)) return resolvedMetadata.author;\n return [resolvedMetadata.author];\n };\n\n // Helper to normalize format detection\n const getFormatDetection = () => {\n if (!resolvedMetadata.formatDetection) return null;\n\n const parts: string[] = [];\n if (resolvedMetadata.formatDetection.telephone === false) parts.push('telephone=no');\n if (resolvedMetadata.formatDetection.date === false) parts.push('date=no');\n if (resolvedMetadata.formatDetection.address === false) parts.push('address=no');\n if (resolvedMetadata.formatDetection.email === false) parts.push('email=no');\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize Open Graph images\n const getOgImages = () => {\n if (!resolvedMetadata.openGraph?.images) return [];\n\n const images = Array.isArray(resolvedMetadata.openGraph.images)\n ? resolvedMetadata.openGraph.images\n : [resolvedMetadata.openGraph.images];\n\n return images.map((img) => {\n if (typeof img === 'string') return { url: img };\n return img;\n });\n };\n\n // Helper to normalize Twitter images\n const getTwitterImages = () => {\n if (!resolvedMetadata.twitter?.images) return [];\n\n const images = Array.isArray(resolvedMetadata.twitter.images)\n ? resolvedMetadata.twitter.images\n : [resolvedMetadata.twitter.images];\n\n return images.map((img) => {\n if (typeof img === 'string') return { url: img };\n return img;\n });\n };\n\n // Helper to get icon URLs\n const getIcons = () => {\n if (!resolvedMetadata.icons) return { icon: [], apple: [], shortcut: null, other: [] };\n\n const iconUrls = resolvedMetadata.icons.icon\n ? Array.isArray(resolvedMetadata.icons.icon)\n ? resolvedMetadata.icons.icon\n : [resolvedMetadata.icons.icon]\n : [];\n\n const appleUrls = resolvedMetadata.icons.apple\n ? Array.isArray(resolvedMetadata.icons.apple)\n ? resolvedMetadata.icons.apple\n : [resolvedMetadata.icons.apple]\n : [];\n\n return {\n icon: iconUrls,\n apple: appleUrls,\n shortcut: resolvedMetadata.icons.shortcut || null,\n other: resolvedMetadata.icons.other || [],\n };\n };\n\n const title = getTitle();\n const robots = getRobots();\n const viewport = getViewport();\n const keywords = getKeywords();\n const authors = getAuthors();\n const formatDetection = getFormatDetection();\n const ogImages = getOgImages();\n const twitterImages = getTwitterImages();\n const icons = getIcons();\n const themeColors = Array.isArray(resolvedMetadata.themeColor)\n ? resolvedMetadata.themeColor\n : resolvedMetadata.themeColor\n ? [resolvedMetadata.themeColor]\n : [];\n\n return (\n <>\n {/* Critical: charset, viewport - must be first */}\n {(resolvedMetadata.charset || viewport) && (\n <Head priority={HEAD_PRIORITY.CRITICAL}>\n {resolvedMetadata.charset && <meta charset={resolvedMetadata.charset} />}\n {viewport && <meta name=\"viewport\" content={viewport} />}\n </Head>\n )}\n\n {/* High priority: title, description, canonical, prev/next */}\n {(title ||\n resolvedMetadata.description ||\n resolvedMetadata.canonical ||\n resolvedMetadata.prev ||\n resolvedMetadata.next) && (\n <Head priority={HEAD_PRIORITY.HIGH}>\n {title && <title>{title}</title>}\n {resolvedMetadata.description && (\n <meta name=\"description\" content={resolvedMetadata.description} />\n )}\n {resolvedMetadata.canonical && <link rel=\"canonical\" href={resolvedMetadata.canonical} />}\n {resolvedMetadata.prev && <link rel=\"prev\" href={resolvedMetadata.prev} />}\n {resolvedMetadata.next && <link rel=\"next\" href={resolvedMetadata.next} />}\n </Head>\n )}\n\n {/* Medium priority: meta tags, robots */}\n <Head priority={HEAD_PRIORITY.MEDIUM}>\n {keywords && <meta name=\"keywords\" content={keywords} />}\n {robots && <meta name=\"robots\" content={robots} />}\n {resolvedMetadata.colorScheme && (\n <meta name=\"color-scheme\" content={resolvedMetadata.colorScheme} />\n )}\n\n {/* Theme colors */}\n {themeColors.map((color, index) => (\n <meta name=\"theme-color\" content={color} />\n ))}\n\n {resolvedMetadata.generator && (\n <meta name=\"generator\" content={resolvedMetadata.generator} />\n )}\n {resolvedMetadata.creator && <meta name=\"creator\" content={resolvedMetadata.creator} />}\n {resolvedMetadata.publisher && (\n <meta name=\"publisher\" content={resolvedMetadata.publisher} />\n )}\n {resolvedMetadata.referrer && <meta name=\"referrer\" content={resolvedMetadata.referrer} />}\n {resolvedMetadata.category && <meta name=\"category\" content={resolvedMetadata.category} />}\n {resolvedMetadata.classification && (\n <meta name=\"classification\" content={resolvedMetadata.classification} />\n )}\n {formatDetection && <meta name=\"format-detection\" content={formatDetection} />}\n\n {/* Authors */}\n {authors.map((author, index) => (\n <Fragment>\n <meta name=\"author\" content={author.name} />\n {author.url && <link rel=\"author\" href={author.url} />}\n </Fragment>\n ))}\n\n {/* Icons */}\n {icons.icon.map((url, index) => (\n <link rel=\"icon\" href={url} />\n ))}\n {icons.shortcut && <link rel=\"shortcut icon\" href={icons.shortcut} />}\n {icons.apple.map((url, index) => (\n <link rel=\"apple-touch-icon\" href={url} />\n ))}\n {icons.other.map((icon, index) => (\n <link\n rel={icon.rel || 'icon'}\n href={icon.url}\n {...(icon.sizes && { sizes: icon.sizes })}\n {...(icon.type && { type: icon.type })}\n />\n ))}\n\n {/* Manifest */}\n {resolvedMetadata.manifest && <link rel=\"manifest\" href={resolvedMetadata.manifest} />}\n\n {/* Feeds */}\n {resolvedMetadata.feed && (\n <link rel=\"alternate\" type=\"application/rss+xml\" href={resolvedMetadata.feed} />\n )}\n\n {/* Verification */}\n {resolvedMetadata.verification?.google && (\n <meta name=\"google-site-verification\" content={resolvedMetadata.verification.google} />\n )}\n {resolvedMetadata.verification?.yahoo && (\n <meta name=\"y_key\" content={resolvedMetadata.verification.yahoo} />\n )}\n {resolvedMetadata.verification?.yandex && (\n <meta name=\"yandex-verification\" content={resolvedMetadata.verification.yandex} />\n )}\n {resolvedMetadata.verification?.me &&\n (Array.isArray(resolvedMetadata.verification.me) ? (\n resolvedMetadata.verification.me.map((url, index) => <link rel=\"me\" href={url} />)\n ) : (\n <link rel=\"me\" href={resolvedMetadata.verification.me} />\n ))}\n {resolvedMetadata.verification?.other &&\n Object.entries(resolvedMetadata.verification.other).map(([key, value]) =>\n Array.isArray(value) ? (\n value.map((v, index) => <meta name={key} content={v} />)\n ) : (\n <meta name={key} content={value} />\n ),\n )}\n\n {/* App Links */}\n {resolvedMetadata.appLinks && (\n <Fragment>\n {resolvedMetadata.appLinks.ios?.url && (\n <meta property=\"al:ios:url\" content={resolvedMetadata.appLinks.ios.url} />\n )}\n {resolvedMetadata.appLinks.ios?.app_store_id && (\n <meta\n property=\"al:ios:app_store_id\"\n content={resolvedMetadata.appLinks.ios.app_store_id}\n />\n )}\n {resolvedMetadata.appLinks.ios?.app_name && (\n <meta property=\"al:ios:app_name\" content={resolvedMetadata.appLinks.ios.app_name} />\n )}\n {resolvedMetadata.appLinks.android?.package && (\n <meta\n property=\"al:android:package\"\n content={resolvedMetadata.appLinks.android.package}\n />\n )}\n {resolvedMetadata.appLinks.android?.app_name && (\n <meta\n property=\"al:android:app_name\"\n content={resolvedMetadata.appLinks.android.app_name}\n />\n )}\n {resolvedMetadata.appLinks.android?.url && (\n <meta property=\"al:android:url\" content={resolvedMetadata.appLinks.android.url} />\n )}\n {resolvedMetadata.appLinks.web?.url && (\n <meta property=\"al:web:url\" content={resolvedMetadata.appLinks.web.url} />\n )}\n {resolvedMetadata.appLinks.web?.should_fallback !== undefined && (\n <meta\n property=\"al:web:should_fallback\"\n content={String(resolvedMetadata.appLinks.web.should_fallback)}\n />\n )}\n </Fragment>\n )}\n\n {/* Additional meta tags */}\n {resolvedMetadata.other &&\n Object.entries(resolvedMetadata.other).map(([key, value]) =>\n Array.isArray(value) ? (\n value.map((v, index) => <meta name={key} content={String(v)} />)\n ) : (\n <meta name={key} content={String(value)} />\n ),\n )}\n </Head>\n\n {/* SEO: OpenGraph, Twitter - lower priority */}\n {(resolvedMetadata.openGraph || resolvedMetadata.twitter) && (\n <Head priority={HEAD_PRIORITY.SEO}>\n {/* Open Graph */}\n {resolvedMetadata.openGraph && (\n <Fragment>\n {resolvedMetadata.openGraph.title && (\n <meta property=\"og:title\" content={resolvedMetadata.openGraph.title} />\n )}\n {resolvedMetadata.openGraph.description && (\n <meta property=\"og:description\" content={resolvedMetadata.openGraph.description} />\n )}\n {resolvedMetadata.openGraph.type && (\n <meta property=\"og:type\" content={resolvedMetadata.openGraph.type} />\n )}\n {resolvedMetadata.openGraph.url && (\n <meta property=\"og:url\" content={resolvedMetadata.openGraph.url} />\n )}\n {resolvedMetadata.openGraph.siteName && (\n <meta property=\"og:site_name\" content={resolvedMetadata.openGraph.siteName} />\n )}\n {resolvedMetadata.openGraph.locale && (\n <meta property=\"og:locale\" content={resolvedMetadata.openGraph.locale} />\n )}\n {resolvedMetadata.openGraph.alternateLocale &&\n (Array.isArray(resolvedMetadata.openGraph.alternateLocale) ? (\n resolvedMetadata.openGraph.alternateLocale.map((locale, index) => (\n <meta property=\"og:locale:alternate\" content={locale} />\n ))\n ) : (\n <meta\n property=\"og:locale:alternate\"\n content={resolvedMetadata.openGraph.alternateLocale}\n />\n ))}\n {resolvedMetadata.openGraph.determiner && (\n <meta property=\"og:determiner\" content={resolvedMetadata.openGraph.determiner} />\n )}\n\n {/* OG Images */}\n {ogImages.map((image, index) => (\n <Fragment>\n <meta property=\"og:image\" content={image.url} />\n {image.secureUrl && (\n <meta property=\"og:image:secure_url\" content={image.secureUrl} />\n )}\n {image.alt && <meta property=\"og:image:alt\" content={image.alt} />}\n {image.type && <meta property=\"og:image:type\" content={image.type} />}\n {image.width && <meta property=\"og:image:width\" content={String(image.width)} />}\n {image.height && (\n <meta property=\"og:image:height\" content={String(image.height)} />\n )}\n </Fragment>\n ))}\n\n {/* Article specific */}\n {resolvedMetadata.openGraph.publishedTime && (\n <meta\n property=\"article:published_time\"\n content={resolvedMetadata.openGraph.publishedTime}\n />\n )}\n {resolvedMetadata.openGraph.modifiedTime && (\n <meta\n property=\"article:modified_time\"\n content={resolvedMetadata.openGraph.modifiedTime}\n />\n )}\n {resolvedMetadata.openGraph.expirationTime && (\n <meta\n property=\"article:expiration_time\"\n content={resolvedMetadata.openGraph.expirationTime}\n />\n )}\n {resolvedMetadata.openGraph.authors &&\n (Array.isArray(resolvedMetadata.openGraph.authors) ? (\n resolvedMetadata.openGraph.authors.map((author, index) => (\n <meta property=\"article:author\" content={author} />\n ))\n ) : (\n <meta property=\"article:author\" content={resolvedMetadata.openGraph.authors} />\n ))}\n {resolvedMetadata.openGraph.section && (\n <meta property=\"article:section\" content={resolvedMetadata.openGraph.section} />\n )}\n {resolvedMetadata.openGraph.tags &&\n (Array.isArray(resolvedMetadata.openGraph.tags) ? (\n resolvedMetadata.openGraph.tags.map((tag, index) => (\n <meta property=\"article:tag\" content={tag} />\n ))\n ) : (\n <meta property=\"article:tag\" content={resolvedMetadata.openGraph.tags} />\n ))}\n\n {/* Book specific */}\n {resolvedMetadata.openGraph.isbn && (\n <meta property=\"book:isbn\" content={resolvedMetadata.openGraph.isbn} />\n )}\n {resolvedMetadata.openGraph.releaseDate && (\n <meta\n property=\"book:release_date\"\n content={resolvedMetadata.openGraph.releaseDate}\n />\n )}\n\n {/* Profile specific */}\n {resolvedMetadata.openGraph.firstName && (\n <meta\n property=\"profile:first_name\"\n content={resolvedMetadata.openGraph.firstName}\n />\n )}\n {resolvedMetadata.openGraph.lastName && (\n <meta property=\"profile:last_name\" content={resolvedMetadata.openGraph.lastName} />\n )}\n {resolvedMetadata.openGraph.username && (\n <meta property=\"profile:username\" content={resolvedMetadata.openGraph.username} />\n )}\n {resolvedMetadata.openGraph.gender && (\n <meta property=\"profile:gender\" content={resolvedMetadata.openGraph.gender} />\n )}\n </Fragment>\n )}\n\n {/* Twitter Card */}\n {resolvedMetadata.twitter && (\n <Fragment>\n {resolvedMetadata.twitter.card && (\n <meta name=\"twitter:card\" content={resolvedMetadata.twitter.card} />\n )}\n {resolvedMetadata.twitter.site && (\n <meta name=\"twitter:site\" content={resolvedMetadata.twitter.site} />\n )}\n {resolvedMetadata.twitter.siteId && (\n <meta name=\"twitter:site:id\" content={resolvedMetadata.twitter.siteId} />\n )}\n {resolvedMetadata.twitter.creator && (\n <meta name=\"twitter:creator\" content={resolvedMetadata.twitter.creator} />\n )}\n {resolvedMetadata.twitter.creatorId && (\n <meta name=\"twitter:creator:id\" content={resolvedMetadata.twitter.creatorId} />\n )}\n {resolvedMetadata.twitter.title && (\n <meta name=\"twitter:title\" content={resolvedMetadata.twitter.title} />\n )}\n {resolvedMetadata.twitter.description && (\n <meta name=\"twitter:description\" content={resolvedMetadata.twitter.description} />\n )}\n\n {/* Twitter Images */}\n {twitterImages.map((image, index) => (\n <Fragment>\n <meta name=\"twitter:image\" content={image.url} />\n {image.alt && <meta name=\"twitter:image:alt\" content={image.alt} />}\n </Fragment>\n ))}\n\n {/* Twitter App */}\n {resolvedMetadata.twitter.app && (\n <Fragment>\n {resolvedMetadata.twitter.app.name && (\n <meta name=\"twitter:app:name\" content={resolvedMetadata.twitter.app.name} />\n )}\n {resolvedMetadata.twitter.app.id.iphone && (\n <meta\n name=\"twitter:app:id:iphone\"\n content={resolvedMetadata.twitter.app.id.iphone}\n />\n )}\n {resolvedMetadata.twitter.app.id.ipad && (\n <meta\n name=\"twitter:app:id:ipad\"\n content={resolvedMetadata.twitter.app.id.ipad}\n />\n )}\n {resolvedMetadata.twitter.app.id.googleplay && (\n <meta\n name=\"twitter:app:id:googleplay\"\n content={resolvedMetadata.twitter.app.id.googleplay}\n />\n )}\n {resolvedMetadata.twitter.app.url?.iphone && (\n <meta\n name=\"twitter:app:url:iphone\"\n content={resolvedMetadata.twitter.app.url.iphone}\n />\n )}\n {resolvedMetadata.twitter.app.url?.ipad && (\n <meta\n name=\"twitter:app:url:ipad\"\n content={resolvedMetadata.twitter.app.url.ipad}\n />\n )}\n {resolvedMetadata.twitter.app.url?.googleplay && (\n <meta\n name=\"twitter:app:url:googleplay\"\n content={resolvedMetadata.twitter.app.url.googleplay}\n />\n )}\n </Fragment>\n )}\n </Fragment>\n )}\n </Head>\n )}\n </>\n );\n}\n"],"names":["MetadataRenderer","metadata","request","useRequest","stackMetadata","resolveMetadata","resolvedMetadata","mergeMetadata","getTitle","getRobots","name","parts","getViewport","getKeywords","getAuthors","getFormatDetection","getOgImages","img","getTwitterImages","getIcons","iconUrls","appleUrls","title","robots","viewport","keywords","authors","formatDetection","ogImages","twitterImages","icons","themeColors","jsxFactory","__Fragment","Head","HEAD_PRIORITY","color","index","author","Fragment","url","icon","key","value","v","locale","image","tag"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generateMetadata-CIFVlViV.js","sources":["../src/seo/generateMetadata.tsx"],"sourcesContent":["/// <reference types=\"../core/jsx-types\" />\nimport { HEAD_PRIORITY } from '../core/head-priority';\nimport { Fragment, Head, resolveMetadata, useRequest } from '../core/jsx-runtime';\n\nimport { mergeMetadata } from './mergeMetadata';\nimport type { Metadata } from './types';\n\n/**\n * Converts Metadata object to SEO meta tags\n * This is the core function that transforms the metadata object into actual HTML tags\n *\n * If metadata is provided, it will be merged with metadata from the stack (from global/page loaders)\n * If no metadata is provided, it will use resolved metadata from the stack\n */\nexport function MetadataRenderer({ metadata }: { metadata?: Metadata }) {\n const { request } = useRequest();\n\n // Resolve metadata from stack (hierarchical metadata from loaders)\n const stackMetadata = resolveMetadata();\n\n // Merge: stack metadata (parent) + provided metadata (child)\n // If metadata is provided, it overrides stack metadata\n // If not provided, use stack metadata only\n const resolvedMetadata = metadata ? mergeMetadata(stackMetadata, metadata) : stackMetadata;\n\n if (!resolvedMetadata) return null;\n\n // Helper to normalize title\n const getTitle = () => {\n if (!resolvedMetadata.title) return null;\n if (typeof resolvedMetadata.title === 'string') return resolvedMetadata.title;\n // Handle TemplateString\n return resolvedMetadata.title.default;\n };\n\n // Helper to normalize robots\n const getRobots = () => {\n // tránh tiêm query\n const queryNames = Object.keys(request.query || {});\n // mặc định nếu có query sẽ ép robots về noindex\n // tuy nhiên 1 số trường hợp đặc biệt ví dụ như page=1 có chủ đích `allowQueryNames` sẽ bỏ qua nguyên tắc này\n\n const noindex =\n queryNames.filter((name) => {\n if (typeof resolvedMetadata.robots === 'string') return false;\n if (Array.isArray(resolvedMetadata.robots?.allowQueryNames))\n return !resolvedMetadata.robots.allowQueryNames.includes(name);\n return name !== resolvedMetadata.robots?.allowQueryNames;\n }).length > 0;\n\n if (noindex) return 'noindex, follow';\n\n if (!resolvedMetadata.robots) return null;\n if (typeof resolvedMetadata.robots === 'string') return resolvedMetadata.robots;\n\n const parts: string[] = [];\n if (resolvedMetadata.robots.index === false) parts.push('noindex');\n else if (resolvedMetadata.robots.index === true) parts.push('index');\n\n if (resolvedMetadata.robots.follow === false) parts.push('nofollow');\n else if (resolvedMetadata.robots.follow === true) parts.push('follow');\n\n if (resolvedMetadata.robots.noarchive) parts.push('noarchive');\n if (resolvedMetadata.robots.nosnippet) parts.push('nosnippet');\n if (resolvedMetadata.robots.noimageindex) parts.push('noimageindex');\n if (resolvedMetadata.robots.nocache) parts.push('nocache');\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize viewport\n const getViewport = () => {\n if (!resolvedMetadata.viewport) return null;\n if (typeof resolvedMetadata.viewport === 'string') return resolvedMetadata.viewport;\n\n const parts: string[] = [];\n if (resolvedMetadata.viewport.width) parts.push(`width=${resolvedMetadata.viewport.width}`);\n if (resolvedMetadata.viewport.height) parts.push(`height=${resolvedMetadata.viewport.height}`);\n if (resolvedMetadata.viewport.initialScale)\n parts.push(`initial-scale=${resolvedMetadata.viewport.initialScale}`);\n if (resolvedMetadata.viewport.maximumScale)\n parts.push(`maximum-scale=${resolvedMetadata.viewport.maximumScale}`);\n if (resolvedMetadata.viewport.minimumScale)\n parts.push(`minimum-scale=${resolvedMetadata.viewport.minimumScale}`);\n if (resolvedMetadata.viewport.userScalable !== undefined) {\n parts.push(`user-scalable=${resolvedMetadata.viewport.userScalable ? 'yes' : 'no'}`);\n }\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize keywords\n const getKeywords = () => {\n if (!resolvedMetadata.keywords) return null;\n if (Array.isArray(resolvedMetadata.keywords)) return resolvedMetadata.keywords.join(', ');\n return resolvedMetadata.keywords;\n };\n\n // Helper to normalize authors\n const getAuthors = () => {\n if (!resolvedMetadata.author) return [];\n if (typeof resolvedMetadata.author === 'string') return [{ name: resolvedMetadata.author }];\n if (Array.isArray(resolvedMetadata.author)) return resolvedMetadata.author;\n return [resolvedMetadata.author];\n };\n\n // Helper to normalize format detection\n const getFormatDetection = () => {\n if (!resolvedMetadata.formatDetection) return null;\n\n const parts: string[] = [];\n if (resolvedMetadata.formatDetection.telephone === false) parts.push('telephone=no');\n if (resolvedMetadata.formatDetection.date === false) parts.push('date=no');\n if (resolvedMetadata.formatDetection.address === false) parts.push('address=no');\n if (resolvedMetadata.formatDetection.email === false) parts.push('email=no');\n\n return parts.length > 0 ? parts.join(', ') : null;\n };\n\n // Helper to normalize Open Graph images\n const getOgImages = () => {\n if (!resolvedMetadata.openGraph?.images) return [];\n\n const images = Array.isArray(resolvedMetadata.openGraph.images)\n ? resolvedMetadata.openGraph.images\n : [resolvedMetadata.openGraph.images];\n\n return images.map((img) => {\n if (typeof img === 'string') return { url: img };\n return img;\n });\n };\n\n // Helper to normalize Twitter images\n const getTwitterImages = () => {\n if (!resolvedMetadata.twitter?.images) return [];\n\n const images = Array.isArray(resolvedMetadata.twitter.images)\n ? resolvedMetadata.twitter.images\n : [resolvedMetadata.twitter.images];\n\n return images.map((img) => {\n if (typeof img === 'string') return { url: img };\n return img;\n });\n };\n\n // Helper to get icon URLs\n const getIcons = () => {\n if (!resolvedMetadata.icons) return { icon: [], apple: [], shortcut: null, other: [] };\n\n const iconUrls = resolvedMetadata.icons.icon\n ? Array.isArray(resolvedMetadata.icons.icon)\n ? resolvedMetadata.icons.icon\n : [resolvedMetadata.icons.icon]\n : [];\n\n const appleUrls = resolvedMetadata.icons.apple\n ? Array.isArray(resolvedMetadata.icons.apple)\n ? resolvedMetadata.icons.apple\n : [resolvedMetadata.icons.apple]\n : [];\n\n return {\n icon: iconUrls,\n apple: appleUrls,\n shortcut: resolvedMetadata.icons.shortcut || null,\n other: resolvedMetadata.icons.other || [],\n };\n };\n\n const title = getTitle();\n const robots = getRobots();\n const viewport = getViewport();\n const keywords = getKeywords();\n const authors = getAuthors();\n const formatDetection = getFormatDetection();\n const ogImages = getOgImages();\n const twitterImages = getTwitterImages();\n const icons = getIcons();\n const themeColors = Array.isArray(resolvedMetadata.themeColor)\n ? resolvedMetadata.themeColor\n : resolvedMetadata.themeColor\n ? [resolvedMetadata.themeColor]\n : [];\n\n return (\n <>\n {/* Critical: charset, viewport - must be first */}\n {(resolvedMetadata.charset || viewport) && (\n <Head priority={HEAD_PRIORITY.CRITICAL}>\n {resolvedMetadata.charset && <meta charset={resolvedMetadata.charset} />}\n {viewport && <meta name=\"viewport\" content={viewport} />}\n </Head>\n )}\n\n {/* High priority: title, description, canonical, prev/next */}\n {(title ||\n resolvedMetadata.description ||\n resolvedMetadata.canonical ||\n resolvedMetadata.prev ||\n resolvedMetadata.next) && (\n <Head priority={HEAD_PRIORITY.HIGH}>\n {title && <title>{title}</title>}\n {resolvedMetadata.description && (\n <meta name=\"description\" content={resolvedMetadata.description} />\n )}\n {resolvedMetadata.canonical && <link rel=\"canonical\" href={resolvedMetadata.canonical} />}\n {resolvedMetadata.prev && <link rel=\"prev\" href={resolvedMetadata.prev} />}\n {resolvedMetadata.next && <link rel=\"next\" href={resolvedMetadata.next} />}\n </Head>\n )}\n\n {/* Medium priority: meta tags, robots */}\n <Head priority={HEAD_PRIORITY.MEDIUM}>\n {keywords && <meta name=\"keywords\" content={keywords} />}\n {robots && <meta name=\"robots\" content={robots} />}\n {resolvedMetadata.colorScheme && (\n <meta name=\"color-scheme\" content={resolvedMetadata.colorScheme} />\n )}\n\n {/* Theme colors */}\n {themeColors.map((color, index) => (\n <meta name=\"theme-color\" content={color} />\n ))}\n\n {resolvedMetadata.generator && (\n <meta name=\"generator\" content={resolvedMetadata.generator} />\n )}\n {resolvedMetadata.creator && <meta name=\"creator\" content={resolvedMetadata.creator} />}\n {resolvedMetadata.publisher && (\n <meta name=\"publisher\" content={resolvedMetadata.publisher} />\n )}\n {resolvedMetadata.referrer && <meta name=\"referrer\" content={resolvedMetadata.referrer} />}\n {resolvedMetadata.category && <meta name=\"category\" content={resolvedMetadata.category} />}\n {resolvedMetadata.classification && (\n <meta name=\"classification\" content={resolvedMetadata.classification} />\n )}\n {formatDetection && <meta name=\"format-detection\" content={formatDetection} />}\n\n {/* Authors */}\n {authors.map((author, index) => (\n <Fragment>\n <meta name=\"author\" content={author.name} />\n {author.url && <link rel=\"author\" href={author.url} />}\n </Fragment>\n ))}\n\n {/* Icons */}\n {icons.icon.map((url, index) => (\n <link rel=\"icon\" href={url} />\n ))}\n {icons.shortcut && <link rel=\"shortcut icon\" href={icons.shortcut} />}\n {icons.apple.map((url, index) => (\n <link rel=\"apple-touch-icon\" href={url} />\n ))}\n {icons.other.map((icon, index) => (\n <link\n rel={icon.rel || 'icon'}\n href={icon.url}\n {...(icon.sizes && { sizes: icon.sizes })}\n {...(icon.type && { type: icon.type })}\n />\n ))}\n\n {/* Manifest */}\n {resolvedMetadata.manifest && <link rel=\"manifest\" href={resolvedMetadata.manifest} />}\n\n {/* Feeds */}\n {resolvedMetadata.feed && (\n <link rel=\"alternate\" type=\"application/rss+xml\" href={resolvedMetadata.feed} />\n )}\n\n {/* Verification */}\n {resolvedMetadata.verification?.google && (\n <meta name=\"google-site-verification\" content={resolvedMetadata.verification.google} />\n )}\n {resolvedMetadata.verification?.yahoo && (\n <meta name=\"y_key\" content={resolvedMetadata.verification.yahoo} />\n )}\n {resolvedMetadata.verification?.yandex && (\n <meta name=\"yandex-verification\" content={resolvedMetadata.verification.yandex} />\n )}\n {resolvedMetadata.verification?.me &&\n (Array.isArray(resolvedMetadata.verification.me) ? (\n resolvedMetadata.verification.me.map((url, index) => <link rel=\"me\" href={url} />)\n ) : (\n <link rel=\"me\" href={resolvedMetadata.verification.me} />\n ))}\n {resolvedMetadata.verification?.other &&\n Object.entries(resolvedMetadata.verification.other).map(([key, value]) =>\n Array.isArray(value) ? (\n value.map((v, index) => <meta name={key} content={v} />)\n ) : (\n <meta name={key} content={value} />\n ),\n )}\n\n {/* App Links */}\n {resolvedMetadata.appLinks && (\n <Fragment>\n {resolvedMetadata.appLinks.ios?.url && (\n <meta property=\"al:ios:url\" content={resolvedMetadata.appLinks.ios.url} />\n )}\n {resolvedMetadata.appLinks.ios?.app_store_id && (\n <meta\n property=\"al:ios:app_store_id\"\n content={resolvedMetadata.appLinks.ios.app_store_id}\n />\n )}\n {resolvedMetadata.appLinks.ios?.app_name && (\n <meta property=\"al:ios:app_name\" content={resolvedMetadata.appLinks.ios.app_name} />\n )}\n {resolvedMetadata.appLinks.android?.package && (\n <meta\n property=\"al:android:package\"\n content={resolvedMetadata.appLinks.android.package}\n />\n )}\n {resolvedMetadata.appLinks.android?.app_name && (\n <meta\n property=\"al:android:app_name\"\n content={resolvedMetadata.appLinks.android.app_name}\n />\n )}\n {resolvedMetadata.appLinks.android?.url && (\n <meta property=\"al:android:url\" content={resolvedMetadata.appLinks.android.url} />\n )}\n {resolvedMetadata.appLinks.web?.url && (\n <meta property=\"al:web:url\" content={resolvedMetadata.appLinks.web.url} />\n )}\n {resolvedMetadata.appLinks.web?.should_fallback !== undefined && (\n <meta\n property=\"al:web:should_fallback\"\n content={String(resolvedMetadata.appLinks.web.should_fallback)}\n />\n )}\n </Fragment>\n )}\n\n {/* Additional meta tags */}\n {resolvedMetadata.other &&\n Object.entries(resolvedMetadata.other).map(([key, value]) =>\n Array.isArray(value) ? (\n value.map((v, index) => <meta name={key} content={String(v)} />)\n ) : (\n <meta name={key} content={String(value)} />\n ),\n )}\n </Head>\n\n {/* SEO: OpenGraph, Twitter - lower priority */}\n {(resolvedMetadata.openGraph || resolvedMetadata.twitter) && (\n <Head priority={HEAD_PRIORITY.SEO}>\n {/* Open Graph */}\n {resolvedMetadata.openGraph && (\n <Fragment>\n {resolvedMetadata.openGraph.title && (\n <meta property=\"og:title\" content={resolvedMetadata.openGraph.title} />\n )}\n {resolvedMetadata.openGraph.description && (\n <meta property=\"og:description\" content={resolvedMetadata.openGraph.description} />\n )}\n {resolvedMetadata.openGraph.type && (\n <meta property=\"og:type\" content={resolvedMetadata.openGraph.type} />\n )}\n {resolvedMetadata.openGraph.url && (\n <meta property=\"og:url\" content={resolvedMetadata.openGraph.url} />\n )}\n {resolvedMetadata.openGraph.siteName && (\n <meta property=\"og:site_name\" content={resolvedMetadata.openGraph.siteName} />\n )}\n {resolvedMetadata.openGraph.locale && (\n <meta property=\"og:locale\" content={resolvedMetadata.openGraph.locale} />\n )}\n {resolvedMetadata.openGraph.alternateLocale &&\n (Array.isArray(resolvedMetadata.openGraph.alternateLocale) ? (\n resolvedMetadata.openGraph.alternateLocale.map((locale, index) => (\n <meta property=\"og:locale:alternate\" content={locale} />\n ))\n ) : (\n <meta\n property=\"og:locale:alternate\"\n content={resolvedMetadata.openGraph.alternateLocale}\n />\n ))}\n {resolvedMetadata.openGraph.determiner && (\n <meta property=\"og:determiner\" content={resolvedMetadata.openGraph.determiner} />\n )}\n\n {/* OG Images */}\n {ogImages.map((image, index) => (\n <Fragment>\n <meta property=\"og:image\" content={image.url} />\n {image.secureUrl && (\n <meta property=\"og:image:secure_url\" content={image.secureUrl} />\n )}\n {image.alt && <meta property=\"og:image:alt\" content={image.alt} />}\n {image.type && <meta property=\"og:image:type\" content={image.type} />}\n {image.width && <meta property=\"og:image:width\" content={String(image.width)} />}\n {image.height && (\n <meta property=\"og:image:height\" content={String(image.height)} />\n )}\n </Fragment>\n ))}\n\n {/* Article specific */}\n {resolvedMetadata.openGraph.publishedTime && (\n <meta\n property=\"article:published_time\"\n content={resolvedMetadata.openGraph.publishedTime}\n />\n )}\n {resolvedMetadata.openGraph.modifiedTime && (\n <meta\n property=\"article:modified_time\"\n content={resolvedMetadata.openGraph.modifiedTime}\n />\n )}\n {resolvedMetadata.openGraph.expirationTime && (\n <meta\n property=\"article:expiration_time\"\n content={resolvedMetadata.openGraph.expirationTime}\n />\n )}\n {resolvedMetadata.openGraph.authors &&\n (Array.isArray(resolvedMetadata.openGraph.authors) ? (\n resolvedMetadata.openGraph.authors.map((author, index) => (\n <meta property=\"article:author\" content={author} />\n ))\n ) : (\n <meta property=\"article:author\" content={resolvedMetadata.openGraph.authors} />\n ))}\n {resolvedMetadata.openGraph.section && (\n <meta property=\"article:section\" content={resolvedMetadata.openGraph.section} />\n )}\n {resolvedMetadata.openGraph.tags &&\n (Array.isArray(resolvedMetadata.openGraph.tags) ? (\n resolvedMetadata.openGraph.tags.map((tag, index) => (\n <meta property=\"article:tag\" content={tag} />\n ))\n ) : (\n <meta property=\"article:tag\" content={resolvedMetadata.openGraph.tags} />\n ))}\n\n {/* Book specific */}\n {resolvedMetadata.openGraph.isbn && (\n <meta property=\"book:isbn\" content={resolvedMetadata.openGraph.isbn} />\n )}\n {resolvedMetadata.openGraph.releaseDate && (\n <meta\n property=\"book:release_date\"\n content={resolvedMetadata.openGraph.releaseDate}\n />\n )}\n\n {/* Profile specific */}\n {resolvedMetadata.openGraph.firstName && (\n <meta\n property=\"profile:first_name\"\n content={resolvedMetadata.openGraph.firstName}\n />\n )}\n {resolvedMetadata.openGraph.lastName && (\n <meta property=\"profile:last_name\" content={resolvedMetadata.openGraph.lastName} />\n )}\n {resolvedMetadata.openGraph.username && (\n <meta property=\"profile:username\" content={resolvedMetadata.openGraph.username} />\n )}\n {resolvedMetadata.openGraph.gender && (\n <meta property=\"profile:gender\" content={resolvedMetadata.openGraph.gender} />\n )}\n </Fragment>\n )}\n\n {/* Twitter Card */}\n {resolvedMetadata.twitter && (\n <Fragment>\n {resolvedMetadata.twitter.card && (\n <meta name=\"twitter:card\" content={resolvedMetadata.twitter.card} />\n )}\n {resolvedMetadata.twitter.site && (\n <meta name=\"twitter:site\" content={resolvedMetadata.twitter.site} />\n )}\n {resolvedMetadata.twitter.siteId && (\n <meta name=\"twitter:site:id\" content={resolvedMetadata.twitter.siteId} />\n )}\n {resolvedMetadata.twitter.creator && (\n <meta name=\"twitter:creator\" content={resolvedMetadata.twitter.creator} />\n )}\n {resolvedMetadata.twitter.creatorId && (\n <meta name=\"twitter:creator:id\" content={resolvedMetadata.twitter.creatorId} />\n )}\n {resolvedMetadata.twitter.title && (\n <meta name=\"twitter:title\" content={resolvedMetadata.twitter.title} />\n )}\n {resolvedMetadata.twitter.description && (\n <meta name=\"twitter:description\" content={resolvedMetadata.twitter.description} />\n )}\n\n {/* Twitter Images */}\n {twitterImages.map((image, index) => (\n <Fragment>\n <meta name=\"twitter:image\" content={image.url} />\n {image.alt && <meta name=\"twitter:image:alt\" content={image.alt} />}\n </Fragment>\n ))}\n\n {/* Twitter App */}\n {resolvedMetadata.twitter.app && (\n <Fragment>\n {resolvedMetadata.twitter.app.name && (\n <meta name=\"twitter:app:name\" content={resolvedMetadata.twitter.app.name} />\n )}\n {resolvedMetadata.twitter.app.id.iphone && (\n <meta\n name=\"twitter:app:id:iphone\"\n content={resolvedMetadata.twitter.app.id.iphone}\n />\n )}\n {resolvedMetadata.twitter.app.id.ipad && (\n <meta\n name=\"twitter:app:id:ipad\"\n content={resolvedMetadata.twitter.app.id.ipad}\n />\n )}\n {resolvedMetadata.twitter.app.id.googleplay && (\n <meta\n name=\"twitter:app:id:googleplay\"\n content={resolvedMetadata.twitter.app.id.googleplay}\n />\n )}\n {resolvedMetadata.twitter.app.url?.iphone && (\n <meta\n name=\"twitter:app:url:iphone\"\n content={resolvedMetadata.twitter.app.url.iphone}\n />\n )}\n {resolvedMetadata.twitter.app.url?.ipad && (\n <meta\n name=\"twitter:app:url:ipad\"\n content={resolvedMetadata.twitter.app.url.ipad}\n />\n )}\n {resolvedMetadata.twitter.app.url?.googleplay && (\n <meta\n name=\"twitter:app:url:googleplay\"\n content={resolvedMetadata.twitter.app.url.googleplay}\n />\n )}\n </Fragment>\n )}\n </Fragment>\n )}\n </Head>\n )}\n </>\n );\n}\n"],"names":["MetadataRenderer","metadata","request","useRequest","stackMetadata","resolveMetadata","resolvedMetadata","mergeMetadata","getTitle","getRobots","name","parts","getViewport","getKeywords","getAuthors","getFormatDetection","getOgImages","img","getTwitterImages","getIcons","iconUrls","appleUrls","title","robots","viewport","keywords","authors","formatDetection","ogImages","twitterImages","icons","themeColors","jsxFactory","__Fragment","Head","HEAD_PRIORITY","color","index","author","Fragment","url","icon","key","value","v","locale","image","tag"],"mappings":"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"}
|