@leadertechie/personal-site-kit 0.1.0-alpha.17 → 0.1.0-alpha.19
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/api/content-utils.d.ts.map +1 -1
- package/dist/api/handlers/about-me.d.ts.map +1 -1
- package/dist/api/handlers/auth-handler.d.ts.map +1 -1
- package/dist/api/handlers/content-api.d.ts.map +1 -1
- package/dist/api/handlers/content.d.ts.map +1 -1
- package/dist/api/handlers/home.d.ts.map +1 -1
- package/dist/api/handlers/static-details.d.ts +1 -1
- package/dist/api/handlers/static-details.d.ts.map +1 -1
- package/dist/api/website-api.d.ts.map +1 -1
- package/dist/api.js +2 -2
- package/dist/chunks/{index-CGvOrVf8.js → index-C1krnvU3.js} +0 -2
- package/dist/chunks/{index-DAog9TQE.js → index-DrnbjP2Q.js} +2 -4
- package/dist/chunks/{template-DUdadCrH.js → template-DVy2k_na.js} +0 -4
- package/dist/chunks/{website-api-Cy2kZ0dC.js → website-api-BjNkkALB.js} +122 -151
- package/dist/index.js +3 -3
- package/dist/prerender/data-fetcher.d.ts.map +1 -1
- package/dist/prerender/page-content.d.ts.map +1 -1
- package/dist/prerender/page-generators/base.d.ts +0 -1
- package/dist/prerender/page-generators/base.d.ts.map +1 -1
- package/dist/prerender.js +9 -31
- package/dist/shared/core/site-store.d.ts.map +1 -1
- package/dist/shared/core/theme-toggle.d.ts.map +1 -1
- package/dist/shared/router.d.ts.map +1 -1
- package/dist/shared.js +1 -1
- package/dist/ui/about-me/index.d.ts.map +1 -1
- package/dist/ui/admin/index.d.ts.map +1 -1
- package/dist/ui/banner/index.d.ts.map +1 -1
- package/dist/ui/blog-viewer/index.d.ts.map +1 -1
- package/dist/ui/footer/index.d.ts.map +1 -1
- package/dist/ui/story-viewer/index.d.ts.map +1 -1
- package/dist/ui.js +1 -1
- package/package.json +12 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-utils.d.ts","sourceRoot":"","sources":["../../src/api/content-utils.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAS,SAAQ,eAAe;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAU,SAAQ,eAAe;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AASD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAoBtF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"content-utils.d.ts","sourceRoot":"","sources":["../../src/api/content-utils.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAS,SAAQ,eAAe;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAU,SAAQ,eAAe;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AASD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAoBtF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAMhG;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,GAAG,IAAI,CAK5D;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAqB1H;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAiB1H;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CA2BjG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"about-me.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/about-me.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"about-me.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/about-me.ts"],"names":[],"mappings":"AAmDA,wBAAgB,iBAAiB,SAEhC;AAED,wBAAsB,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4DhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-handler.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/auth-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-handler.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/auth-handler.ts"],"names":[],"mappings":"AAwBA,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgC/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/content-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/content-api.ts"],"names":[],"mappings":"AAWA,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmB9F;AAED,wBAAsB,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmBhG;AAED,wBAAsB,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkB/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/content.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/content.ts"],"names":[],"mappings":"AAqBA,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqElG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/home.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/home.ts"],"names":[],"mappings":"AAwCA,wBAAgB,iBAAiB,SAEhC;AAED,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwC7D"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function handleStaticDetails(env?: any, method?: string,
|
|
1
|
+
export declare function handleStaticDetails(env?: any, method?: string, _body?: any): Promise<Response>;
|
|
2
2
|
//# sourceMappingURL=static-details.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-details.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/static-details.ts"],"names":[],"mappings":"AAQA,wBAAsB,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"static-details.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/static-details.ts"],"names":[],"mappings":"AAQA,wBAAsB,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuCpG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"website-api.d.ts","sourceRoot":"","sources":["../../src/api/website-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"website-api.d.ts","sourceRoot":"","sources":["../../src/api/website-api.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE3E,qBAAa,UAAU;IACrB,OAAO,CAAC,cAAc,CAAiC;IAEhD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;IAIzD,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,UAAU;IAqBL,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;CAkGlE"}
|
package/dist/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { W as WebsiteAPI } from "./chunks/website-api-
|
|
2
|
-
import { A, B, M, R, c, a, g, b, d, h, e, r, s, v } from "./chunks/website-api-
|
|
1
|
+
import { W as WebsiteAPI } from "./chunks/website-api-BjNkkALB.js";
|
|
2
|
+
import { A, B, M, R, c, a, g, b, d, h, e, r, s, v } from "./chunks/website-api-BjNkkALB.js";
|
|
3
3
|
const defaultAPI = new WebsiteAPI();
|
|
4
4
|
export {
|
|
5
5
|
A as AUTH_KV,
|
|
@@ -2475,8 +2475,7 @@ class BlogViewer extends (_a$1 = LitElement, _slug_dec$1 = [property({ type: Str
|
|
|
2475
2475
|
}
|
|
2476
2476
|
renderMarkdown(content) {
|
|
2477
2477
|
if (!content) return "";
|
|
2478
|
-
|
|
2479
|
-
return pipeline$1.render(nodes);
|
|
2478
|
+
return pipeline$1.renderMarkdown(content);
|
|
2480
2479
|
}
|
|
2481
2480
|
}
|
|
2482
2481
|
_init$1 = __decoratorStart$1(_a$1);
|
|
@@ -2681,8 +2680,7 @@ class StoryViewer extends (_a = LitElement, _slug_dec = [property({ type: String
|
|
|
2681
2680
|
}
|
|
2682
2681
|
renderMarkdown(content) {
|
|
2683
2682
|
if (!content) return "";
|
|
2684
|
-
|
|
2685
|
-
return pipeline.render(nodes);
|
|
2683
|
+
return pipeline.renderMarkdown(content);
|
|
2686
2684
|
}
|
|
2687
2685
|
}
|
|
2688
2686
|
_init = __decoratorStart(_a);
|
|
@@ -383,10 +383,6 @@ class Router {
|
|
|
383
383
|
this.afterRender();
|
|
384
384
|
}
|
|
385
385
|
async renderAdminPage() {
|
|
386
|
-
generatePageContent("/admin", this.routes, this.footerLinks, {
|
|
387
|
-
siteTitle: this.siteTitle,
|
|
388
|
-
copyright: this.copyright
|
|
389
|
-
});
|
|
390
386
|
if (this.appElement) {
|
|
391
387
|
this.appElement.innerHTML = `
|
|
392
388
|
<my-banner header="${this.siteTitle}" logo="${this.logo}">
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ContentCacheV2,
|
|
1
|
+
import { R2ContentLoader, ContentCacheV2, parseFrontmatter as parseFrontmatter$1 } from "@leadertechie/r2tohtml";
|
|
2
2
|
function createJSONResponse(data, status = 200) {
|
|
3
3
|
return new Response(JSON.stringify(data), {
|
|
4
4
|
status,
|
|
@@ -9,14 +9,6 @@ function createErrorResponse(message, status = 500) {
|
|
|
9
9
|
return createJSONResponse({ error: message }, status);
|
|
10
10
|
}
|
|
11
11
|
let loader$1 = null;
|
|
12
|
-
new ContentCacheV2(
|
|
13
|
-
5 * 60 * 1e3,
|
|
14
|
-
// TTL: 5 minutes fresh
|
|
15
|
-
true,
|
|
16
|
-
// enabled
|
|
17
|
-
30 * 60 * 1e3
|
|
18
|
-
// SWR TTL: 30 minutes stale window
|
|
19
|
-
);
|
|
20
12
|
function getLoader$1(env) {
|
|
21
13
|
if (!env?.CONTENT_BUCKET) {
|
|
22
14
|
return null;
|
|
@@ -50,7 +42,7 @@ function getLoader$1(env) {
|
|
|
50
42
|
}
|
|
51
43
|
return loader$1;
|
|
52
44
|
}
|
|
53
|
-
function clearContentCache$
|
|
45
|
+
function clearContentCache$2() {
|
|
54
46
|
loader$1?.clearCache();
|
|
55
47
|
}
|
|
56
48
|
async function handleAboutMe(env) {
|
|
@@ -107,14 +99,6 @@ async function handleAboutMe(env) {
|
|
|
107
99
|
}
|
|
108
100
|
}
|
|
109
101
|
let loader = null;
|
|
110
|
-
new ContentCacheV2(
|
|
111
|
-
5 * 60 * 1e3,
|
|
112
|
-
// TTL: 5 minutes fresh
|
|
113
|
-
true,
|
|
114
|
-
// enabled
|
|
115
|
-
30 * 60 * 1e3
|
|
116
|
-
// SWR TTL: 30 minutes stale window
|
|
117
|
-
);
|
|
118
102
|
function getLoader(env) {
|
|
119
103
|
if (!loader && env?.CONTENT_BUCKET) {
|
|
120
104
|
loader = new R2ContentLoader(
|
|
@@ -145,7 +129,7 @@ function getLoader(env) {
|
|
|
145
129
|
}
|
|
146
130
|
return loader;
|
|
147
131
|
}
|
|
148
|
-
function clearContentCache() {
|
|
132
|
+
function clearContentCache$1() {
|
|
149
133
|
loader?.clearCache();
|
|
150
134
|
}
|
|
151
135
|
async function handleHome(env) {
|
|
@@ -157,8 +141,8 @@ async function handleHome(env) {
|
|
|
157
141
|
});
|
|
158
142
|
}
|
|
159
143
|
const r2 = getLoader(env);
|
|
160
|
-
|
|
161
|
-
|
|
144
|
+
const astResult = await r2.getWithAST("pages/home.md");
|
|
145
|
+
const renderedResult = await r2.getRendered("pages/home.md");
|
|
162
146
|
if (!astResult || !renderedResult) {
|
|
163
147
|
return new Response(JSON.stringify({
|
|
164
148
|
contentNodes: [],
|
|
@@ -268,7 +252,7 @@ async function clearRateLimit(env, ip) {
|
|
|
268
252
|
const kvKey = `rate:${ip}`;
|
|
269
253
|
await env.KV.delete(kvKey);
|
|
270
254
|
}
|
|
271
|
-
async function getAuthStore(env) {
|
|
255
|
+
async function getAuthStore$1(env) {
|
|
272
256
|
const store = await env.KV.get(AUTH_KV, "json");
|
|
273
257
|
return store;
|
|
274
258
|
}
|
|
@@ -282,7 +266,7 @@ async function setupAuth(env, username, password) {
|
|
|
282
266
|
}));
|
|
283
267
|
}
|
|
284
268
|
async function verifyCredentials(env, username, password) {
|
|
285
|
-
const store = await getAuthStore(env);
|
|
269
|
+
const store = await getAuthStore$1(env);
|
|
286
270
|
if (!store) {
|
|
287
271
|
return false;
|
|
288
272
|
}
|
|
@@ -295,6 +279,107 @@ async function verifyCredentials(env, username, password) {
|
|
|
295
279
|
function getClientIP(request) {
|
|
296
280
|
return request.headers.get("CF-Connecting-IP") || request.headers.get("X-Forwarded-For")?.split(",")[0]?.trim() || "unknown";
|
|
297
281
|
}
|
|
282
|
+
const contentCache = new ContentCacheV2(
|
|
283
|
+
5 * 60 * 1e3,
|
|
284
|
+
// TTL: 5 minutes fresh
|
|
285
|
+
true,
|
|
286
|
+
// enabled
|
|
287
|
+
30 * 60 * 1e3
|
|
288
|
+
// SWR TTL: 30 minutes stale window
|
|
289
|
+
);
|
|
290
|
+
function getCachedOrFetch(key, fetchFn) {
|
|
291
|
+
const cached = contentCache.get(key);
|
|
292
|
+
if (cached) {
|
|
293
|
+
if (!cached.stale) {
|
|
294
|
+
return Promise.resolve(cached.data);
|
|
295
|
+
}
|
|
296
|
+
fetchFn().then((data) => {
|
|
297
|
+
contentCache.set(key, data);
|
|
298
|
+
contentCache.refresh(key);
|
|
299
|
+
}).catch(() => {
|
|
300
|
+
});
|
|
301
|
+
return Promise.resolve(cached.data);
|
|
302
|
+
}
|
|
303
|
+
return fetchFn().then((data) => {
|
|
304
|
+
contentCache.set(key, data);
|
|
305
|
+
return data;
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
function clearContentCache(prefix) {
|
|
309
|
+
{
|
|
310
|
+
contentCache.clear();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function parseFrontmatter(content) {
|
|
314
|
+
const parsed = parseFrontmatter$1(content);
|
|
315
|
+
return {
|
|
316
|
+
metadata: parsed.metadata,
|
|
317
|
+
content: parsed.content.trim()
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
function checkContentBucket(env) {
|
|
321
|
+
if (!env?.CONTENT_BUCKET) {
|
|
322
|
+
return createErrorResponse("Content bucket not configured", 500);
|
|
323
|
+
}
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
async function fetchContentItem(bucket, type, slug) {
|
|
327
|
+
const mdObj = await bucket.get(`${type}/${slug}.md`);
|
|
328
|
+
const jsonObj = await bucket.get(`${type}/${slug}.json`);
|
|
329
|
+
if (!mdObj && !jsonObj) throw new Error(`${type.slice(0, -1)} not found`);
|
|
330
|
+
let metadata = {};
|
|
331
|
+
if (jsonObj) {
|
|
332
|
+
metadata = await jsonObj.json();
|
|
333
|
+
}
|
|
334
|
+
let content = "";
|
|
335
|
+
if (mdObj) {
|
|
336
|
+
const text = await mdObj.text();
|
|
337
|
+
const parsed = parseFrontmatter(text);
|
|
338
|
+
content = parsed.content;
|
|
339
|
+
metadata = { ...parsed.metadata, ...metadata };
|
|
340
|
+
}
|
|
341
|
+
return { ...metadata, slug, content };
|
|
342
|
+
}
|
|
343
|
+
async function fetchContentList(bucket, type, latest) {
|
|
344
|
+
const list = await bucket.list({ prefix: `${type}/` });
|
|
345
|
+
const items = [];
|
|
346
|
+
for (const item of list.objects) {
|
|
347
|
+
if (item.key.endsWith(".json")) {
|
|
348
|
+
const obj = await bucket.get(item.key);
|
|
349
|
+
if (obj) {
|
|
350
|
+
const metadata = await obj.json();
|
|
351
|
+
const slug = item.key.replace(`${type}/`, "").replace(".json", "");
|
|
352
|
+
items.push({ ...metadata, slug });
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const sorted = items.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
|
|
357
|
+
return latest ? sorted.slice(0, latest) : sorted;
|
|
358
|
+
}
|
|
359
|
+
async function searchContent(bucket, query) {
|
|
360
|
+
const q = query.toLowerCase();
|
|
361
|
+
const results = [];
|
|
362
|
+
const [blogsList, storiesList] = await Promise.all([
|
|
363
|
+
bucket.list({ prefix: "blogs/" }),
|
|
364
|
+
bucket.list({ prefix: "stories/" })
|
|
365
|
+
]);
|
|
366
|
+
for (const item of [...blogsList.objects, ...storiesList.objects]) {
|
|
367
|
+
if (item.key.endsWith(".md")) {
|
|
368
|
+
const obj = await bucket.get(item.key);
|
|
369
|
+
if (obj) {
|
|
370
|
+
const text = await obj.text();
|
|
371
|
+
const { metadata } = parseFrontmatter(text);
|
|
372
|
+
const matchTitle = metadata.title?.toLowerCase().includes(q);
|
|
373
|
+
const matchDesc = metadata.description?.toLowerCase().includes(q);
|
|
374
|
+
const matchTags = metadata.tags?.some((t) => t.toLowerCase().includes(q));
|
|
375
|
+
if (matchTitle || matchDesc || matchTags) {
|
|
376
|
+
results.push(metadata);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return results;
|
|
382
|
+
}
|
|
298
383
|
function getSessionToken(request) {
|
|
299
384
|
const cookieHeader = request.headers.get("Cookie");
|
|
300
385
|
if (!cookieHeader) return null;
|
|
@@ -324,7 +409,7 @@ async function handleContent(request, env, subpath) {
|
|
|
324
409
|
if (method === "GET" && subpath.startsWith("images/")) {
|
|
325
410
|
return handleGet(request, bucket, subpath);
|
|
326
411
|
}
|
|
327
|
-
const store = await getAuthStore(env);
|
|
412
|
+
const store = await getAuthStore$1(env);
|
|
328
413
|
if (!store) {
|
|
329
414
|
if (method === "GET") {
|
|
330
415
|
return handleGet(request, bucket, subpath);
|
|
@@ -399,8 +484,9 @@ async function handleWrite(request, bucket, subpath, env, method) {
|
|
|
399
484
|
options.httpMetadata = { contentType };
|
|
400
485
|
}
|
|
401
486
|
await bucket.put(subpath, request.body, options);
|
|
402
|
-
clearContentCache();
|
|
403
487
|
clearContentCache$1();
|
|
488
|
+
clearContentCache$2();
|
|
489
|
+
clearContentCache();
|
|
404
490
|
return createJSONResponse({ success: true, key: subpath });
|
|
405
491
|
} catch (e) {
|
|
406
492
|
return createErrorResponse("Failed to upload content: " + e.message, 500);
|
|
@@ -409,8 +495,9 @@ async function handleWrite(request, bucket, subpath, env, method) {
|
|
|
409
495
|
if (method === "DELETE" && subpath) {
|
|
410
496
|
try {
|
|
411
497
|
await bucket.delete(subpath);
|
|
412
|
-
clearContentCache();
|
|
413
498
|
clearContentCache$1();
|
|
499
|
+
clearContentCache$2();
|
|
500
|
+
clearContentCache();
|
|
414
501
|
return createJSONResponse({ success: true, key: subpath });
|
|
415
502
|
} catch (e) {
|
|
416
503
|
return createErrorResponse("Failed to delete content: " + e.message, 500);
|
|
@@ -431,7 +518,6 @@ function createSessionCookie(token, origin) {
|
|
|
431
518
|
return cookie;
|
|
432
519
|
}
|
|
433
520
|
async function handleAuth(request, env, subpath) {
|
|
434
|
-
request.method;
|
|
435
521
|
const clientIP = getClientIP(request);
|
|
436
522
|
const path = subpath.replace(/^\//, "").split("/")[0];
|
|
437
523
|
const origin = request.headers.get("Origin") || new URL(request.url).origin;
|
|
@@ -579,123 +665,6 @@ async function handleLogout(request, env) {
|
|
|
579
665
|
}
|
|
580
666
|
});
|
|
581
667
|
}
|
|
582
|
-
const contentCache = new ContentCacheV2(
|
|
583
|
-
5 * 60 * 1e3,
|
|
584
|
-
// TTL: 5 minutes fresh
|
|
585
|
-
true,
|
|
586
|
-
// enabled
|
|
587
|
-
30 * 60 * 1e3
|
|
588
|
-
// SWR TTL: 30 minutes stale window
|
|
589
|
-
);
|
|
590
|
-
function getCachedOrFetch(key, fetchFn) {
|
|
591
|
-
const cached = contentCache.get(key);
|
|
592
|
-
if (cached) {
|
|
593
|
-
if (!cached.stale) {
|
|
594
|
-
return Promise.resolve(cached.data);
|
|
595
|
-
}
|
|
596
|
-
fetchFn().then((data) => {
|
|
597
|
-
contentCache.set(key, data);
|
|
598
|
-
contentCache.refresh(key);
|
|
599
|
-
}).catch(() => {
|
|
600
|
-
});
|
|
601
|
-
return Promise.resolve(cached.data);
|
|
602
|
-
}
|
|
603
|
-
return fetchFn().then((data) => {
|
|
604
|
-
contentCache.set(key, data);
|
|
605
|
-
return data;
|
|
606
|
-
});
|
|
607
|
-
}
|
|
608
|
-
function parseFrontmatter(content) {
|
|
609
|
-
const lines = content.split("\n");
|
|
610
|
-
const metadata = {};
|
|
611
|
-
let contentStart = 0;
|
|
612
|
-
if (lines[0]?.trim() === "---") {
|
|
613
|
-
for (let i = 1; i < lines.length; i++) {
|
|
614
|
-
if (lines[i]?.trim() === "---") {
|
|
615
|
-
contentStart = i + 1;
|
|
616
|
-
break;
|
|
617
|
-
}
|
|
618
|
-
const colonIdx = lines[i].indexOf(":");
|
|
619
|
-
if (colonIdx > 0) {
|
|
620
|
-
const key = lines[i].slice(0, colonIdx).trim();
|
|
621
|
-
let value = lines[i].slice(colonIdx + 1).trim();
|
|
622
|
-
if (value.startsWith("[") && value.endsWith("]")) {
|
|
623
|
-
value = value.slice(1, -1);
|
|
624
|
-
metadata[key] = value.split(",").map((v) => v.trim());
|
|
625
|
-
} else {
|
|
626
|
-
metadata[key] = value;
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
return {
|
|
632
|
-
metadata,
|
|
633
|
-
content: lines.slice(contentStart).join("\n").trim()
|
|
634
|
-
};
|
|
635
|
-
}
|
|
636
|
-
function checkContentBucket(env) {
|
|
637
|
-
if (!env?.CONTENT_BUCKET) {
|
|
638
|
-
return createErrorResponse("Content bucket not configured", 500);
|
|
639
|
-
}
|
|
640
|
-
return null;
|
|
641
|
-
}
|
|
642
|
-
async function fetchContentItem(bucket, type, slug) {
|
|
643
|
-
const mdObj = await bucket.get(`${type}/${slug}.md`);
|
|
644
|
-
const jsonObj = await bucket.get(`${type}/${slug}.json`);
|
|
645
|
-
if (!mdObj && !jsonObj) throw new Error(`${type.slice(0, -1)} not found`);
|
|
646
|
-
let metadata = {};
|
|
647
|
-
if (jsonObj) {
|
|
648
|
-
metadata = await jsonObj.json();
|
|
649
|
-
}
|
|
650
|
-
let content = "";
|
|
651
|
-
if (mdObj) {
|
|
652
|
-
const text = await mdObj.text();
|
|
653
|
-
const parsed = parseFrontmatter(text);
|
|
654
|
-
content = parsed.content;
|
|
655
|
-
metadata = { ...parsed.metadata, ...metadata };
|
|
656
|
-
}
|
|
657
|
-
return { ...metadata, slug, content };
|
|
658
|
-
}
|
|
659
|
-
async function fetchContentList(bucket, type, latest) {
|
|
660
|
-
const list = await bucket.list({ prefix: `${type}/` });
|
|
661
|
-
const items = [];
|
|
662
|
-
for (const item of list.objects) {
|
|
663
|
-
if (item.key.endsWith(".json")) {
|
|
664
|
-
const obj = await bucket.get(item.key);
|
|
665
|
-
if (obj) {
|
|
666
|
-
const metadata = await obj.json();
|
|
667
|
-
const slug = item.key.replace(`${type}/`, "").replace(".json", "");
|
|
668
|
-
items.push({ ...metadata, slug });
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
const sorted = items.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
|
|
673
|
-
return latest ? sorted.slice(0, latest) : sorted;
|
|
674
|
-
}
|
|
675
|
-
async function searchContent(bucket, query) {
|
|
676
|
-
const q = query.toLowerCase();
|
|
677
|
-
const results = [];
|
|
678
|
-
const [blogsList, storiesList] = await Promise.all([
|
|
679
|
-
bucket.list({ prefix: "blogs/" }),
|
|
680
|
-
bucket.list({ prefix: "stories/" })
|
|
681
|
-
]);
|
|
682
|
-
for (const item of [...blogsList.objects, ...storiesList.objects]) {
|
|
683
|
-
if (item.key.endsWith(".md")) {
|
|
684
|
-
const obj = await bucket.get(item.key);
|
|
685
|
-
if (obj) {
|
|
686
|
-
const text = await obj.text();
|
|
687
|
-
const { metadata } = parseFrontmatter(text);
|
|
688
|
-
const matchTitle = metadata.title?.toLowerCase().includes(q);
|
|
689
|
-
const matchDesc = metadata.description?.toLowerCase().includes(q);
|
|
690
|
-
const matchTags = metadata.tags?.some((t) => t.toLowerCase().includes(q));
|
|
691
|
-
if (matchTitle || matchDesc || matchTags) {
|
|
692
|
-
results.push(metadata);
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
return results;
|
|
698
|
-
}
|
|
699
668
|
async function handleBlogs(env, slug, latest) {
|
|
700
669
|
const bucketCheck = checkContentBucket(env);
|
|
701
670
|
if (bucketCheck) return bucketCheck;
|
|
@@ -804,7 +773,7 @@ const DEFAULT_STATIC_DETAILS = {
|
|
|
804
773
|
github: "https://github.com/yourname",
|
|
805
774
|
email: "yourname@domain.com"
|
|
806
775
|
};
|
|
807
|
-
async function handleStaticDetails(env, method,
|
|
776
|
+
async function handleStaticDetails(env, method, _body) {
|
|
808
777
|
try {
|
|
809
778
|
if (!env?.CONTENT_BUCKET) {
|
|
810
779
|
return new Response(JSON.stringify(DEFAULT_STATIC_DETAILS), {
|
|
@@ -917,15 +886,16 @@ class WebsiteAPI {
|
|
|
917
886
|
return this.addCORSHeaders(await handleInfo());
|
|
918
887
|
case "home":
|
|
919
888
|
return this.addAdminCORSHeaders(await handleHome(env), origin);
|
|
920
|
-
case "cache-clear":
|
|
889
|
+
case "cache-clear": {
|
|
921
890
|
const cookieHeader = request.headers.get("Cookie");
|
|
922
891
|
const sessionToken = cookieHeader?.split(";").find((c) => c.trim().startsWith("session="))?.split("=")[1];
|
|
923
892
|
const session = sessionToken ? await env.KV.get(`session:${sessionToken}`, "json") : null;
|
|
924
893
|
if (!session || session.expiresAt < Date.now()) {
|
|
925
894
|
return this.addAdminCORSHeaders(createErrorResponse("Unauthorized", 401), origin);
|
|
926
895
|
}
|
|
927
|
-
clearContentCache$
|
|
896
|
+
clearContentCache$2();
|
|
928
897
|
return this.addAdminCORSHeaders(new Response(JSON.stringify({ success: true, message: "Cache cleared" }), { status: 200, headers: { "Content-Type": "application/json" } }), origin);
|
|
898
|
+
}
|
|
929
899
|
case "aboutme":
|
|
930
900
|
return this.addAdminCORSHeaders(await handleAboutMe(env), origin);
|
|
931
901
|
case "logo":
|
|
@@ -934,9 +904,10 @@ class WebsiteAPI {
|
|
|
934
904
|
return this.addAdminCORSHeaders(await handleStaticDetails(env), origin);
|
|
935
905
|
case "blogs":
|
|
936
906
|
return this.addAdminCORSHeaders(await handleBlogs(env), origin);
|
|
937
|
-
case "blogs/latest":
|
|
907
|
+
case "blogs/latest": {
|
|
938
908
|
const latestCount = url.searchParams.get("count");
|
|
939
909
|
return this.addAdminCORSHeaders(await handleBlogs(env, void 0, latestCount ? parseInt(latestCount) : 5), origin);
|
|
910
|
+
}
|
|
940
911
|
default:
|
|
941
912
|
if (route.startsWith("images/")) {
|
|
942
913
|
return this.addAdminCORSHeaders(await handleContent(request, env, route), origin);
|
|
@@ -950,8 +921,8 @@ class WebsiteAPI {
|
|
|
950
921
|
return this.addAdminCORSHeaders(await handleStories(env), origin);
|
|
951
922
|
}
|
|
952
923
|
if (route === "stories/latest") {
|
|
953
|
-
const
|
|
954
|
-
return this.addAdminCORSHeaders(await handleStories(env, void 0,
|
|
924
|
+
const latestCount = url.searchParams.get("count");
|
|
925
|
+
return this.addAdminCORSHeaders(await handleStories(env, void 0, latestCount ? parseInt(latestCount) : 5), origin);
|
|
955
926
|
}
|
|
956
927
|
const slug = route.replace("stories/", "");
|
|
957
928
|
return this.addAdminCORSHeaders(await handleStories(env, slug), origin);
|
|
@@ -975,7 +946,7 @@ export {
|
|
|
975
946
|
RATE_LIMIT_KV as R,
|
|
976
947
|
WebsiteAPI as W,
|
|
977
948
|
clearRateLimit as a,
|
|
978
|
-
getAuthStore as b,
|
|
949
|
+
getAuthStore$1 as b,
|
|
979
950
|
checkRateLimit as c,
|
|
980
951
|
getClientIP as d,
|
|
981
952
|
hashPassword as e,
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { A, B, M, R, W, c, a, g, b, d, h, e, r, s, v } from "./chunks/website-api-
|
|
1
|
+
import { A, B, M, R, W, c, a, g, b, d, h, e, r, s, v } from "./chunks/website-api-BjNkkALB.js";
|
|
2
2
|
import { WebsitePrerender } from "./prerender.js";
|
|
3
|
-
import { A as A2, a as a2, b as b2, c as c2, d as d2, e as e2, f, g as g2, h as h2, i, B as B2, F, M as M2, j, S, k } from "./chunks/index-
|
|
3
|
+
import { A as A2, a as a2, b as b2, c as c2, d as d2, e as e2, f, g as g2, h as h2, i, B as B2, F, M as M2, j, S, k } from "./chunks/index-DrnbjP2Q.js";
|
|
4
4
|
import { S as S2, g as g3, i as i2, r as r2 } from "./chunks/site-store-CGV9c2DI.js";
|
|
5
|
-
import { R as R2, T, W as W2, b as b3, c as c3, g as g4, r as r3 } from "./chunks/template-
|
|
5
|
+
import { R as R2, T, W as W2, b as b3, c as c3, g as g4, r as r3 } from "./chunks/template-DVy2k_na.js";
|
|
6
6
|
export {
|
|
7
7
|
A as AUTH_KV,
|
|
8
8
|
A2 as AdminAboutMeSection,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-fetcher.d.ts","sourceRoot":"","sources":["../../src/prerender/data-fetcher.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"data-fetcher.d.ts","sourceRoot":"","sources":["../../src/prerender/data-fetcher.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAiCD,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAQpE;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5D;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAOzD;AAED,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgB/F;AAED,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgBhG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-content.d.ts","sourceRoot":"","sources":["../../src/prerender/page-content.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;
|
|
1
|
+
{"version":3,"file":"page-content.d.ts","sourceRoot":"","sources":["../../src/prerender/page-content.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;AAgGD,eAAO,MAAM,mBAAmB,GAC9B,UAAU,MAAM,EAChB,QAAQ,MAAM,EAAE,EAChB,aAAa,WAAW,EAAE,EAC1B,MAAM,GAAG,KACR,OAAO,CAAC,WAAW,CAkJrB,CAAC"}
|
|
@@ -19,7 +19,6 @@ export interface BasePageData {
|
|
|
19
19
|
export declare class BasePageGenerator {
|
|
20
20
|
protected generateBanner(routes: IRoute[], siteTitle: string, logo: string): string;
|
|
21
21
|
protected generateFooter(footerLinks: IFooterLink[], copyright: string): string;
|
|
22
|
-
protected generateMeta(title: string, description: string, canonicalUrl: string): void;
|
|
23
22
|
protected wrapContent(banner: string, mainContent: string, footer: string): string;
|
|
24
23
|
generatePage(pathname: string, routes: IRoute[], footerLinks: IFooterLink[], staticDetails: StaticDetails, apiUrl: string, baseUrl: string, mainContent: string, title: string, description: string): PageContent;
|
|
25
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/prerender/page-generators/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IAC5B,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAcnF,SAAS,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAQ/E,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/prerender/page-generators/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IAC5B,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAcnF,SAAS,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAQ/E,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAI3E,YAAY,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,WAAW,EAAE,EAC1B,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,WAAW;CAcf"}
|
package/dist/prerender.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { R2ContentLoader } from "@leadertechie/r2tohtml";
|
|
2
2
|
let cachedAssets = null;
|
|
3
3
|
let isDiscovering = false;
|
|
4
4
|
async function getAssetPaths(baseSiteUrl) {
|
|
@@ -103,14 +103,6 @@ const createHtmlTemplate = async ({
|
|
|
103
103
|
</html>`;
|
|
104
104
|
};
|
|
105
105
|
let loader = null;
|
|
106
|
-
new ContentCacheV2(
|
|
107
|
-
5 * 60 * 1e3,
|
|
108
|
-
// TTL: 5 minutes fresh
|
|
109
|
-
true,
|
|
110
|
-
// enabled
|
|
111
|
-
30 * 60 * 1e3
|
|
112
|
-
// SWR TTL: 30 minutes stale window
|
|
113
|
-
);
|
|
114
106
|
function getLoader(env) {
|
|
115
107
|
if (!loader) {
|
|
116
108
|
if (!env?.CONTENT_BUCKET) return null;
|
|
@@ -153,16 +145,6 @@ async function fetchProfile(env) {
|
|
|
153
145
|
return null;
|
|
154
146
|
}
|
|
155
147
|
}
|
|
156
|
-
async function fetchAboutMe(env) {
|
|
157
|
-
try {
|
|
158
|
-
const r2 = getLoader(env);
|
|
159
|
-
if (!r2) return "";
|
|
160
|
-
const result = await r2.getRendered("about-me.md");
|
|
161
|
-
return result?.content || "";
|
|
162
|
-
} catch {
|
|
163
|
-
return "";
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
148
|
async function fetchHome(env) {
|
|
167
149
|
try {
|
|
168
150
|
const r2 = getLoader(env);
|
|
@@ -229,25 +211,21 @@ const generatePageContent = async (pathname, routes, footerLinks, env) => {
|
|
|
229
211
|
} catch (e) {
|
|
230
212
|
}
|
|
231
213
|
let profile = null;
|
|
232
|
-
let aboutMeContent = "";
|
|
233
214
|
let homeContent = "";
|
|
234
215
|
let latestBlogs = [];
|
|
235
216
|
let latestStories = [];
|
|
236
217
|
if (env?.CONTENT_BUCKET) {
|
|
237
|
-
[profile,
|
|
218
|
+
[profile, homeContent, latestBlogs, latestStories] = await Promise.all([
|
|
238
219
|
fetchProfile(env),
|
|
239
|
-
fetchAboutMe(env),
|
|
240
220
|
fetchHome(env),
|
|
241
221
|
fetchLatestBlogSummaries(env, 3),
|
|
242
222
|
fetchLatestStorySummaries(env, 3)
|
|
243
223
|
]);
|
|
244
224
|
}
|
|
245
225
|
const name = profile?.name || "User";
|
|
246
|
-
profile?.title || "Professional";
|
|
247
|
-
new URL(pathname, baseUrl).toString();
|
|
248
226
|
const strategies = {
|
|
249
227
|
home: async () => {
|
|
250
|
-
const { HomePageGenerator } = await import("./chunks/index-
|
|
228
|
+
const { HomePageGenerator } = await import("./chunks/index-C1krnvU3.js");
|
|
251
229
|
const generator = new HomePageGenerator();
|
|
252
230
|
return generator.generate({
|
|
253
231
|
routes,
|
|
@@ -263,7 +241,7 @@ const generatePageContent = async (pathname, routes, footerLinks, env) => {
|
|
|
263
241
|
});
|
|
264
242
|
},
|
|
265
243
|
about: async () => {
|
|
266
|
-
const { AboutPageGenerator } = await import("./chunks/index-
|
|
244
|
+
const { AboutPageGenerator } = await import("./chunks/index-C1krnvU3.js");
|
|
267
245
|
const generator = new AboutPageGenerator();
|
|
268
246
|
return generator.generate({
|
|
269
247
|
routes,
|
|
@@ -276,7 +254,7 @@ const generatePageContent = async (pathname, routes, footerLinks, env) => {
|
|
|
276
254
|
});
|
|
277
255
|
},
|
|
278
256
|
blogsList: async () => {
|
|
279
|
-
const { BlogsListPageGenerator } = await import("./chunks/index-
|
|
257
|
+
const { BlogsListPageGenerator } = await import("./chunks/index-C1krnvU3.js");
|
|
280
258
|
const generator = new BlogsListPageGenerator();
|
|
281
259
|
return generator.generate({
|
|
282
260
|
routes,
|
|
@@ -290,7 +268,7 @@ const generatePageContent = async (pathname, routes, footerLinks, env) => {
|
|
|
290
268
|
});
|
|
291
269
|
},
|
|
292
270
|
storiesList: async () => {
|
|
293
|
-
const { StoriesListPageGenerator } = await import("./chunks/index-
|
|
271
|
+
const { StoriesListPageGenerator } = await import("./chunks/index-C1krnvU3.js");
|
|
294
272
|
const generator = new StoriesListPageGenerator();
|
|
295
273
|
return generator.generate({
|
|
296
274
|
routes,
|
|
@@ -304,7 +282,7 @@ const generatePageContent = async (pathname, routes, footerLinks, env) => {
|
|
|
304
282
|
});
|
|
305
283
|
},
|
|
306
284
|
blogDetail: async (slug) => {
|
|
307
|
-
const { BlogDetailPageGenerator } = await import("./chunks/index-
|
|
285
|
+
const { BlogDetailPageGenerator } = await import("./chunks/index-C1krnvU3.js");
|
|
308
286
|
const generator = new BlogDetailPageGenerator();
|
|
309
287
|
return generator.generate({
|
|
310
288
|
routes,
|
|
@@ -317,7 +295,7 @@ const generatePageContent = async (pathname, routes, footerLinks, env) => {
|
|
|
317
295
|
});
|
|
318
296
|
},
|
|
319
297
|
storyDetail: async (slug) => {
|
|
320
|
-
const { StoryDetailPageGenerator } = await import("./chunks/index-
|
|
298
|
+
const { StoryDetailPageGenerator } = await import("./chunks/index-C1krnvU3.js");
|
|
321
299
|
const generator = new StoryDetailPageGenerator();
|
|
322
300
|
return generator.generate({
|
|
323
301
|
routes,
|
|
@@ -330,7 +308,7 @@ const generatePageContent = async (pathname, routes, footerLinks, env) => {
|
|
|
330
308
|
});
|
|
331
309
|
},
|
|
332
310
|
notFound: async () => {
|
|
333
|
-
const { NotFoundPageGenerator } = await import("./chunks/index-
|
|
311
|
+
const { NotFoundPageGenerator } = await import("./chunks/index-C1krnvU3.js");
|
|
334
312
|
const generator = new NotFoundPageGenerator();
|
|
335
313
|
return generator.generate({
|
|
336
314
|
routes,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-store.d.ts","sourceRoot":"","sources":["../../../src/shared/core/site-store.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"site-store.d.ts","sourceRoot":"","sources":["../../../src/shared/core/site-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA8C,MAAM,WAAW,CAAC;AAEtF,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAY;IACnC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,SAAS,CAAmD;IAEpE,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,SAAS;IAOzB,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAMtD,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI;IAMnD,OAAO,CAAC,MAAM;IAMR,OAAO;IAQb,SAAS,IAAI,aAAa;CAG3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../../src/shared/core/theme-toggle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../../src/shared/core/theme-toggle.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,WAAW;;IAQ1C,iBAAiB;IAIjB,oBAAoB;IAIpB,MAAM;IAiCN,0BAA0B;IAc1B,WAAW,aAOT;IAEF,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAUhC,UAAU,IAAI,MAAM;IAgBpB,WAAW,IAAI,MAAM;IAQrB,wBAAwB,CAAC,KAAK,EAAE,MAAM;CAQvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/shared/router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,qBAAa,MAAM;IAML,OAAO,CAAC,EAAE;IALtB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,UAAU,CAA4B;gBAE1B,EAAE,EAAE,SAAS;IAejC,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,WAAW,GAatB;IAEM,IAAI,CAAC,YAAY,GAAE,MAAc;IAWxC,OAAO,CAAC,mBAAmB;IAmCd,QAAQ,CAAC,IAAI,EAAE,MAAM;IA6BlC,OAAO,CAAC,WAAW;IAgCnB;;;OAGG;IACH,OAAO,CAAC,WAAW;YAIL,cAAc;IAmC5B,OAAO,CAAC,iBAAiB;YASX,qBAAqB;YAkBrB,uBAAuB;YAoBvB,eAAe;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/shared/router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,qBAAa,MAAM;IAML,OAAO,CAAC,EAAE;IALtB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,UAAU,CAA4B;gBAE1B,EAAE,EAAE,SAAS;IAejC,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,WAAW,GAatB;IAEM,IAAI,CAAC,YAAY,GAAE,MAAc;IAWxC,OAAO,CAAC,mBAAmB;IAmCd,QAAQ,CAAC,IAAI,EAAE,MAAM;IA6BlC,OAAO,CAAC,WAAW;IAgCnB;;;OAGG;IACH,OAAO,CAAC,WAAW;YAIL,cAAc;IAmC5B,OAAO,CAAC,iBAAiB;YASX,qBAAqB;YAkBrB,uBAAuB;YAoBvB,eAAe;CAiB9B"}
|
package/dist/shared.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { S, g, i, r } from "./chunks/site-store-CGV9c2DI.js";
|
|
2
|
-
import { R, T, W, b, c, g as g2, r as r2 } from "./chunks/template-
|
|
2
|
+
import { R, T, W, b, c, g as g2, r as r2 } from "./chunks/template-DVy2k_na.js";
|
|
3
3
|
export {
|
|
4
4
|
R as Router,
|
|
5
5
|
S as SiteStore,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/about-me/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/about-me/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAGvC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,qBACa,SAAU,SAAQ,UAAU;IACvC,MAAM,CAAC,MAAM,0BAAiB;IAG9B,QAAQ,CAAC,OAAO,SAAM;IAGtB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAQ;IAGxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAM;IAGlC,QAAQ,CAAC,OAAO,UAAQ;IAEjB,OAAO,sBAAgB;;IAM9B,OAAO,KAAK,UAAU,GAErB;IAEK,iBAAiB;IAcvB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;YAY7B,WAAW;IAuBzB,OAAO,CAAC,kBAAkB;IAS1B,MAAM;CA6BP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/admin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/admin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAKvC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EACnB,CAAC;AAEF,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAAe;IAG5B,QAAQ,CAAC,eAAe,UAAS;IAGjC,QAAQ,CAAC,OAAO,UAAS;IAGzB,QAAQ,CAAC,SAAS,UAAQ;IAG1B,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,CAAM;IAGzC,QAAQ,CAAC,aAAa,SAAM;IAG5B,QAAQ,CAAC,aAAa,SAAa;IAGnC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAM;IAG3C,QAAQ,CAAC,UAAU,SAAM;IAEzB,OAAO,CAAC,UAAU,CAAkB;;IAQpC,OAAO,CAAC,gBAAgB;IAIlB,iBAAiB;IAMjB,eAAe;IAcf,YAAY;IASZ,WAAW,CAAC,CAAC,EAAE,WAAW;IAkB1B,WAAW,CAAC,CAAC,EAAE,WAAW;IAkC1B,YAAY;IAQZ,YAAY;IAQZ,kBAAkB;IAMlB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;IAkBpC,gBAAgB;IAUhB,YAAY,CAAC,GAAG,EAAE,MAAM;IAS9B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,mBAAmB;IAY3B,eAAe;IAUf,WAAW;IAUX,MAAM;CAyDP;AAED,eAAO,MAAM,WAAW,OAAO,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/banner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/banner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAKvC,qBACa,QAAS,SAAQ,UAAU;IACtC,MAAM,CAAC,MAAM,0BAAgB;IAE7B,MAAM,CAAC,UAAU;;;;;;;MAGf;IAEM,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;;IAQrB,MAAM;CAcP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/blog-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/blog-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AA0BvC,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBACa,UAAW,SAAQ,UAAU;IACxC,MAAM,CAAC,MAAM,0BAAoB;IAGjC,QAAQ,CAAC,IAAI,SAAM;IAGnB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAG1C,QAAQ,CAAC,OAAO,UAAQ;IAGxB,QAAQ,CAAC,KAAK,SAAM;IAEpB,OAAO,KAAK,UAAU,GAMrB;IAED,iBAAiB;IAOjB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAM/C,QAAQ;IA4BR,MAAM;IA+BN,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAIxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/footer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/footer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAInE,qBACa,eAAgB,SAAQ,UAAU;IAC7C,MAAM,CAAC,MAAM,0BAAgB;IAG7B,QAAQ,CAAC,SAAS,SAAM;IAGxB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,CAAM;IAEzC,MAAM;CA2BP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/story-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/story-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AA0BvC,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAAqB;IAGlC,QAAQ,CAAC,IAAI,SAAM;IAGnB,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAQ;IAG5C,QAAQ,CAAC,OAAO,UAAQ;IAGxB,QAAQ,CAAC,KAAK,SAAM;IAEpB,OAAO,KAAK,UAAU,GAKrB;IAEK,iBAAiB;IAOvB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAMrC,SAAS;IAuBf,MAAM;IA+BN,OAAO,CAAC,cAAc;CAIvB"}
|
package/dist/ui.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leadertechie/personal-site-kit",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.19",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A high-performance personal website engine for Cloudflare Workers and R2",
|
|
6
6
|
"repository": {
|
|
@@ -40,18 +40,25 @@
|
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "vite build && npm run postbuild",
|
|
42
42
|
"postbuild": "cp -r src/styles dist/",
|
|
43
|
-
"test": "vitest run"
|
|
43
|
+
"test": "vitest run",
|
|
44
|
+
"lint": "eslint \"src/**/*.ts\"",
|
|
45
|
+
"lint:fix": "eslint \"src/**/*.ts\" --fix"
|
|
44
46
|
},
|
|
45
47
|
"dependencies": {
|
|
46
|
-
"@leadertechie/md2html": "^0.1.0-alpha.
|
|
47
|
-
"@leadertechie/md2interact": "^0.1.0-alpha.
|
|
48
|
-
"@leadertechie/r2tohtml": "^0.1.0-alpha.
|
|
48
|
+
"@leadertechie/md2html": "^0.1.0-alpha.20",
|
|
49
|
+
"@leadertechie/md2interact": "^0.1.0-alpha.4",
|
|
50
|
+
"@leadertechie/r2tohtml": "^0.1.0-alpha.17",
|
|
49
51
|
"lit": "^3.2.1"
|
|
50
52
|
},
|
|
51
53
|
"devDependencies": {
|
|
54
|
+
"@eslint/js": "^9.39.4",
|
|
52
55
|
"@types/node": "^20.11.0",
|
|
56
|
+
"@typescript-eslint/eslint-plugin": "^8.20.0",
|
|
57
|
+
"@typescript-eslint/parser": "^8.20.0",
|
|
58
|
+
"eslint": "^9.18.0",
|
|
53
59
|
"jsdom": "^29.0.1",
|
|
54
60
|
"typescript": "^5.7.3",
|
|
61
|
+
"typescript-eslint": "^8.20.0",
|
|
55
62
|
"vite": "^7.3.0",
|
|
56
63
|
"vite-plugin-dts": "^4.5.4",
|
|
57
64
|
"vitest": "^4.0.16"
|