@leadertechie/personal-site-kit 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/api/handlers/aboutme.d.ts +3 -0
  4. package/dist/api/handlers/aboutme.d.ts.map +1 -0
  5. package/dist/api/handlers/content-api.d.ts +5 -0
  6. package/dist/api/handlers/content-api.d.ts.map +1 -0
  7. package/dist/api/handlers/content.d.ts +2 -0
  8. package/dist/api/handlers/content.d.ts.map +1 -0
  9. package/dist/api/handlers/home.d.ts +3 -0
  10. package/dist/api/handlers/home.d.ts.map +1 -0
  11. package/dist/api/handlers/info.d.ts +2 -0
  12. package/dist/api/handlers/info.d.ts.map +1 -0
  13. package/dist/api/handlers/logo.d.ts +2 -0
  14. package/dist/api/handlers/logo.d.ts.map +1 -0
  15. package/dist/api/handlers/staticdetails.d.ts +2 -0
  16. package/dist/api/handlers/staticdetails.d.ts.map +1 -0
  17. package/dist/api/index.d.ts +9 -0
  18. package/dist/api/index.d.ts.map +1 -0
  19. package/dist/api/utils.d.ts +8 -0
  20. package/dist/api/utils.d.ts.map +1 -0
  21. package/dist/api.d.ts +4 -0
  22. package/dist/api.js +591 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +354 -0
  25. package/dist/prerender/index.d.ts +5 -0
  26. package/dist/prerender/index.d.ts.map +1 -0
  27. package/dist/prerender/pageContent.d.ts +16 -0
  28. package/dist/prerender/pageContent.d.ts.map +1 -0
  29. package/dist/prerender/prerender.d.ts +3 -0
  30. package/dist/prerender/prerender.d.ts.map +1 -0
  31. package/dist/prerender/template.d.ts +10 -0
  32. package/dist/prerender/template.d.ts.map +1 -0
  33. package/dist/prerender.d.ts +4 -0
  34. package/dist/prerender.js +399 -0
  35. package/dist/shared/config/api.d.ts +2 -0
  36. package/dist/shared/config/api.d.ts.map +1 -0
  37. package/dist/shared/config/index.d.ts +5 -0
  38. package/dist/shared/config/index.d.ts.map +1 -0
  39. package/dist/shared/config/types.d.ts +16 -0
  40. package/dist/shared/config/types.d.ts.map +1 -0
  41. package/dist/shared/core/site-store.d.ts +16 -0
  42. package/dist/shared/core/site-store.d.ts.map +1 -0
  43. package/dist/shared/core/theme-toggle.d.ts +13 -0
  44. package/dist/shared/core/theme-toggle.d.ts.map +1 -0
  45. package/dist/shared/index.d.ts +9 -0
  46. package/dist/shared/index.d.ts.map +1 -0
  47. package/dist/shared/interfaces/iFooterLink.d.ts +5 -0
  48. package/dist/shared/interfaces/iFooterLink.d.ts.map +1 -0
  49. package/dist/shared/interfaces/iRoute.d.ts +5 -0
  50. package/dist/shared/interfaces/iRoute.d.ts.map +1 -0
  51. package/dist/shared/pageContent.d.ts +35 -0
  52. package/dist/shared/pageContent.d.ts.map +1 -0
  53. package/dist/shared/runtime.d.ts +7 -0
  54. package/dist/shared/runtime.d.ts.map +1 -0
  55. package/dist/shared/template.d.ts +8 -0
  56. package/dist/shared/template.d.ts.map +1 -0
  57. package/dist/shared.d.ts +2 -0
  58. package/dist/shared.js +10 -0
  59. package/dist/ui/aboutme/api.d.ts +11 -0
  60. package/dist/ui/aboutme/api.d.ts.map +1 -0
  61. package/dist/ui/aboutme/index.d.ts +26 -0
  62. package/dist/ui/aboutme/index.d.ts.map +1 -0
  63. package/dist/ui/aboutme/renderer.d.ts +5 -0
  64. package/dist/ui/aboutme/renderer.d.ts.map +1 -0
  65. package/dist/ui/aboutme/styles.d.ts +2 -0
  66. package/dist/ui/aboutme/styles.d.ts.map +1 -0
  67. package/dist/ui/admin/index.d.ts +42 -0
  68. package/dist/ui/admin/index.d.ts.map +1 -0
  69. package/dist/ui/admin/styles.d.ts +2 -0
  70. package/dist/ui/admin/styles.d.ts.map +1 -0
  71. package/dist/ui/banner/index.d.ts +17 -0
  72. package/dist/ui/banner/index.d.ts.map +1 -0
  73. package/dist/ui/banner/styles.d.ts +2 -0
  74. package/dist/ui/banner/styles.d.ts.map +1 -0
  75. package/dist/ui/footer/index.d.ts +9 -0
  76. package/dist/ui/footer/index.d.ts.map +1 -0
  77. package/dist/ui/footer/styles.d.ts +2 -0
  78. package/dist/ui/footer/styles.d.ts.map +1 -0
  79. package/dist/ui.d.ts +2 -0
  80. package/dist/ui.js +820 -0
  81. package/package.json +41 -0
  82. package/src/api/__tests__/info.test.ts +44 -0
  83. package/src/api/__tests__/utils.test.ts +78 -0
  84. package/src/api/handlers/aboutme.ts +99 -0
  85. package/src/api/handlers/content-api.ts +268 -0
  86. package/src/api/handlers/content.ts +72 -0
  87. package/src/api/handlers/home.ts +79 -0
  88. package/src/api/handlers/info.ts +12 -0
  89. package/src/api/handlers/logo.ts +55 -0
  90. package/src/api/handlers/staticdetails.ts +48 -0
  91. package/src/api/index.ts +125 -0
  92. package/src/api/utils.ts +16 -0
  93. package/src/prerender/__tests__/pageContent.test.ts +54 -0
  94. package/src/prerender/__tests__/template.test.ts +54 -0
  95. package/src/prerender/index.ts +138 -0
  96. package/src/prerender/pageContent.ts +263 -0
  97. package/src/prerender/prerender.ts +25 -0
  98. package/src/prerender/template.ts +65 -0
  99. package/src/shared/config/api.ts +16 -0
  100. package/src/shared/config/index.ts +41 -0
  101. package/src/shared/config/types.ts +16 -0
  102. package/src/shared/core/__tests__/theme-toggle.test.ts +204 -0
  103. package/src/shared/core/site-store.ts +38 -0
  104. package/src/shared/core/theme-toggle.ts +118 -0
  105. package/src/shared/index.ts +15 -0
  106. package/src/shared/interfaces/iFooterLink.ts +4 -0
  107. package/src/shared/interfaces/iRoute.ts +4 -0
  108. package/src/shared/models/theme-variables.css +25 -0
  109. package/src/shared/pageContent.ts +209 -0
  110. package/src/shared/runtime.ts +11 -0
  111. package/src/shared/styles/markdown.css +129 -0
  112. package/src/shared/template.ts +35 -0
  113. package/src/styles/markdown.css +129 -0
  114. package/src/styles/theme.css +432 -0
  115. package/src/ui/aboutme/api.ts +12 -0
  116. package/src/ui/aboutme/index.ts +155 -0
  117. package/src/ui/aboutme/renderer.ts +7 -0
  118. package/src/ui/aboutme/styles.ts +10 -0
  119. package/src/ui/admin/index.ts +492 -0
  120. package/src/ui/admin/styles.ts +317 -0
  121. package/src/ui/banner/index.ts +38 -0
  122. package/src/ui/banner/styles.ts +10 -0
  123. package/src/ui/footer/index.ts +37 -0
  124. package/src/ui/footer/styles.ts +9 -0
