next-blogpanel 1.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.
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/dist/admin/index.cjs +3062 -0
- package/dist/admin/index.cjs.map +1 -0
- package/dist/admin/index.d.cts +51 -0
- package/dist/admin/index.d.ts +51 -0
- package/dist/admin/index.js +3029 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/api/categories.cjs +82 -0
- package/dist/api/categories.cjs.map +1 -0
- package/dist/api/categories.d.cts +27 -0
- package/dist/api/categories.d.ts +27 -0
- package/dist/api/categories.js +77 -0
- package/dist/api/categories.js.map +1 -0
- package/dist/api/media-file.cjs +46 -0
- package/dist/api/media-file.cjs.map +1 -0
- package/dist/api/media-file.d.cts +7 -0
- package/dist/api/media-file.d.ts +7 -0
- package/dist/api/media-file.js +44 -0
- package/dist/api/media-file.js.map +1 -0
- package/dist/api/media.cjs +180 -0
- package/dist/api/media.cjs.map +1 -0
- package/dist/api/media.d.cts +22 -0
- package/dist/api/media.d.ts +22 -0
- package/dist/api/media.js +176 -0
- package/dist/api/media.js.map +1 -0
- package/dist/api/posts.cjs +103 -0
- package/dist/api/posts.cjs.map +1 -0
- package/dist/api/posts.d.cts +27 -0
- package/dist/api/posts.d.ts +27 -0
- package/dist/api/posts.js +98 -0
- package/dist/api/posts.js.map +1 -0
- package/dist/api/rss.cjs +25 -0
- package/dist/api/rss.cjs.map +1 -0
- package/dist/api/rss.d.cts +5 -0
- package/dist/api/rss.d.ts +5 -0
- package/dist/api/rss.js +23 -0
- package/dist/api/rss.js.map +1 -0
- package/dist/api/settings.cjs +40 -0
- package/dist/api/settings.cjs.map +1 -0
- package/dist/api/settings.d.cts +17 -0
- package/dist/api/settings.d.ts +17 -0
- package/dist/api/settings.js +37 -0
- package/dist/api/settings.js.map +1 -0
- package/dist/api/sitemap.cjs +25 -0
- package/dist/api/sitemap.cjs.map +1 -0
- package/dist/api/sitemap.d.cts +5 -0
- package/dist/api/sitemap.d.ts +5 -0
- package/dist/api/sitemap.js +23 -0
- package/dist/api/sitemap.js.map +1 -0
- package/dist/api/tokens.cjs +56 -0
- package/dist/api/tokens.cjs.map +1 -0
- package/dist/api/tokens.d.cts +22 -0
- package/dist/api/tokens.d.ts +22 -0
- package/dist/api/tokens.js +52 -0
- package/dist/api/tokens.js.map +1 -0
- package/dist/chunk-2M46MMWN.cjs +76 -0
- package/dist/chunk-2M46MMWN.cjs.map +1 -0
- package/dist/chunk-4GK22Q3R.cjs +229 -0
- package/dist/chunk-4GK22Q3R.cjs.map +1 -0
- package/dist/chunk-6PZ772NQ.js +595 -0
- package/dist/chunk-6PZ772NQ.js.map +1 -0
- package/dist/chunk-BZXPRGLN.cjs +351 -0
- package/dist/chunk-BZXPRGLN.cjs.map +1 -0
- package/dist/chunk-DAX5C6SC.cjs +86 -0
- package/dist/chunk-DAX5C6SC.cjs.map +1 -0
- package/dist/chunk-DWNMHQ4I.cjs +57 -0
- package/dist/chunk-DWNMHQ4I.cjs.map +1 -0
- package/dist/chunk-FPGVR2BX.cjs +121 -0
- package/dist/chunk-FPGVR2BX.cjs.map +1 -0
- package/dist/chunk-JBP3G4QJ.js +50 -0
- package/dist/chunk-JBP3G4QJ.js.map +1 -0
- package/dist/chunk-JDP4DIHI.js +215 -0
- package/dist/chunk-JDP4DIHI.js.map +1 -0
- package/dist/chunk-LIZOVA4W.js +118 -0
- package/dist/chunk-LIZOVA4W.js.map +1 -0
- package/dist/chunk-QLBTOCT3.js +118 -0
- package/dist/chunk-QLBTOCT3.js.map +1 -0
- package/dist/chunk-UI2KDZ5H.js +344 -0
- package/dist/chunk-UI2KDZ5H.js.map +1 -0
- package/dist/chunk-V7QPRX4A.cjs +125 -0
- package/dist/chunk-V7QPRX4A.cjs.map +1 -0
- package/dist/chunk-VEJFN65Y.js +82 -0
- package/dist/chunk-VEJFN65Y.js.map +1 -0
- package/dist/chunk-WYZFAI6O.js +74 -0
- package/dist/chunk-WYZFAI6O.js.map +1 -0
- package/dist/chunk-XLYTATRQ.cjs +637 -0
- package/dist/chunk-XLYTATRQ.cjs.map +1 -0
- package/dist/cli/index.cjs +2036 -0
- package/dist/components/index.cjs +647 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +187 -0
- package/dist/components/index.d.ts +187 -0
- package/dist/components/index.js +633 -0
- package/dist/components/index.js.map +1 -0
- package/dist/db-M3KXLBUP.js +3 -0
- package/dist/db-M3KXLBUP.js.map +1 -0
- package/dist/db-TDCZNY3Q.cjs +112 -0
- package/dist/db-TDCZNY3Q.cjs.map +1 -0
- package/dist/editor/index.cjs +1126 -0
- package/dist/editor/index.cjs.map +1 -0
- package/dist/editor/index.d.cts +137 -0
- package/dist/editor/index.d.ts +137 -0
- package/dist/editor/index.js +1093 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/index-BcNka7gK.d.cts +475 -0
- package/dist/index-DPRgaNEE.d.ts +475 -0
- package/dist/index.cjs +433 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +27 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +209 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/index.cjs +193 -0
- package/dist/lib/index.cjs.map +1 -0
- package/dist/lib/index.d.cts +4 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.js +8 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/styles/admin.css +667 -0
- package/dist/styles/blog.css +851 -0
- package/dist/styles/editor.css +452 -0
- package/dist/styles/globals.css +270 -0
- package/dist/styles/prose.css +299 -0
- package/dist/types-CgrBuig-.d.cts +778 -0
- package/dist/types-CgrBuig-.d.ts +778 -0
- package/package.json +140 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/settings.ts"],"names":["requireAuth","getSettings","jsonSuccess","jsonError","BlogSettingsSchema","updateSettings"],"mappings":";;;;;;;AAIA,eAAsB,IAAI,OAAA,EAAkB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,MAAMA,6BAAA,CAAY,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,QAAA,GAAW,MAAMC,6BAAA,EAAY;AACnC,IAAA,OAAOC,8BAAY,QAAQ,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAOC,2BAAA,CAAU,gBAAA,EAAkB,0BAAA,EAA4B,GAAG,CAAA;AAAA,EACpE;AACF;AAEA,eAAsB,IAAI,OAAA,EAAkB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,MAAMH,6BAAA,CAAY,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAK;AAChC,IAAA,MAAM,MAAA,GAASI,oCAAA,CAAmB,OAAA,EAAQ,CAAE,UAAU,IAAI,CAAA;AAE1D,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACjF,MAAA,OAAOD,2BAAA,CAAU,kBAAA,EAAoB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAME,gCAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AACjD,IAAA,OAAOH,8BAAY,QAAQ,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAOC,2BAAA,CAAU,gBAAA,EAAkB,2BAAA,EAA6B,GAAG,CAAA;AAAA,EACrE;AACF","file":"settings.cjs","sourcesContent":["import { getSettings, updateSettings } from '../lib/db';\nimport { BlogSettingsSchema } from '../lib/types';\nimport { jsonSuccess, jsonError, requireAuth } from './middleware';\n\nexport async function GET(request: Request) {\n try {\n const authError = await requireAuth(request);\n if (authError) return authError;\n\n const settings = await getSettings();\n return jsonSuccess(settings);\n } catch (error) {\n console.error('[blogpanel] GET /settings error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to fetch settings', 500);\n }\n}\n\nexport async function PUT(request: Request) {\n try {\n const authError = await requireAuth(request);\n if (authError) return authError;\n\n const body = await request.json();\n const parsed = BlogSettingsSchema.partial().safeParse(body);\n\n if (!parsed.success) {\n const errors = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`);\n return jsonError('VALIDATION_ERROR', errors.join('; '));\n }\n\n const settings = await updateSettings(parsed.data);\n return jsonSuccess(settings);\n } catch (error) {\n console.error('[blogpanel] PUT /settings error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to update settings', 500);\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as next_server from 'next/server';
|
|
2
|
+
import { A as ApiErrorResponse } from '../types-CgrBuig-.cjs';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import 'mongodb';
|
|
5
|
+
|
|
6
|
+
declare function GET(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
7
|
+
success: boolean;
|
|
8
|
+
data: unknown;
|
|
9
|
+
meta: Record<string, unknown> | undefined;
|
|
10
|
+
}>>;
|
|
11
|
+
declare function PUT(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
data: unknown;
|
|
14
|
+
meta: Record<string, unknown> | undefined;
|
|
15
|
+
}>>;
|
|
16
|
+
|
|
17
|
+
export { GET, PUT };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as next_server from 'next/server';
|
|
2
|
+
import { A as ApiErrorResponse } from '../types-CgrBuig-.js';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import 'mongodb';
|
|
5
|
+
|
|
6
|
+
declare function GET(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
7
|
+
success: boolean;
|
|
8
|
+
data: unknown;
|
|
9
|
+
meta: Record<string, unknown> | undefined;
|
|
10
|
+
}>>;
|
|
11
|
+
declare function PUT(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
data: unknown;
|
|
14
|
+
meta: Record<string, unknown> | undefined;
|
|
15
|
+
}>>;
|
|
16
|
+
|
|
17
|
+
export { GET, PUT };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BlogSettingsSchema } from '../chunk-QLBTOCT3.js';
|
|
2
|
+
import { requireAuth, jsonSuccess, jsonError } from '../chunk-JBP3G4QJ.js';
|
|
3
|
+
import { getSettings, updateSettings } from '../chunk-6PZ772NQ.js';
|
|
4
|
+
|
|
5
|
+
// src/api/settings.ts
|
|
6
|
+
async function GET(request) {
|
|
7
|
+
try {
|
|
8
|
+
const authError = await requireAuth(request);
|
|
9
|
+
if (authError) return authError;
|
|
10
|
+
const settings = await getSettings();
|
|
11
|
+
return jsonSuccess(settings);
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.error("[blogpanel] GET /settings error:", error);
|
|
14
|
+
return jsonError("INTERNAL_ERROR", "Failed to fetch settings", 500);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function PUT(request) {
|
|
18
|
+
try {
|
|
19
|
+
const authError = await requireAuth(request);
|
|
20
|
+
if (authError) return authError;
|
|
21
|
+
const body = await request.json();
|
|
22
|
+
const parsed = BlogSettingsSchema.partial().safeParse(body);
|
|
23
|
+
if (!parsed.success) {
|
|
24
|
+
const errors = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`);
|
|
25
|
+
return jsonError("VALIDATION_ERROR", errors.join("; "));
|
|
26
|
+
}
|
|
27
|
+
const settings = await updateSettings(parsed.data);
|
|
28
|
+
return jsonSuccess(settings);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error("[blogpanel] PUT /settings error:", error);
|
|
31
|
+
return jsonError("INTERNAL_ERROR", "Failed to update settings", 500);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { GET, PUT };
|
|
36
|
+
//# sourceMappingURL=settings.js.map
|
|
37
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/settings.ts"],"names":[],"mappings":";;;;;AAIA,eAAsB,IAAI,OAAA,EAAkB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,OAAO,YAAY,QAAQ,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAO,SAAA,CAAU,gBAAA,EAAkB,0BAAA,EAA4B,GAAG,CAAA;AAAA,EACpE;AACF;AAEA,eAAsB,IAAI,OAAA,EAAkB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAK;AAChC,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,OAAA,EAAQ,CAAE,UAAU,IAAI,CAAA;AAE1D,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACjF,MAAA,OAAO,SAAA,CAAU,kBAAA,EAAoB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AACjD,IAAA,OAAO,YAAY,QAAQ,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,IAAA,OAAO,SAAA,CAAU,gBAAA,EAAkB,2BAAA,EAA6B,GAAG,CAAA;AAAA,EACrE;AACF","file":"settings.js","sourcesContent":["import { getSettings, updateSettings } from '../lib/db';\nimport { BlogSettingsSchema } from '../lib/types';\nimport { jsonSuccess, jsonError, requireAuth } from './middleware';\n\nexport async function GET(request: Request) {\n try {\n const authError = await requireAuth(request);\n if (authError) return authError;\n\n const settings = await getSettings();\n return jsonSuccess(settings);\n } catch (error) {\n console.error('[blogpanel] GET /settings error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to fetch settings', 500);\n }\n}\n\nexport async function PUT(request: Request) {\n try {\n const authError = await requireAuth(request);\n if (authError) return authError;\n\n const body = await request.json();\n const parsed = BlogSettingsSchema.partial().safeParse(body);\n\n if (!parsed.success) {\n const errors = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`);\n return jsonError('VALIDATION_ERROR', errors.join('; '));\n }\n\n const settings = await updateSettings(parsed.data);\n return jsonSuccess(settings);\n } catch (error) {\n console.error('[blogpanel] PUT /settings error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to update settings', 500);\n }\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk2M46MMWN_cjs = require('../chunk-2M46MMWN.cjs');
|
|
4
|
+
require('../chunk-XLYTATRQ.cjs');
|
|
5
|
+
var server = require('next/server');
|
|
6
|
+
|
|
7
|
+
async function GET() {
|
|
8
|
+
try {
|
|
9
|
+
const xml = await chunk2M46MMWN_cjs.generateSitemap();
|
|
10
|
+
return new server.NextResponse(xml, {
|
|
11
|
+
status: 200,
|
|
12
|
+
headers: {
|
|
13
|
+
"Content-Type": "application/xml",
|
|
14
|
+
"Cache-Control": "public, max-age=3600, s-maxage=3600"
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.error("[blogpanel] Sitemap generation error:", error);
|
|
19
|
+
return new server.NextResponse("Sitemap generation failed", { status: 500 });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
exports.GET = GET;
|
|
24
|
+
//# sourceMappingURL=sitemap.cjs.map
|
|
25
|
+
//# sourceMappingURL=sitemap.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/sitemap.ts"],"names":["generateSitemap","NextResponse"],"mappings":";;;;;;AAGA,eAAsB,GAAA,GAAM;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMA,iCAAA,EAAgB;AAClC,IAAA,OAAO,IAAIC,oBAAa,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,iBAAA;AAAA,QAChB,eAAA,EAAiB;AAAA;AACnB,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAC5D,IAAA,OAAO,IAAIA,mBAAA,CAAa,2BAAA,EAA6B,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EACtE;AACF","file":"sitemap.cjs","sourcesContent":["import { NextResponse } from 'next/server';\nimport { generateSitemap } from '../lib/sitemap';\n\nexport async function GET() {\n try {\n const xml = await generateSitemap();\n return new NextResponse(xml, {\n status: 200,\n headers: {\n 'Content-Type': 'application/xml',\n 'Cache-Control': 'public, max-age=3600, s-maxage=3600',\n },\n });\n } catch (error) {\n console.error('[blogpanel] Sitemap generation error:', error);\n return new NextResponse('Sitemap generation failed', { status: 500 });\n }\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { generateSitemap } from '../chunk-WYZFAI6O.js';
|
|
2
|
+
import '../chunk-6PZ772NQ.js';
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
|
|
5
|
+
async function GET() {
|
|
6
|
+
try {
|
|
7
|
+
const xml = await generateSitemap();
|
|
8
|
+
return new NextResponse(xml, {
|
|
9
|
+
status: 200,
|
|
10
|
+
headers: {
|
|
11
|
+
"Content-Type": "application/xml",
|
|
12
|
+
"Cache-Control": "public, max-age=3600, s-maxage=3600"
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
} catch (error) {
|
|
16
|
+
console.error("[blogpanel] Sitemap generation error:", error);
|
|
17
|
+
return new NextResponse("Sitemap generation failed", { status: 500 });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { GET };
|
|
22
|
+
//# sourceMappingURL=sitemap.js.map
|
|
23
|
+
//# sourceMappingURL=sitemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/sitemap.ts"],"names":[],"mappings":";;;;AAGA,eAAsB,GAAA,GAAM;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,eAAA,EAAgB;AAClC,IAAA,OAAO,IAAI,aAAa,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,iBAAA;AAAA,QAChB,eAAA,EAAiB;AAAA;AACnB,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAC5D,IAAA,OAAO,IAAI,YAAA,CAAa,2BAAA,EAA6B,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EACtE;AACF","file":"sitemap.js","sourcesContent":["import { NextResponse } from 'next/server';\nimport { generateSitemap } from '../lib/sitemap';\n\nexport async function GET() {\n try {\n const xml = await generateSitemap();\n return new NextResponse(xml, {\n status: 200,\n headers: {\n 'Content-Type': 'application/xml',\n 'Cache-Control': 'public, max-age=3600, s-maxage=3600',\n },\n });\n } catch (error) {\n console.error('[blogpanel] Sitemap generation error:', error);\n return new NextResponse('Sitemap generation failed', { status: 500 });\n }\n}\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkV7QPRX4A_cjs = require('../chunk-V7QPRX4A.cjs');
|
|
4
|
+
var chunkDWNMHQ4I_cjs = require('../chunk-DWNMHQ4I.cjs');
|
|
5
|
+
var chunkXLYTATRQ_cjs = require('../chunk-XLYTATRQ.cjs');
|
|
6
|
+
|
|
7
|
+
// src/api/tokens.ts
|
|
8
|
+
async function GET(request) {
|
|
9
|
+
try {
|
|
10
|
+
const authError = chunkDWNMHQ4I_cjs.requireMasterAuth(request);
|
|
11
|
+
if (authError) return authError;
|
|
12
|
+
const tokens = await chunkXLYTATRQ_cjs.listApiTokens();
|
|
13
|
+
return chunkDWNMHQ4I_cjs.jsonSuccess(tokens);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.error("[blogpanel] GET /tokens error:", error);
|
|
16
|
+
return chunkDWNMHQ4I_cjs.jsonError("INTERNAL_ERROR", "Failed to fetch tokens", 500);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async function POST(request) {
|
|
20
|
+
try {
|
|
21
|
+
const authError = chunkDWNMHQ4I_cjs.requireMasterAuth(request);
|
|
22
|
+
if (authError) return authError;
|
|
23
|
+
const body = await request.json();
|
|
24
|
+
const parsed = chunkV7QPRX4A_cjs.CreateApiTokenSchema.safeParse(body);
|
|
25
|
+
if (!parsed.success) {
|
|
26
|
+
const errors = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`);
|
|
27
|
+
return chunkDWNMHQ4I_cjs.jsonError("VALIDATION_ERROR", errors.join("; "));
|
|
28
|
+
}
|
|
29
|
+
const { token, plainToken } = await chunkXLYTATRQ_cjs.createApiToken(parsed.data.name);
|
|
30
|
+
return chunkDWNMHQ4I_cjs.jsonSuccess({ ...token, plainToken }, void 0, 201);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error("[blogpanel] POST /tokens error:", error);
|
|
33
|
+
return chunkDWNMHQ4I_cjs.jsonError("INTERNAL_ERROR", "Failed to create token", 500);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function DELETE(request) {
|
|
37
|
+
try {
|
|
38
|
+
const authError = chunkDWNMHQ4I_cjs.requireMasterAuth(request);
|
|
39
|
+
if (authError) return authError;
|
|
40
|
+
const params = chunkDWNMHQ4I_cjs.getSearchParams(request);
|
|
41
|
+
const id = params.id;
|
|
42
|
+
if (!id) return chunkDWNMHQ4I_cjs.jsonError("MISSING_ID", "Token ID is required");
|
|
43
|
+
const deleted = await chunkXLYTATRQ_cjs.deleteApiToken(id);
|
|
44
|
+
if (!deleted) return chunkDWNMHQ4I_cjs.jsonError("NOT_FOUND", "Token not found", 404);
|
|
45
|
+
return chunkDWNMHQ4I_cjs.jsonSuccess({ deleted: true });
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error("[blogpanel] DELETE /tokens error:", error);
|
|
48
|
+
return chunkDWNMHQ4I_cjs.jsonError("INTERNAL_ERROR", "Failed to delete token", 500);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
exports.DELETE = DELETE;
|
|
53
|
+
exports.GET = GET;
|
|
54
|
+
exports.POST = POST;
|
|
55
|
+
//# sourceMappingURL=tokens.cjs.map
|
|
56
|
+
//# sourceMappingURL=tokens.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/tokens.ts"],"names":["requireMasterAuth","listApiTokens","jsonSuccess","jsonError","CreateApiTokenSchema","createApiToken","getSearchParams","deleteApiToken"],"mappings":";;;;;;;AAIA,eAAsB,IAAI,OAAA,EAAkB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAYA,oCAAkB,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,MAAA,GAAS,MAAMC,+BAAA,EAAc;AACnC,IAAA,OAAOC,8BAAY,MAAM,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAOC,2BAAA,CAAU,gBAAA,EAAkB,wBAAA,EAA0B,GAAG,CAAA;AAAA,EAClE;AACF;AAEA,eAAsB,KAAK,OAAA,EAAkB;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAYH,oCAAkB,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAK;AAChC,IAAA,MAAM,MAAA,GAASI,sCAAA,CAAqB,SAAA,CAAU,IAAI,CAAA;AAElD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACjF,MAAA,OAAOD,2BAAA,CAAU,kBAAA,EAAoB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,EAAE,OAAO,UAAA,EAAW,GAAI,MAAME,gCAAA,CAAe,MAAA,CAAO,KAAK,IAAI,CAAA;AACnE,IAAA,OAAOH,8BAAY,EAAE,GAAG,OAAO,UAAA,EAAW,EAAG,QAAW,GAAG,CAAA;AAAA,EAC7D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAOC,2BAAA,CAAU,gBAAA,EAAkB,wBAAA,EAA0B,GAAG,CAAA;AAAA,EAClE;AACF;AAEA,eAAsB,OAAO,OAAA,EAAkB;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAYH,oCAAkB,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,MAAA,GAASM,kCAAgB,OAAO,CAAA;AACtC,IAAA,MAAM,KAAK,MAAA,CAAO,EAAA;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI,OAAOH,2BAAA,CAAU,cAAc,sBAAsB,CAAA;AAE9D,IAAA,MAAM,OAAA,GAAU,MAAMI,gCAAA,CAAe,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS,OAAOJ,2BAAA,CAAU,WAAA,EAAa,mBAAmB,GAAG,CAAA;AAElE,IAAA,OAAOD,6BAAA,CAAY,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,IAAA,OAAOC,2BAAA,CAAU,gBAAA,EAAkB,wBAAA,EAA0B,GAAG,CAAA;AAAA,EAClE;AACF","file":"tokens.cjs","sourcesContent":["import { createApiToken, listApiTokens, deleteApiToken } from '../lib/db';\nimport { CreateApiTokenSchema } from '../lib/types';\nimport { jsonSuccess, jsonError, requireMasterAuth, getSearchParams } from './middleware';\n\nexport async function GET(request: Request) {\n try {\n const authError = requireMasterAuth(request);\n if (authError) return authError;\n\n const tokens = await listApiTokens();\n return jsonSuccess(tokens);\n } catch (error) {\n console.error('[blogpanel] GET /tokens error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to fetch tokens', 500);\n }\n}\n\nexport async function POST(request: Request) {\n try {\n const authError = requireMasterAuth(request);\n if (authError) return authError;\n\n const body = await request.json();\n const parsed = CreateApiTokenSchema.safeParse(body);\n\n if (!parsed.success) {\n const errors = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`);\n return jsonError('VALIDATION_ERROR', errors.join('; '));\n }\n\n const { token, plainToken } = await createApiToken(parsed.data.name);\n return jsonSuccess({ ...token, plainToken }, undefined, 201);\n } catch (error) {\n console.error('[blogpanel] POST /tokens error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to create token', 500);\n }\n}\n\nexport async function DELETE(request: Request) {\n try {\n const authError = requireMasterAuth(request);\n if (authError) return authError;\n\n const params = getSearchParams(request);\n const id = params.id;\n if (!id) return jsonError('MISSING_ID', 'Token ID is required');\n\n const deleted = await deleteApiToken(id);\n if (!deleted) return jsonError('NOT_FOUND', 'Token not found', 404);\n\n return jsonSuccess({ deleted: true });\n } catch (error) {\n console.error('[blogpanel] DELETE /tokens error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to delete token', 500);\n }\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as next_server from 'next/server';
|
|
2
|
+
import { A as ApiErrorResponse } from '../types-CgrBuig-.cjs';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import 'mongodb';
|
|
5
|
+
|
|
6
|
+
declare function GET(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
7
|
+
success: boolean;
|
|
8
|
+
data: unknown;
|
|
9
|
+
meta: Record<string, unknown> | undefined;
|
|
10
|
+
}>>;
|
|
11
|
+
declare function POST(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
data: unknown;
|
|
14
|
+
meta: Record<string, unknown> | undefined;
|
|
15
|
+
}>>;
|
|
16
|
+
declare function DELETE(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
17
|
+
success: boolean;
|
|
18
|
+
data: unknown;
|
|
19
|
+
meta: Record<string, unknown> | undefined;
|
|
20
|
+
}>>;
|
|
21
|
+
|
|
22
|
+
export { DELETE, GET, POST };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as next_server from 'next/server';
|
|
2
|
+
import { A as ApiErrorResponse } from '../types-CgrBuig-.js';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import 'mongodb';
|
|
5
|
+
|
|
6
|
+
declare function GET(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
7
|
+
success: boolean;
|
|
8
|
+
data: unknown;
|
|
9
|
+
meta: Record<string, unknown> | undefined;
|
|
10
|
+
}>>;
|
|
11
|
+
declare function POST(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
data: unknown;
|
|
14
|
+
meta: Record<string, unknown> | undefined;
|
|
15
|
+
}>>;
|
|
16
|
+
declare function DELETE(request: Request): Promise<next_server.NextResponse<ApiErrorResponse> | next_server.NextResponse<{
|
|
17
|
+
success: boolean;
|
|
18
|
+
data: unknown;
|
|
19
|
+
meta: Record<string, unknown> | undefined;
|
|
20
|
+
}>>;
|
|
21
|
+
|
|
22
|
+
export { DELETE, GET, POST };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { CreateApiTokenSchema } from '../chunk-QLBTOCT3.js';
|
|
2
|
+
import { requireMasterAuth, jsonSuccess, jsonError, getSearchParams } from '../chunk-JBP3G4QJ.js';
|
|
3
|
+
import { listApiTokens, createApiToken, deleteApiToken } from '../chunk-6PZ772NQ.js';
|
|
4
|
+
|
|
5
|
+
// src/api/tokens.ts
|
|
6
|
+
async function GET(request) {
|
|
7
|
+
try {
|
|
8
|
+
const authError = requireMasterAuth(request);
|
|
9
|
+
if (authError) return authError;
|
|
10
|
+
const tokens = await listApiTokens();
|
|
11
|
+
return jsonSuccess(tokens);
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.error("[blogpanel] GET /tokens error:", error);
|
|
14
|
+
return jsonError("INTERNAL_ERROR", "Failed to fetch tokens", 500);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function POST(request) {
|
|
18
|
+
try {
|
|
19
|
+
const authError = requireMasterAuth(request);
|
|
20
|
+
if (authError) return authError;
|
|
21
|
+
const body = await request.json();
|
|
22
|
+
const parsed = CreateApiTokenSchema.safeParse(body);
|
|
23
|
+
if (!parsed.success) {
|
|
24
|
+
const errors = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`);
|
|
25
|
+
return jsonError("VALIDATION_ERROR", errors.join("; "));
|
|
26
|
+
}
|
|
27
|
+
const { token, plainToken } = await createApiToken(parsed.data.name);
|
|
28
|
+
return jsonSuccess({ ...token, plainToken }, void 0, 201);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error("[blogpanel] POST /tokens error:", error);
|
|
31
|
+
return jsonError("INTERNAL_ERROR", "Failed to create token", 500);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function DELETE(request) {
|
|
35
|
+
try {
|
|
36
|
+
const authError = requireMasterAuth(request);
|
|
37
|
+
if (authError) return authError;
|
|
38
|
+
const params = getSearchParams(request);
|
|
39
|
+
const id = params.id;
|
|
40
|
+
if (!id) return jsonError("MISSING_ID", "Token ID is required");
|
|
41
|
+
const deleted = await deleteApiToken(id);
|
|
42
|
+
if (!deleted) return jsonError("NOT_FOUND", "Token not found", 404);
|
|
43
|
+
return jsonSuccess({ deleted: true });
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error("[blogpanel] DELETE /tokens error:", error);
|
|
46
|
+
return jsonError("INTERNAL_ERROR", "Failed to delete token", 500);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { DELETE, GET, POST };
|
|
51
|
+
//# sourceMappingURL=tokens.js.map
|
|
52
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/tokens.ts"],"names":[],"mappings":";;;;;AAIA,eAAsB,IAAI,OAAA,EAAkB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,kBAAkB,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,EAAc;AACnC,IAAA,OAAO,YAAY,MAAM,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAO,SAAA,CAAU,gBAAA,EAAkB,wBAAA,EAA0B,GAAG,CAAA;AAAA,EAClE;AACF;AAEA,eAAsB,KAAK,OAAA,EAAkB;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,kBAAkB,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAK;AAChC,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,SAAA,CAAU,IAAI,CAAA;AAElD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACjF,MAAA,OAAO,SAAA,CAAU,kBAAA,EAAoB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,EAAE,OAAO,UAAA,EAAW,GAAI,MAAM,cAAA,CAAe,MAAA,CAAO,KAAK,IAAI,CAAA;AACnE,IAAA,OAAO,YAAY,EAAE,GAAG,OAAO,UAAA,EAAW,EAAG,QAAW,GAAG,CAAA;AAAA,EAC7D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,SAAA,CAAU,gBAAA,EAAkB,wBAAA,EAA0B,GAAG,CAAA;AAAA,EAClE;AACF;AAEA,eAAsB,OAAO,OAAA,EAAkB;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,kBAAkB,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,MAAA,GAAS,gBAAgB,OAAO,CAAA;AACtC,IAAA,MAAM,KAAK,MAAA,CAAO,EAAA;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,SAAA,CAAU,cAAc,sBAAsB,CAAA;AAE9D,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,SAAA,CAAU,WAAA,EAAa,mBAAmB,GAAG,CAAA;AAElE,IAAA,OAAO,WAAA,CAAY,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,IAAA,OAAO,SAAA,CAAU,gBAAA,EAAkB,wBAAA,EAA0B,GAAG,CAAA;AAAA,EAClE;AACF","file":"tokens.js","sourcesContent":["import { createApiToken, listApiTokens, deleteApiToken } from '../lib/db';\nimport { CreateApiTokenSchema } from '../lib/types';\nimport { jsonSuccess, jsonError, requireMasterAuth, getSearchParams } from './middleware';\n\nexport async function GET(request: Request) {\n try {\n const authError = requireMasterAuth(request);\n if (authError) return authError;\n\n const tokens = await listApiTokens();\n return jsonSuccess(tokens);\n } catch (error) {\n console.error('[blogpanel] GET /tokens error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to fetch tokens', 500);\n }\n}\n\nexport async function POST(request: Request) {\n try {\n const authError = requireMasterAuth(request);\n if (authError) return authError;\n\n const body = await request.json();\n const parsed = CreateApiTokenSchema.safeParse(body);\n\n if (!parsed.success) {\n const errors = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`);\n return jsonError('VALIDATION_ERROR', errors.join('; '));\n }\n\n const { token, plainToken } = await createApiToken(parsed.data.name);\n return jsonSuccess({ ...token, plainToken }, undefined, 201);\n } catch (error) {\n console.error('[blogpanel] POST /tokens error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to create token', 500);\n }\n}\n\nexport async function DELETE(request: Request) {\n try {\n const authError = requireMasterAuth(request);\n if (authError) return authError;\n\n const params = getSearchParams(request);\n const id = params.id;\n if (!id) return jsonError('MISSING_ID', 'Token ID is required');\n\n const deleted = await deleteApiToken(id);\n if (!deleted) return jsonError('NOT_FOUND', 'Token not found', 404);\n\n return jsonSuccess({ deleted: true });\n } catch (error) {\n console.error('[blogpanel] DELETE /tokens error:', error);\n return jsonError('INTERNAL_ERROR', 'Failed to delete token', 500);\n }\n}\n"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkXLYTATRQ_cjs = require('./chunk-XLYTATRQ.cjs');
|
|
4
|
+
|
|
5
|
+
// src/lib/sitemap.ts
|
|
6
|
+
async function generateSitemap() {
|
|
7
|
+
const env = chunkXLYTATRQ_cjs.getEnvConfig();
|
|
8
|
+
const config = chunkXLYTATRQ_cjs.getConfig();
|
|
9
|
+
if (!env.BLOGPANEL_SITE_URL) {
|
|
10
|
+
console.warn(
|
|
11
|
+
"[blogpanel] BLOGPANEL_SITE_URL is not set \u2014 sitemap.xml <loc> entries will be relative URLs, which violates the sitemap protocol. Set BLOGPANEL_SITE_URL to your site's real domain before deploying."
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
const posts = await chunkXLYTATRQ_cjs.getCollection("nbk_posts");
|
|
15
|
+
const categories = await chunkXLYTATRQ_cjs.getCollection("nbk_categories");
|
|
16
|
+
const entries = [];
|
|
17
|
+
entries.push({
|
|
18
|
+
loc: `${env.BLOGPANEL_SITE_URL}${config.basePath}`,
|
|
19
|
+
changefreq: "daily",
|
|
20
|
+
priority: "0.9"
|
|
21
|
+
});
|
|
22
|
+
const publishedPosts = await posts.find({ status: "published" }).sort({ publishedAt: -1 }).project({ slug: 1, updatedAt: 1, publishedAt: 1 }).toArray();
|
|
23
|
+
for (const post of publishedPosts) {
|
|
24
|
+
const lastmod = post.updatedAt || post.publishedAt;
|
|
25
|
+
const daysSincePublish = lastmod ? Math.floor((Date.now() - new Date(lastmod).getTime()) / (1e3 * 60 * 60 * 24)) : 0;
|
|
26
|
+
let changefreq = "monthly";
|
|
27
|
+
if (daysSincePublish < 7) changefreq = "daily";
|
|
28
|
+
else if (daysSincePublish < 30) changefreq = "weekly";
|
|
29
|
+
entries.push({
|
|
30
|
+
loc: `${env.BLOGPANEL_SITE_URL}${config.basePath}/${post.slug}`,
|
|
31
|
+
lastmod: lastmod ? new Date(lastmod).toISOString().split("T")[0] : void 0,
|
|
32
|
+
changefreq,
|
|
33
|
+
priority: "0.8"
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const allCategories = await categories.find({}).sort({ order: 1 }).project({ slug: 1 }).toArray();
|
|
37
|
+
for (const cat of allCategories) {
|
|
38
|
+
entries.push({
|
|
39
|
+
loc: `${env.BLOGPANEL_SITE_URL}${config.basePath}/category/${cat.slug}`,
|
|
40
|
+
changefreq: "weekly",
|
|
41
|
+
priority: "0.6"
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const totalPosts = publishedPosts.length;
|
|
45
|
+
const postsPerPage = 10;
|
|
46
|
+
const totalPages = Math.ceil(totalPosts / postsPerPage);
|
|
47
|
+
for (let page = 2; page <= totalPages; page++) {
|
|
48
|
+
entries.push({
|
|
49
|
+
loc: `${env.BLOGPANEL_SITE_URL}${config.basePath}?page=${page}`,
|
|
50
|
+
changefreq: "weekly",
|
|
51
|
+
priority: "0.5"
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return buildXML(entries);
|
|
55
|
+
}
|
|
56
|
+
function buildXML(entries) {
|
|
57
|
+
const urls = entries.map(
|
|
58
|
+
(entry) => ` <url>
|
|
59
|
+
<loc>${escapeXml(entry.loc)}</loc>${entry.lastmod ? `
|
|
60
|
+
<lastmod>${entry.lastmod}</lastmod>` : ""}${entry.changefreq ? `
|
|
61
|
+
<changefreq>${entry.changefreq}</changefreq>` : ""}${entry.priority ? `
|
|
62
|
+
<priority>${entry.priority}</priority>` : ""}
|
|
63
|
+
</url>`
|
|
64
|
+
).join("\n");
|
|
65
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
66
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
67
|
+
${urls}
|
|
68
|
+
</urlset>`;
|
|
69
|
+
}
|
|
70
|
+
function escapeXml(str) {
|
|
71
|
+
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exports.generateSitemap = generateSitemap;
|
|
75
|
+
//# sourceMappingURL=chunk-2M46MMWN.cjs.map
|
|
76
|
+
//# sourceMappingURL=chunk-2M46MMWN.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/sitemap.ts"],"names":["getEnvConfig","getConfig","getCollection"],"mappings":"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","file":"chunk-2M46MMWN.cjs","sourcesContent":["import { getCollection } from './db';\nimport { getEnvConfig, getConfig } from './config';\n\ninterface SitemapEntry {\n loc: string;\n lastmod?: string;\n changefreq?: string;\n priority?: string;\n}\n\nexport async function generateSitemap(): Promise<string> {\n const env = getEnvConfig();\n const config = getConfig();\n\n // Sitemap protocol requires absolute URLs in <loc>. Without\n // BLOGPANEL_SITE_URL every entry below silently becomes a relative path\n // instead — a spec violation search engines will flag, not a rendering\n // error, so it's easy to ship unnoticed. Warn loudly rather than fail\n // silently; this stays a warning (not a throw) because the site itself\n // still works fine without it — only the sitemap's external validity\n // suffers.\n if (!env.BLOGPANEL_SITE_URL) {\n console.warn(\n '[blogpanel] BLOGPANEL_SITE_URL is not set — sitemap.xml <loc> entries will be relative URLs, which violates the sitemap protocol. Set BLOGPANEL_SITE_URL to your site\\'s real domain before deploying.'\n );\n }\n\n const posts = await getCollection('nbk_posts');\n const categories = await getCollection('nbk_categories');\n\n const entries: SitemapEntry[] = [];\n\n // Blog listing page\n entries.push({\n loc: `${env.BLOGPANEL_SITE_URL}${config.basePath}`,\n changefreq: 'daily',\n priority: '0.9',\n });\n\n // Published posts\n const publishedPosts = await posts\n .find({ status: 'published' })\n .sort({ publishedAt: -1 })\n .project({ slug: 1, updatedAt: 1, publishedAt: 1 })\n .toArray();\n\n for (const post of publishedPosts) {\n const lastmod = post.updatedAt || post.publishedAt;\n const daysSincePublish = lastmod\n ? Math.floor((Date.now() - new Date(lastmod).getTime()) / (1000 * 60 * 60 * 24))\n : 0;\n\n let changefreq = 'monthly';\n if (daysSincePublish < 7) changefreq = 'daily';\n else if (daysSincePublish < 30) changefreq = 'weekly';\n\n entries.push({\n loc: `${env.BLOGPANEL_SITE_URL}${config.basePath}/${post.slug}`,\n lastmod: lastmod ? new Date(lastmod).toISOString().split('T')[0] : undefined,\n changefreq,\n priority: '0.8',\n });\n }\n\n // Category pages\n const allCategories = await categories\n .find({})\n .sort({ order: 1 })\n .project({ slug: 1 })\n .toArray();\n\n for (const cat of allCategories) {\n entries.push({\n loc: `${env.BLOGPANEL_SITE_URL}${config.basePath}/category/${cat.slug}`,\n changefreq: 'weekly',\n priority: '0.6',\n });\n }\n\n // Paginated listing pages\n const totalPosts = publishedPosts.length;\n const postsPerPage = 10;\n const totalPages = Math.ceil(totalPosts / postsPerPage);\n for (let page = 2; page <= totalPages; page++) {\n entries.push({\n loc: `${env.BLOGPANEL_SITE_URL}${config.basePath}?page=${page}`,\n changefreq: 'weekly',\n priority: '0.5',\n });\n }\n\n return buildXML(entries);\n}\n\nfunction buildXML(entries: SitemapEntry[]): string {\n const urls = entries\n .map(\n (entry) => ` <url>\n <loc>${escapeXml(entry.loc)}</loc>${entry.lastmod ? `\\n <lastmod>${entry.lastmod}</lastmod>` : ''}${entry.changefreq ? `\\n <changefreq>${entry.changefreq}</changefreq>` : ''}${entry.priority ? `\\n <priority>${entry.priority}</priority>` : ''}\n </url>`\n )\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urls}\n</urlset>`;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n"]}
|