package/dist/index.js ADDED
@@ -0,0 +1,354 @@
1
+ import { MarkdownPipeline } from "@leadertechie/md2html";
2
+ const DEFAULT_INFRA = {
3
+ baseUrl: typeof window !== "undefined" ? window.location.origin : "http://localhost:5173",
4
+ apiUrl: typeof window !== "undefined" && window.__VITE_API_URL__ || "http://localhost:8787"
5
+ };
6
+ const DEFAULT_STATIC = {
7
+ siteTitle: "My Personal Website",
8
+ siteDescription: "My Personal Website",
9
+ copyright: "2026 My Personal Website",
10
+ linkedin: "https://linkedin.com/in/yourname",
11
+ github: "https://github.com/yourname",
12
+ email: "yourname@domain.com"
13
+ };
14
+ let activeConfig = { ...DEFAULT_INFRA, ...DEFAULT_STATIC };
15
+ async function initializeConfig(infra) {
16
+ if (infra) {
17
+ activeConfig = { ...activeConfig, ...infra };
18
+ }
19
+ try {
20
+ const res = await fetch(`${activeConfig.apiUrl}/api/static`);
21
+ if (res.ok) {
22
+ const remoteStatic = await res.json();
23
+ activeConfig = { ...activeConfig, ...remoteStatic };
24
+ }
25
+ } catch (e) {
26
+ console.warn("Failed to load static details from R2, using defaults.");
27
+ }
28
+ return activeConfig;
29
+ }
30
+ function getConfig() {
31
+ return activeConfig;
32
+ }
33
+ class SiteStore {
34
+ constructor() {
35
+ this.config = null;
36
+ this.listeners = /* @__PURE__ */ new Set();
37
+ }
38
+ static getInstance() {
39
+ if (!SiteStore.instance) {
40
+ SiteStore.instance = new SiteStore();
41
+ }
42
+ return SiteStore.instance;
43
+ }
44
+ async init(infra) {
45
+ this.config = await initializeConfig(infra);
46
+ this.notify();
47
+ return this.config;
48
+ }
49
+ subscribe(listener) {
50
+ this.listeners.add(listener);
51
+ if (this.config) listener(this.config);
52
+ return () => this.listeners.delete(listener);
53
+ }
54
+ notify() {
55
+ if (this.config) {
56
+ this.listeners.forEach((l) => l(this.config));
57
+ }
58
+ }
59
+ getConfig() {
60
+ return this.config || getConfig();
61
+ }
62
+ }
63
+ class ThemeToggle extends HTMLElement {
64
+ constructor() {
65
+ super();
66
+ this.toggleTheme = () => {
67
+ const currentTheme = document.documentElement.getAttribute("data-theme");
68
+ const newTheme = currentTheme === "dark" ? "light" : "dark";
69
+ document.documentElement.setAttribute("data-theme", newTheme);
70
+ localStorage.setItem("theme", newTheme);
71
+ this.updateToggleButton(newTheme);
72
+ this.dispatchThemeChangeEvent(newTheme);
73
+ };
74
+ this.attachShadow({ mode: "open" });
75
+ this.render();
76
+ this.applyThemeFromLocalStorage();
77
+ }
78
+ connectedCallback() {
79
+ this.shadowRoot?.querySelector("button")?.addEventListener("click", this.toggleTheme);
80
+ }
81
+ disconnectedCallback() {
82
+ this.shadowRoot?.querySelector("button")?.removeEventListener("click", this.toggleTheme);
83
+ }
84
+ render() {
85
+ if (this.shadowRoot) {
86
+ this.shadowRoot.innerHTML = `
87
+ <style>
88
+ :host {
89
+ display: inline-block;
90
+ }
91
+ button {
92
+ background: none;
93
+ border: none;
94
+ cursor: pointer;
95
+ font-size: 1.5rem;
96
+ padding: 0.5rem;
97
+ color: var(--text-color, #213547); /* Default for light mode */
98
+ transition: color 0.3s ease;
99
+ }
100
+ button:hover {
101
+ color: var(--primary-color, #747bff); /* Hover color */
102
+ }
103
+ /* Dark mode specific styles for the button */
104
+ html[data-theme='dark'] button {
105
+ color: var(--dark-mode-text-color, rgba(255, 255, 255, 0.87));
106
+ }
107
+ html[data-theme='dark'] button:hover {
108
+ color: var(--dark-mode-primary-color, #646cff);
109
+ }
110
+ </style>
111
+ <button id="theme-toggle" aria-label="Toggle theme">
112
+ <span class="icon">${this.getSunIcon()}</span> <!-- Default to sun for light mode -->
113
+ </button>
114
+ `;
115
+ }
116
+ }
117
+ applyThemeFromLocalStorage() {
118
+ const savedTheme = localStorage.getItem("theme");
119
+ if (savedTheme) {
120
+ document.documentElement.setAttribute("data-theme", savedTheme);
121
+ this.updateToggleButton(savedTheme);
122
+ } else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
123
+ document.documentElement.setAttribute("data-theme", "dark");
124
+ this.updateToggleButton("dark");
125
+ } else {
126
+ document.documentElement.setAttribute("data-theme", "light");
127
+ this.updateToggleButton("light");
128
+ }
129
+ }
130
+ updateToggleButton(theme) {
131
+ const button = this.shadowRoot?.querySelector("#theme-toggle");
132
+ if (button) {
133
+ const iconSpan = button.querySelector(".icon");
134
+ if (iconSpan) {
135
+ iconSpan.innerHTML = theme === "dark" ? this.getMoonIcon() : this.getSunIcon();
136
+ }
137
+ }
138
+ }
139
+ getSunIcon() {
140
+ return `
141
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
142
+ <circle cx="12" cy="12" r="5"/>
143
+ <line x1="12" y1="1" x2="12" y2="3"/>
144
+ <line x1="12" y1="21" x2="12" y2="23"/>
145
+ <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/>
146
+ <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
147
+ <line x1="1" y1="12" x2="3" y2="12"/>
148
+ <line x1="21" y1="12" x2="23" y2="12"/>
149
+ <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/>
150
+ <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
151
+ </svg>
152
+ `;
153
+ }
154
+ getMoonIcon() {
155
+ return `
156
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
157
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
158
+ </svg>
159
+ `;
160
+ }
161
+ dispatchThemeChangeEvent(theme) {
162
+ const event = new CustomEvent("theme-changed", {
163
+ detail: { theme },
164
+ bubbles: true,
165
+ composed: true
166
+ });
167
+ this.dispatchEvent(event);
168
+ }
169
+ }
170
+ customElements.define("theme-toggle", ThemeToggle);
171
+ const createHtmlTemplate = ({
172
+ title,
173
+ description,
174
+ canonicalUrl,
175
+ content
176
+ }) => {
177
+ return `<!doctype html>
178
+ <html lang="en" data-theme="light">
179
+ <head>
180
+ <meta charset="UTF-8" />
181
+ <link rel="icon" type="image/svg+xml" href="/api/logo" />
182
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
183
+ <title>${title}</title>
184
+ <meta name="description" content="${description}" />
185
+ <meta property="og:title" content="${title}" />
186
+ <meta property="og:description" content="${description}" />
187
+ <meta property="og:url" content="${canonicalUrl}" />
188
+ <link rel="canonical" href="${canonicalUrl}" />
189
+ <link rel="stylesheet" href="/src/styles.css" />
190
+ <script type="module" src="/src/index.ts"><\/script>
191
+ </head>
192
+ <body>
193
+ <div id="app">
194
+ ${content}
195
+ </div>
196
+ </body>
197
+ </html>`;
198
+ };
199
+ const pipeline = new MarkdownPipeline({
200
+ imagePathPrefix: "images/",
201
+ styleOptions: {
202
+ classPrefix: "md-",
203
+ addHeadingIds: true
204
+ }
205
+ });
206
+ const renderMarkdown = (content) => {
207
+ if (!content) return "";
208
+ return pipeline.renderMarkdown(content);
209
+ };
210
+ const generatePageContent = (pathname, routes, footerLinks, data) => {
211
+ const logo = "/api/logo";
212
+ const siteTitle = data?.siteTitle || "My Personal Website";
213
+ const siteDescription = data?.siteDescription || "Welcome to my professional portfolio and blog.";
214
+ const copyright = data?.copyright || "2026 All Rights Reserved";
215
+ const baseUrl = data?.baseUrl || "";
216
+ const canonicalUrl = baseUrl ? new URL(pathname, baseUrl).toString() : pathname;
217
+ const navLinks = routes.map(
218
+ (route) => `<a href="${route.link}" class="nav-link" data-route="${route.link === "/" ? "home" : route.text.toLowerCase()}">${route.text}</a>`
219
+ ).join("");
220
+ const bannerTemplate = `
221
+ <my-banner header="${siteTitle}" logo="${logo}">
222
+ <theme-toggle slot="theme-switcher"></theme-toggle>
223
+ <nav slot="nav-links">
224
+ ${navLinks}
225
+ </nav>
226
+ </my-banner>`;
227
+ const footerTemplate = `
228
+ <my-footer
229
+ copyright="${copyright}"
230
+ footerlinks=\\'\${JSON.stringify(footerLinks)}\\''>
231
+ </my-footer>`;
232
+ const renderContentGists = (items = [], title, type) => {
233
+ const listHtml = items.length > 0 ? items.map((item) => `
234
+ <div class="gist-card">
235
+ <a href="${type}/${item.slug}" data-route="${type}-${item.slug}"><h4>${item.title}</h4></a>
236
+ <p>${item.summary || item.description || ""}</p>
237
+ <small>${new Date(item.date).toLocaleDateString()}</small>
238
+ </div>
239
+ `).join("") : `<p>No ${type} available yet.</p>`;
240
+ return `
241
+ <div class="recent-content-section ${title.includes("Stories") ? "mt-2" : ""}">
242
+ <h3 class="border-bottom pb-05">${title}</h3>
243
+ ${listHtml}
244
+ </div>
245
+ `;
246
+ };
247
+ if (pathname === "/" || pathname === "") {
248
+ const homeHtml = data?.content || `<h1>Welcome to ${siteTitle}</h1><p>Start by configuring your content in the admin portal.</p>`;
249
+ const mainContent = `
250
+ ${bannerTemplate}
251
+ <main class="container container-wide column-layout row-layout">
252
+ <div class="home-main-content main-column text-left">
253
+ ${homeHtml}
254
+ </div>
255
+ <aside class="home-side-content sidebar-column">
256
+ ${renderContentGists(data?.blogs, "Recent Blogs", "blogs")}
257
+ ${renderContentGists(data?.stories, "Recent Stories", "stories")}
258
+ </aside>
259
+ </main>
260
+ ${footerTemplate}`;
261
+ return {
262
+ title: `${siteTitle} - Home`,
263
+ description: siteDescription,
264
+ canonicalUrl,
265
+ content: mainContent
266
+ };
267
+ } else if (pathname === "/blogs" || pathname === "/stories" || pathname.startsWith("/blogs/") || pathname.startsWith("/stories/")) {
268
+ const isBlog = pathname.includes("blogs");
269
+ const type = isBlog ? "blogs" : "stories";
270
+ const items = isBlog ? data?.blogs : data?.stories;
271
+ const title = type.charAt(0).toUpperCase() + type.slice(1);
272
+ const currentSlug = data?.slug;
273
+ const mainContent = `
274
+ ${bannerTemplate}
275
+ <main class="container container-wide">
276
+ <div class="mb-2">
277
+ <input type="text" id="content-search" placeholder="Search ${type}..." class="search-input search-input-lg">
278
+ </div>
279
+ <div class="column-layout">
280
+ <aside class="sidebar-nav sidebar-column">
281
+ <div id="content-list">
282
+ ${items?.map((item) => {
283
+ const searchTerms = [
284
+ item.title,
285
+ ...item.tags || [],
286
+ item.summary || item.description || "",
287
+ item.slug
288
+ ].join(" ").toLowerCase();
289
+ return `
290
+ <div class="list-item sidebar-item ${item.slug === currentSlug ? "active" : ""}"
291
+ data-search="${searchTerms}">
292
+ <a href="/${type}/${item.slug}" data-route="${type}-${item.slug}" class="sidebar-item sidebar-item-link">
293
+ <h4>${item.title}</h4>
294
+ <small>${new Date(item.date).toLocaleDateString()}</small>
295
+ </a>
296
+ </div>
297
+ `;
298
+ }).join("") || `<p>No ${type} available yet.</p>`}
299
+ </div>
300
+ </aside>
301
+ <div class="wide-main-column text-left">
302
+ <div id="content-viewer">
303
+ ${currentSlug ? isBlog ? `<my-blog-viewer slug="${currentSlug}"></my-blog-viewer>` : `<my-story-viewer slug="${currentSlug}"></my-story-viewer>` : items && items.length > 0 ? `<p>Select a ${type.slice(0, -1)} to read.</p>` : ""}
304
+ </div>
305
+ </div>
306
+ </div>
307
+ </main>
308
+ ${footerTemplate}`;
309
+ return {
310
+ title: `${title} - ${siteTitle}`,
311
+ description: `Read the latest ${type} from ${siteTitle}.`,
312
+ canonicalUrl,
313
+ content: mainContent
314
+ };
315
+ } else if (pathname === "/about-me") {
316
+ const apiBaseUrl = data?.apiUrl || "";
317
+ const mainContent = `
318
+ ${bannerTemplate}
319
+ <main class="container container-narrow">
320
+ <my-aboutme base-url="${apiBaseUrl}"></my-aboutme>
321
+ </main>
322
+ ${footerTemplate}`;
323
+ return {
324
+ title: `About - ${siteTitle}`,
325
+ description: `Learn more about ${siteTitle}.`,
326
+ canonicalUrl,
327
+ content: mainContent
328
+ };
329
+ } else {
330
+ const mainContent = `
331
+ ${bannerTemplate}
332
+ <main class="container container-narrow text-center page-content">
333
+ <h1 class="page-title">Page Not Found</h1>
334
+ <p>The page you\\'re looking for doesn\\'t exist.</p>
335
+ <p><a href="/">Return to home</a></p>
336
+ </main>
337
+ ${footerTemplate}`;
338
+ return {
339
+ title: `404 Not Found - ${siteTitle}`,
340
+ description: "The page you requested could not be found.",
341
+ canonicalUrl,
342
+ content: mainContent
343
+ };
344
+ }
345
+ };
346
+ export {
347
+ SiteStore,
348
+ ThemeToggle,
349
+ createHtmlTemplate,
350
+ generatePageContent,
351
+ getConfig,
352
+ initializeConfig,
353
+ renderMarkdown
354
+ };
@@ -0,0 +1,5 @@
1
+ declare const _default: {
2
+ fetch(request: Request, env: any, ctx: any): Promise<Response>;
3
+ };
4
+ export default _default;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prerender/index.ts"],"names":[],"mappings":";mBAuDuB,OAAO,OAAO,GAAG,OAAO,GAAG;;AADlD,wBAmFE"}
@@ -0,0 +1,16 @@
1
+ export interface IRoute {
2
+ text: string;
3
+ link: string;
4
+ }
5
+ export interface IFooterLink {
6
+ text: string;
7
+ link: string;
8
+ }
9
+ export interface PageContent {
10
+ title: string;
11
+ description: string;
12
+ canonicalUrl: string;
13
+ content: string;
14
+ }
15
+ export declare const generatePageContent: (pathname: string, routes: IRoute[], footerLinks: IFooterLink[], env?: any) => Promise<PageContent>;
16
+ //# sourceMappingURL=pageContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageContent.d.ts","sourceRoot":"","sources":["../../src/prerender/pageContent.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAuFD,eAAO,MAAM,mBAAmB,GAC9B,UAAU,MAAM,EAChB,QAAQ,MAAM,EAAE,EAChB,aAAa,WAAW,EAAE,EAC1B,MAAM,GAAG,KACR,OAAO,CAAC,WAAW,CAkJrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function renderFromAst(ast: any): string;
2
+ export default renderFromAst;
3
+ //# sourceMappingURL=prerender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../../src/prerender/prerender.ts"],"names":[],"mappings":"AACA,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAqB9C;AAED,eAAe,aAAa,CAAA"}
@@ -0,0 +1,10 @@
1
+ export interface TemplateProps {
2
+ title: string;
3
+ description: string;
4
+ canonicalUrl: string;
5
+ content: string;
6
+ hydrationData?: string;
7
+ baseSiteUrl?: string;
8
+ }
9
+ export declare const createHtmlTemplate: ({ title, description, canonicalUrl, content, hydrationData, baseSiteUrl }: TemplateProps) => Promise<string>;
10
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/prerender/template.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAyBD,eAAO,MAAM,kBAAkB,GAAU,2EAOtC,aAAa,KAAG,OAAO,CAAC,MAAM,CAyBhC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export {}
2
+ import _default from './prerender/index'
3
+ export default _default
4
+ export {}