third-audience-mdx 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/CLAUDE.md +41 -0
- package/INSTALLATION.md +367 -0
- package/README.md +303 -0
- package/WORKLOG.md +162 -0
- package/dist/cli/index.d.mts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +208 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +185 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/dashboard/auth.d.mts +16 -0
- package/dist/dashboard/auth.d.ts +16 -0
- package/dist/dashboard/auth.js +123 -0
- package/dist/dashboard/auth.js.map +1 -0
- package/dist/dashboard/auth.mjs +87 -0
- package/dist/dashboard/auth.mjs.map +1 -0
- package/dist/dashboard/routes/analytics-api-route.d.mts +6 -0
- package/dist/dashboard/routes/analytics-api-route.d.ts +6 -0
- package/dist/dashboard/routes/analytics-api-route.js +180 -0
- package/dist/dashboard/routes/analytics-api-route.js.map +1 -0
- package/dist/dashboard/routes/analytics-api-route.mjs +145 -0
- package/dist/dashboard/routes/analytics-api-route.mjs.map +1 -0
- package/dist/dashboard/routes/api-key-route.d.mts +8 -0
- package/dist/dashboard/routes/api-key-route.d.ts +8 -0
- package/dist/dashboard/routes/api-key-route.js +173 -0
- package/dist/dashboard/routes/api-key-route.js.map +1 -0
- package/dist/dashboard/routes/api-key-route.mjs +137 -0
- package/dist/dashboard/routes/api-key-route.mjs.map +1 -0
- package/dist/dashboard/routes/citation-route.d.mts +14 -0
- package/dist/dashboard/routes/citation-route.d.ts +14 -0
- package/dist/dashboard/routes/citation-route.js +202 -0
- package/dist/dashboard/routes/citation-route.js.map +1 -0
- package/dist/dashboard/routes/citation-route.mjs +166 -0
- package/dist/dashboard/routes/citation-route.mjs.map +1 -0
- package/dist/dashboard/routes/llms-txt-route.d.mts +6 -0
- package/dist/dashboard/routes/llms-txt-route.d.ts +6 -0
- package/dist/dashboard/routes/llms-txt-route.js +119 -0
- package/dist/dashboard/routes/llms-txt-route.js.map +1 -0
- package/dist/dashboard/routes/llms-txt-route.mjs +84 -0
- package/dist/dashboard/routes/llms-txt-route.mjs.map +1 -0
- package/dist/dashboard/routes/login-route.d.mts +6 -0
- package/dist/dashboard/routes/login-route.d.ts +6 -0
- package/dist/dashboard/routes/login-route.js +313 -0
- package/dist/dashboard/routes/login-route.js.map +1 -0
- package/dist/dashboard/routes/login-route.mjs +284 -0
- package/dist/dashboard/routes/login-route.mjs.map +1 -0
- package/dist/dashboard/routes/markdown-route.d.mts +15 -0
- package/dist/dashboard/routes/markdown-route.d.ts +15 -0
- package/dist/dashboard/routes/markdown-route.js +239 -0
- package/dist/dashboard/routes/markdown-route.js.map +1 -0
- package/dist/dashboard/routes/markdown-route.mjs +204 -0
- package/dist/dashboard/routes/markdown-route.mjs.map +1 -0
- package/dist/dashboard/routes/okf-route.d.mts +13 -0
- package/dist/dashboard/routes/okf-route.d.ts +13 -0
- package/dist/dashboard/routes/okf-route.js +184 -0
- package/dist/dashboard/routes/okf-route.js.map +1 -0
- package/dist/dashboard/routes/okf-route.mjs +149 -0
- package/dist/dashboard/routes/okf-route.mjs.map +1 -0
- package/dist/dashboard/routes/sitemap-ai-route.d.mts +6 -0
- package/dist/dashboard/routes/sitemap-ai-route.d.ts +6 -0
- package/dist/dashboard/routes/sitemap-ai-route.js +134 -0
- package/dist/dashboard/routes/sitemap-ai-route.js.map +1 -0
- package/dist/dashboard/routes/sitemap-ai-route.mjs +99 -0
- package/dist/dashboard/routes/sitemap-ai-route.mjs.map +1 -0
- package/dist/dashboard/ui/components/Sidebar.d.mts +5 -0
- package/dist/dashboard/ui/components/Sidebar.d.ts +5 -0
- package/dist/dashboard/ui/components/Sidebar.js +102 -0
- package/dist/dashboard/ui/components/Sidebar.js.map +1 -0
- package/dist/dashboard/ui/components/Sidebar.mjs +68 -0
- package/dist/dashboard/ui/components/Sidebar.mjs.map +1 -0
- package/dist/dashboard/ui/globals.css +175 -0
- package/dist/dashboard/ui/pages/BotAnalyticsPage.d.mts +5 -0
- package/dist/dashboard/ui/pages/BotAnalyticsPage.d.ts +5 -0
- package/dist/dashboard/ui/pages/BotAnalyticsPage.js +269 -0
- package/dist/dashboard/ui/pages/BotAnalyticsPage.js.map +1 -0
- package/dist/dashboard/ui/pages/BotAnalyticsPage.mjs +232 -0
- package/dist/dashboard/ui/pages/BotAnalyticsPage.mjs.map +1 -0
- package/dist/dashboard/ui/pages/BotManagementPage.d.mts +13 -0
- package/dist/dashboard/ui/pages/BotManagementPage.d.ts +13 -0
- package/dist/dashboard/ui/pages/BotManagementPage.js +177 -0
- package/dist/dashboard/ui/pages/BotManagementPage.js.map +1 -0
- package/dist/dashboard/ui/pages/BotManagementPage.mjs +153 -0
- package/dist/dashboard/ui/pages/BotManagementPage.mjs.map +1 -0
- package/dist/dashboard/ui/pages/LlmTrafficPage.d.mts +5 -0
- package/dist/dashboard/ui/pages/LlmTrafficPage.d.ts +5 -0
- package/dist/dashboard/ui/pages/LlmTrafficPage.js +203 -0
- package/dist/dashboard/ui/pages/LlmTrafficPage.js.map +1 -0
- package/dist/dashboard/ui/pages/LlmTrafficPage.mjs +168 -0
- package/dist/dashboard/ui/pages/LlmTrafficPage.mjs.map +1 -0
- package/dist/dashboard/ui/pages/SettingsPage.d.mts +8 -0
- package/dist/dashboard/ui/pages/SettingsPage.d.ts +8 -0
- package/dist/dashboard/ui/pages/SettingsPage.js +181 -0
- package/dist/dashboard/ui/pages/SettingsPage.js.map +1 -0
- package/dist/dashboard/ui/pages/SettingsPage.mjs +157 -0
- package/dist/dashboard/ui/pages/SettingsPage.mjs.map +1 -0
- package/dist/dashboard/ui/pages/SystemHealthPage.d.mts +5 -0
- package/dist/dashboard/ui/pages/SystemHealthPage.d.ts +5 -0
- package/dist/dashboard/ui/pages/SystemHealthPage.js +183 -0
- package/dist/dashboard/ui/pages/SystemHealthPage.js.map +1 -0
- package/dist/dashboard/ui/pages/SystemHealthPage.mjs +148 -0
- package/dist/dashboard/ui/pages/SystemHealthPage.mjs.map +1 -0
- package/dist/index.d.mts +84 -0
- package/dist/index.d.ts +84 -0
- package/dist/index.js +372 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +346 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +125 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/dashboard/routes/sitemap-ai-route.ts
|
|
31
|
+
var sitemap_ai_route_exports = {};
|
|
32
|
+
__export(sitemap_ai_route_exports, {
|
|
33
|
+
GET: () => GET
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(sitemap_ai_route_exports);
|
|
36
|
+
var import_server = require("next/server");
|
|
37
|
+
var import_path2 = __toESM(require("path"));
|
|
38
|
+
|
|
39
|
+
// src/core/mdx-reader.ts
|
|
40
|
+
var import_fs = __toESM(require("fs"));
|
|
41
|
+
var import_path = __toESM(require("path"));
|
|
42
|
+
var import_gray_matter = __toESM(require("gray-matter"));
|
|
43
|
+
var MdxReader = class {
|
|
44
|
+
constructor(options) {
|
|
45
|
+
this.contentDir = options.contentDir;
|
|
46
|
+
}
|
|
47
|
+
/** Read a single MDX file by slug. Returns null if not found. */
|
|
48
|
+
read(slug) {
|
|
49
|
+
const candidates = [
|
|
50
|
+
import_path.default.join(this.contentDir, `${slug}.mdx`),
|
|
51
|
+
import_path.default.join(this.contentDir, `${slug}.md`),
|
|
52
|
+
import_path.default.join(this.contentDir, slug, "index.mdx"),
|
|
53
|
+
import_path.default.join(this.contentDir, slug, "index.md")
|
|
54
|
+
];
|
|
55
|
+
for (const filePath of candidates) {
|
|
56
|
+
if (import_fs.default.existsSync(filePath)) {
|
|
57
|
+
return this.parseFile(slug, filePath);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/** Read all MDX files recursively. */
|
|
63
|
+
readAll() {
|
|
64
|
+
if (!import_fs.default.existsSync(this.contentDir)) return [];
|
|
65
|
+
return this.walkDir(this.contentDir, this.contentDir);
|
|
66
|
+
}
|
|
67
|
+
walkDir(dir, root) {
|
|
68
|
+
const results = [];
|
|
69
|
+
for (const entry of import_fs.default.readdirSync(dir, { withFileTypes: true })) {
|
|
70
|
+
const fullPath = import_path.default.join(dir, entry.name);
|
|
71
|
+
if (entry.isDirectory()) {
|
|
72
|
+
results.push(...this.walkDir(fullPath, root));
|
|
73
|
+
} else if (entry.name.endsWith(".mdx") || entry.name.endsWith(".md")) {
|
|
74
|
+
const relative = import_path.default.relative(root, fullPath);
|
|
75
|
+
const slug = relative.replace(/\.(mdx|md)$/, "").replace(/\/index$/, "");
|
|
76
|
+
results.push(this.parseFile(slug, fullPath));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return results;
|
|
80
|
+
}
|
|
81
|
+
parseFile(slug, filePath) {
|
|
82
|
+
const raw = import_fs.default.readFileSync(filePath, "utf-8");
|
|
83
|
+
const { data: frontmatter, content: rawContent } = (0, import_gray_matter.default)(raw);
|
|
84
|
+
return { slug, filePath, frontmatter, rawContent };
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// src/discovery/sitemap-ai.ts
|
|
89
|
+
function generateAiSitemap(files, baseUrl) {
|
|
90
|
+
const base = baseUrl.replace(/\/$/, "");
|
|
91
|
+
const urls = files.map((file) => {
|
|
92
|
+
const fm = file.frontmatter;
|
|
93
|
+
const loc = `${base}/${file.slug}`;
|
|
94
|
+
const lastmod = fm.date ? new Date(fm.date).toISOString().slice(0, 10) : "";
|
|
95
|
+
const title = fm.title ? `
|
|
96
|
+
<title>${escapeXml(String(fm.title))}</title>` : "";
|
|
97
|
+
const desc = fm.description ? `
|
|
98
|
+
<description>${escapeXml(String(fm.description))}</description>` : "";
|
|
99
|
+
return [
|
|
100
|
+
" <url>",
|
|
101
|
+
` <loc>${escapeXml(loc)}</loc>`,
|
|
102
|
+
lastmod ? ` <lastmod>${lastmod}</lastmod>` : "",
|
|
103
|
+
` <changefreq>weekly</changefreq>`,
|
|
104
|
+
title,
|
|
105
|
+
desc,
|
|
106
|
+
" </url>"
|
|
107
|
+
].filter(Boolean).join("\n");
|
|
108
|
+
});
|
|
109
|
+
return [
|
|
110
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
111
|
+
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
|
|
112
|
+
...urls,
|
|
113
|
+
"</urlset>"
|
|
114
|
+
].join("\n") + "\n";
|
|
115
|
+
}
|
|
116
|
+
function escapeXml(s) {
|
|
117
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// src/dashboard/routes/sitemap-ai-route.ts
|
|
121
|
+
var reader = new MdxReader({ contentDir: import_path2.default.join(process.cwd(), process.env.TA_CONTENT_DIR ?? "content") });
|
|
122
|
+
async function GET(req) {
|
|
123
|
+
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL ?? `${req.nextUrl.protocol}//${req.nextUrl.host}`;
|
|
124
|
+
const files = reader.readAll();
|
|
125
|
+
const content = generateAiSitemap(files, baseUrl);
|
|
126
|
+
return new import_server.NextResponse(content, {
|
|
127
|
+
headers: { "Content-Type": "application/xml; charset=utf-8" }
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
131
|
+
0 && (module.exports = {
|
|
132
|
+
GET
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=sitemap-ai-route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/dashboard/routes/sitemap-ai-route.ts","../../../src/core/mdx-reader.ts","../../../src/discovery/sitemap-ai.ts"],"sourcesContent":["import { NextResponse, type NextRequest } from 'next/server'\nimport path from 'path'\nimport { MdxReader } from '../../core/mdx-reader.js'\nimport { generateAiSitemap } from '../../discovery/sitemap-ai.js'\n\nconst reader = new MdxReader({ contentDir: path.join(process.cwd(), process.env.TA_CONTENT_DIR ?? 'content') })\n\n/** Handler for GET /sitemap-ai.xml → rewired to /api/third-audience/sitemap-ai */\nexport async function GET(req: NextRequest) {\n const baseUrl = process.env.NEXT_PUBLIC_SITE_URL\n ?? `${req.nextUrl.protocol}//${req.nextUrl.host}`\n\n const files = reader.readAll()\n const content = generateAiSitemap(files, baseUrl)\n\n return new NextResponse(content, {\n headers: { 'Content-Type': 'application/xml; charset=utf-8' },\n })\n}\n","import fs from 'fs'\nimport path from 'path'\nimport matter from 'gray-matter'\n\nexport interface MdxFile {\n slug: string // relative path without extension, e.g. 'blog/my-post'\n filePath: string // absolute path to .mdx file\n frontmatter: Record<string, unknown>\n rawContent: string // body after frontmatter\n}\n\nexport interface MdxReaderOptions {\n contentDir: string // absolute path to content directory\n}\n\nexport class MdxReader {\n private contentDir: string\n\n constructor(options: MdxReaderOptions) {\n this.contentDir = options.contentDir\n }\n\n /** Read a single MDX file by slug. Returns null if not found. */\n read(slug: string): MdxFile | null {\n const candidates = [\n path.join(this.contentDir, `${slug}.mdx`),\n path.join(this.contentDir, `${slug}.md`),\n path.join(this.contentDir, slug, 'index.mdx'),\n path.join(this.contentDir, slug, 'index.md'),\n ]\n\n for (const filePath of candidates) {\n if (fs.existsSync(filePath)) {\n return this.parseFile(slug, filePath)\n }\n }\n\n return null\n }\n\n /** Read all MDX files recursively. */\n readAll(): MdxFile[] {\n if (!fs.existsSync(this.contentDir)) return []\n return this.walkDir(this.contentDir, this.contentDir)\n }\n\n private walkDir(dir: string, root: string): MdxFile[] {\n const results: MdxFile[] = []\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n results.push(...this.walkDir(fullPath, root))\n } else if (entry.name.endsWith('.mdx') || entry.name.endsWith('.md')) {\n const relative = path.relative(root, fullPath)\n const slug = relative.replace(/\\.(mdx|md)$/, '').replace(/\\/index$/, '')\n results.push(this.parseFile(slug, fullPath))\n }\n }\n return results\n }\n\n private parseFile(slug: string, filePath: string): MdxFile {\n const raw = fs.readFileSync(filePath, 'utf-8')\n const { data: frontmatter, content: rawContent } = matter(raw)\n return { slug, filePath, frontmatter, rawContent }\n }\n}\n","import type { MdxFile } from '../core/mdx-reader.js'\n\n/** Generates /sitemap-ai.xml from MDX files. */\nexport function generateAiSitemap(files: MdxFile[], baseUrl: string): string {\n const base = baseUrl.replace(/\\/$/, '')\n const urls = files.map(file => {\n const fm = file.frontmatter\n const loc = `${base}/${file.slug}`\n const lastmod = fm.date ? new Date(fm.date as string).toISOString().slice(0, 10) : ''\n const title = fm.title ? `\\n <title>${escapeXml(String(fm.title))}</title>` : ''\n const desc = fm.description ? `\\n <description>${escapeXml(String(fm.description))}</description>` : ''\n return [\n ' <url>',\n ` <loc>${escapeXml(loc)}</loc>`,\n lastmod ? ` <lastmod>${lastmod}</lastmod>` : '',\n ` <changefreq>weekly</changefreq>`,\n title,\n desc,\n ' </url>',\n ].filter(Boolean).join('\\n')\n })\n\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n ...urls,\n '</urlset>',\n ].join('\\n') + '\\n'\n}\n\nfunction escapeXml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n"],"mappings":"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","names":["import_path","path","fs","matter","path"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// src/dashboard/routes/sitemap-ai-route.ts
|
|
2
|
+
import { NextResponse } from "next/server";
|
|
3
|
+
import path2 from "path";
|
|
4
|
+
|
|
5
|
+
// src/core/mdx-reader.ts
|
|
6
|
+
import fs from "fs";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import matter from "gray-matter";
|
|
9
|
+
var MdxReader = class {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.contentDir = options.contentDir;
|
|
12
|
+
}
|
|
13
|
+
/** Read a single MDX file by slug. Returns null if not found. */
|
|
14
|
+
read(slug) {
|
|
15
|
+
const candidates = [
|
|
16
|
+
path.join(this.contentDir, `${slug}.mdx`),
|
|
17
|
+
path.join(this.contentDir, `${slug}.md`),
|
|
18
|
+
path.join(this.contentDir, slug, "index.mdx"),
|
|
19
|
+
path.join(this.contentDir, slug, "index.md")
|
|
20
|
+
];
|
|
21
|
+
for (const filePath of candidates) {
|
|
22
|
+
if (fs.existsSync(filePath)) {
|
|
23
|
+
return this.parseFile(slug, filePath);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/** Read all MDX files recursively. */
|
|
29
|
+
readAll() {
|
|
30
|
+
if (!fs.existsSync(this.contentDir)) return [];
|
|
31
|
+
return this.walkDir(this.contentDir, this.contentDir);
|
|
32
|
+
}
|
|
33
|
+
walkDir(dir, root) {
|
|
34
|
+
const results = [];
|
|
35
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
36
|
+
const fullPath = path.join(dir, entry.name);
|
|
37
|
+
if (entry.isDirectory()) {
|
|
38
|
+
results.push(...this.walkDir(fullPath, root));
|
|
39
|
+
} else if (entry.name.endsWith(".mdx") || entry.name.endsWith(".md")) {
|
|
40
|
+
const relative = path.relative(root, fullPath);
|
|
41
|
+
const slug = relative.replace(/\.(mdx|md)$/, "").replace(/\/index$/, "");
|
|
42
|
+
results.push(this.parseFile(slug, fullPath));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return results;
|
|
46
|
+
}
|
|
47
|
+
parseFile(slug, filePath) {
|
|
48
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
49
|
+
const { data: frontmatter, content: rawContent } = matter(raw);
|
|
50
|
+
return { slug, filePath, frontmatter, rawContent };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// src/discovery/sitemap-ai.ts
|
|
55
|
+
function generateAiSitemap(files, baseUrl) {
|
|
56
|
+
const base = baseUrl.replace(/\/$/, "");
|
|
57
|
+
const urls = files.map((file) => {
|
|
58
|
+
const fm = file.frontmatter;
|
|
59
|
+
const loc = `${base}/${file.slug}`;
|
|
60
|
+
const lastmod = fm.date ? new Date(fm.date).toISOString().slice(0, 10) : "";
|
|
61
|
+
const title = fm.title ? `
|
|
62
|
+
<title>${escapeXml(String(fm.title))}</title>` : "";
|
|
63
|
+
const desc = fm.description ? `
|
|
64
|
+
<description>${escapeXml(String(fm.description))}</description>` : "";
|
|
65
|
+
return [
|
|
66
|
+
" <url>",
|
|
67
|
+
` <loc>${escapeXml(loc)}</loc>`,
|
|
68
|
+
lastmod ? ` <lastmod>${lastmod}</lastmod>` : "",
|
|
69
|
+
` <changefreq>weekly</changefreq>`,
|
|
70
|
+
title,
|
|
71
|
+
desc,
|
|
72
|
+
" </url>"
|
|
73
|
+
].filter(Boolean).join("\n");
|
|
74
|
+
});
|
|
75
|
+
return [
|
|
76
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
77
|
+
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
|
|
78
|
+
...urls,
|
|
79
|
+
"</urlset>"
|
|
80
|
+
].join("\n") + "\n";
|
|
81
|
+
}
|
|
82
|
+
function escapeXml(s) {
|
|
83
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/dashboard/routes/sitemap-ai-route.ts
|
|
87
|
+
var reader = new MdxReader({ contentDir: path2.join(process.cwd(), process.env.TA_CONTENT_DIR ?? "content") });
|
|
88
|
+
async function GET(req) {
|
|
89
|
+
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL ?? `${req.nextUrl.protocol}//${req.nextUrl.host}`;
|
|
90
|
+
const files = reader.readAll();
|
|
91
|
+
const content = generateAiSitemap(files, baseUrl);
|
|
92
|
+
return new NextResponse(content, {
|
|
93
|
+
headers: { "Content-Type": "application/xml; charset=utf-8" }
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
export {
|
|
97
|
+
GET
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=sitemap-ai-route.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/dashboard/routes/sitemap-ai-route.ts","../../../src/core/mdx-reader.ts","../../../src/discovery/sitemap-ai.ts"],"sourcesContent":["import { NextResponse, type NextRequest } from 'next/server'\nimport path from 'path'\nimport { MdxReader } from '../../core/mdx-reader.js'\nimport { generateAiSitemap } from '../../discovery/sitemap-ai.js'\n\nconst reader = new MdxReader({ contentDir: path.join(process.cwd(), process.env.TA_CONTENT_DIR ?? 'content') })\n\n/** Handler for GET /sitemap-ai.xml → rewired to /api/third-audience/sitemap-ai */\nexport async function GET(req: NextRequest) {\n const baseUrl = process.env.NEXT_PUBLIC_SITE_URL\n ?? `${req.nextUrl.protocol}//${req.nextUrl.host}`\n\n const files = reader.readAll()\n const content = generateAiSitemap(files, baseUrl)\n\n return new NextResponse(content, {\n headers: { 'Content-Type': 'application/xml; charset=utf-8' },\n })\n}\n","import fs from 'fs'\nimport path from 'path'\nimport matter from 'gray-matter'\n\nexport interface MdxFile {\n slug: string // relative path without extension, e.g. 'blog/my-post'\n filePath: string // absolute path to .mdx file\n frontmatter: Record<string, unknown>\n rawContent: string // body after frontmatter\n}\n\nexport interface MdxReaderOptions {\n contentDir: string // absolute path to content directory\n}\n\nexport class MdxReader {\n private contentDir: string\n\n constructor(options: MdxReaderOptions) {\n this.contentDir = options.contentDir\n }\n\n /** Read a single MDX file by slug. Returns null if not found. */\n read(slug: string): MdxFile | null {\n const candidates = [\n path.join(this.contentDir, `${slug}.mdx`),\n path.join(this.contentDir, `${slug}.md`),\n path.join(this.contentDir, slug, 'index.mdx'),\n path.join(this.contentDir, slug, 'index.md'),\n ]\n\n for (const filePath of candidates) {\n if (fs.existsSync(filePath)) {\n return this.parseFile(slug, filePath)\n }\n }\n\n return null\n }\n\n /** Read all MDX files recursively. */\n readAll(): MdxFile[] {\n if (!fs.existsSync(this.contentDir)) return []\n return this.walkDir(this.contentDir, this.contentDir)\n }\n\n private walkDir(dir: string, root: string): MdxFile[] {\n const results: MdxFile[] = []\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n results.push(...this.walkDir(fullPath, root))\n } else if (entry.name.endsWith('.mdx') || entry.name.endsWith('.md')) {\n const relative = path.relative(root, fullPath)\n const slug = relative.replace(/\\.(mdx|md)$/, '').replace(/\\/index$/, '')\n results.push(this.parseFile(slug, fullPath))\n }\n }\n return results\n }\n\n private parseFile(slug: string, filePath: string): MdxFile {\n const raw = fs.readFileSync(filePath, 'utf-8')\n const { data: frontmatter, content: rawContent } = matter(raw)\n return { slug, filePath, frontmatter, rawContent }\n }\n}\n","import type { MdxFile } from '../core/mdx-reader.js'\n\n/** Generates /sitemap-ai.xml from MDX files. */\nexport function generateAiSitemap(files: MdxFile[], baseUrl: string): string {\n const base = baseUrl.replace(/\\/$/, '')\n const urls = files.map(file => {\n const fm = file.frontmatter\n const loc = `${base}/${file.slug}`\n const lastmod = fm.date ? new Date(fm.date as string).toISOString().slice(0, 10) : ''\n const title = fm.title ? `\\n <title>${escapeXml(String(fm.title))}</title>` : ''\n const desc = fm.description ? `\\n <description>${escapeXml(String(fm.description))}</description>` : ''\n return [\n ' <url>',\n ` <loc>${escapeXml(loc)}</loc>`,\n lastmod ? ` <lastmod>${lastmod}</lastmod>` : '',\n ` <changefreq>weekly</changefreq>`,\n title,\n desc,\n ' </url>',\n ].filter(Boolean).join('\\n')\n })\n\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n ...urls,\n '</urlset>',\n ].join('\\n') + '\\n'\n}\n\nfunction escapeXml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n"],"mappings":";AAAA,SAAS,oBAAsC;AAC/C,OAAOA,WAAU;;;ACDjB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,YAAY;AAaZ,IAAM,YAAN,MAAgB;AAAA,EAGrB,YAAY,SAA2B;AACrC,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA;AAAA,EAGA,KAAK,MAA8B;AACjC,UAAM,aAAa;AAAA,MACjB,KAAK,KAAK,KAAK,YAAY,GAAG,IAAI,MAAM;AAAA,MACxC,KAAK,KAAK,KAAK,YAAY,GAAG,IAAI,KAAK;AAAA,MACvC,KAAK,KAAK,KAAK,YAAY,MAAM,WAAW;AAAA,MAC5C,KAAK,KAAK,KAAK,YAAY,MAAM,UAAU;AAAA,IAC7C;AAEA,eAAW,YAAY,YAAY;AACjC,UAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,eAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAqB;AACnB,QAAI,CAAC,GAAG,WAAW,KAAK,UAAU,EAAG,QAAO,CAAC;AAC7C,WAAO,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AAAA,EACtD;AAAA,EAEQ,QAAQ,KAAa,MAAyB;AACpD,UAAM,UAAqB,CAAC;AAC5B,eAAW,SAAS,GAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAChE,YAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAI,MAAM,YAAY,GAAG;AACvB,gBAAQ,KAAK,GAAG,KAAK,QAAQ,UAAU,IAAI,CAAC;AAAA,MAC9C,WAAW,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AACpE,cAAM,WAAW,KAAK,SAAS,MAAM,QAAQ;AAC7C,cAAM,OAAO,SAAS,QAAQ,eAAe,EAAE,EAAE,QAAQ,YAAY,EAAE;AACvE,gBAAQ,KAAK,KAAK,UAAU,MAAM,QAAQ,CAAC;AAAA,MAC7C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,MAAc,UAA2B;AACzD,UAAM,MAAM,GAAG,aAAa,UAAU,OAAO;AAC7C,UAAM,EAAE,MAAM,aAAa,SAAS,WAAW,IAAI,OAAO,GAAG;AAC7D,WAAO,EAAE,MAAM,UAAU,aAAa,WAAW;AAAA,EACnD;AACF;;;AC/DO,SAAS,kBAAkB,OAAkB,SAAyB;AAC3E,QAAM,OAAO,QAAQ,QAAQ,OAAO,EAAE;AACtC,QAAM,OAAO,MAAM,IAAI,UAAQ;AAC7B,UAAM,KAAK,KAAK;AAChB,UAAM,MAAM,GAAG,IAAI,IAAI,KAAK,IAAI;AAChC,UAAM,UAAU,GAAG,OAAO,IAAI,KAAK,GAAG,IAAc,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AACnF,UAAM,QAAQ,GAAG,QAAQ;AAAA,aAAgB,UAAU,OAAO,GAAG,KAAK,CAAC,CAAC,aAAa;AACjF,UAAM,OAAO,GAAG,cAAc;AAAA,mBAAsB,UAAU,OAAO,GAAG,WAAW,CAAC,CAAC,mBAAmB;AACxG,WAAO;AAAA,MACL;AAAA,MACA,YAAY,UAAU,GAAG,CAAC;AAAA,MAC1B,UAAU,gBAAgB,OAAO,eAAe;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAC7B,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF,EAAE,KAAK,IAAI,IAAI;AACjB;AAEA,SAAS,UAAU,GAAmB;AACpC,SAAO,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AACpG;;;AF3BA,IAAM,SAAS,IAAI,UAAU,EAAE,YAAYC,MAAK,KAAK,QAAQ,IAAI,GAAG,QAAQ,IAAI,kBAAkB,SAAS,EAAE,CAAC;AAG9G,eAAsB,IAAI,KAAkB;AAC1C,QAAM,UAAU,QAAQ,IAAI,wBACvB,GAAG,IAAI,QAAQ,QAAQ,KAAK,IAAI,QAAQ,IAAI;AAEjD,QAAM,QAAQ,OAAO,QAAQ;AAC7B,QAAM,UAAU,kBAAkB,OAAO,OAAO;AAEhD,SAAO,IAAI,aAAa,SAAS;AAAA,IAC/B,SAAS,EAAE,gBAAgB,iCAAiC;AAAA,EAC9D,CAAC;AACH;","names":["path","path"]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
|
|
31
|
+
// src/dashboard/ui/components/Sidebar.tsx
|
|
32
|
+
var Sidebar_exports = {};
|
|
33
|
+
__export(Sidebar_exports, {
|
|
34
|
+
Sidebar: () => Sidebar
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(Sidebar_exports);
|
|
37
|
+
var import_link = __toESM(require("next/link"));
|
|
38
|
+
var import_navigation = require("next/navigation");
|
|
39
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
40
|
+
var NAV = [
|
|
41
|
+
{
|
|
42
|
+
href: "/third-audience",
|
|
43
|
+
label: "Bot Analytics",
|
|
44
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("polyline", { points: "22 12 18 12 15 21 9 3 6 12 2 12" }) })
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
href: "/third-audience/citations",
|
|
48
|
+
label: "LLM Traffic",
|
|
49
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) })
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
href: "/third-audience/bots",
|
|
53
|
+
label: "Bot Management",
|
|
54
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [
|
|
55
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }),
|
|
56
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })
|
|
57
|
+
] })
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
href: "/third-audience/health",
|
|
61
|
+
label: "System Health",
|
|
62
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M22 12h-4l-3 9L9 3l-3 9H2" }) })
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
href: "/third-audience/settings",
|
|
66
|
+
label: "Settings",
|
|
67
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "3" }),
|
|
69
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z" })
|
|
70
|
+
] })
|
|
71
|
+
}
|
|
72
|
+
];
|
|
73
|
+
function Sidebar() {
|
|
74
|
+
const pathname = (0, import_navigation.usePathname)();
|
|
75
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("nav", { className: "ta-sidebar", children: [
|
|
76
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "ta-sidebar-brand", children: [
|
|
77
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { viewBox: "0 0 28 28", fill: "none", children: [
|
|
78
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "28", height: "28", rx: "7", fill: "#007aff" }),
|
|
79
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M8 20l4-8 4 8M10 17h4", stroke: "#fff", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
80
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "20", cy: "9", r: "3", fill: "#34c759" })
|
|
81
|
+
] }),
|
|
82
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Third Audience" })
|
|
83
|
+
] }),
|
|
84
|
+
NAV.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
85
|
+
import_link.default,
|
|
86
|
+
{
|
|
87
|
+
href: item.href,
|
|
88
|
+
className: `ta-nav-item${pathname === item.href ? " active" : ""}`,
|
|
89
|
+
children: [
|
|
90
|
+
item.icon,
|
|
91
|
+
item.label
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
item.href
|
|
95
|
+
))
|
|
96
|
+
] });
|
|
97
|
+
}
|
|
98
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
99
|
+
0 && (module.exports = {
|
|
100
|
+
Sidebar
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=Sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/dashboard/ui/components/Sidebar.tsx"],"sourcesContent":["'use client'\nimport Link from 'next/link'\nimport { usePathname } from 'next/navigation'\n\nconst NAV = [\n {\n href: '/third-audience',\n label: 'Bot Analytics',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <polyline points=\"22 12 18 12 15 21 9 3 6 12 2 12\" />\n </svg>\n ),\n },\n {\n href: '/third-audience/citations',\n label: 'LLM Traffic',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n ),\n },\n {\n href: '/third-audience/bots',\n label: 'Bot Management',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n ),\n },\n {\n href: '/third-audience/health',\n label: 'System Health',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n ),\n },\n {\n href: '/third-audience/settings',\n label: 'Settings',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n ),\n },\n]\n\nexport function Sidebar() {\n const pathname = usePathname()\n\n return (\n <nav className=\"ta-sidebar\">\n <div className=\"ta-sidebar-brand\">\n <svg viewBox=\"0 0 28 28\" fill=\"none\">\n <rect width=\"28\" height=\"28\" rx=\"7\" fill=\"#007aff\" />\n <path d=\"M8 20l4-8 4 8M10 17h4\" stroke=\"#fff\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <circle cx=\"20\" cy=\"9\" r=\"3\" fill=\"#34c759\" />\n </svg>\n <span>Third Audience</span>\n </div>\n {NAV.map(item => (\n <Link\n key={item.href}\n href={item.href}\n className={`ta-nav-item${pathname === item.href ? ' active' : ''}`}\n >\n {item.icon}\n {item.label}\n </Link>\n ))}\n </nav>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAiB;AACjB,wBAA4B;AAQpB;AANR,IAAM,MAAM;AAAA,EACV;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,4CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE,sDAAC,cAAS,QAAO,mCAAkC,GACrD;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,4CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE,sDAAC,UAAK,GAAE,iEAAgE,GAC1E;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,6CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,MACxD,4CAAC,UAAK,GAAE,4BAA2B;AAAA,OACrC;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,4CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE,sDAAC,UAAK,GAAE,6BAA4B,GACtC;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,6CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE;AAAA,kDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,MAC9B,4CAAC,UAAK,GAAE,0mBAAymB;AAAA,OACnnB;AAAA,EAEJ;AACF;AAEO,SAAS,UAAU;AACxB,QAAM,eAAW,+BAAY;AAE7B,SACE,6CAAC,SAAI,WAAU,cACb;AAAA,iDAAC,SAAI,WAAU,oBACb;AAAA,mDAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B;AAAA,oDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,MAAK,WAAU;AAAA,QACnD,4CAAC,UAAK,GAAE,yBAAwB,QAAO,QAAO,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ;AAAA,QAC3G,4CAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI,MAAK,WAAU;AAAA,SAC9C;AAAA,MACA,4CAAC,UAAK,4BAAc;AAAA,OACtB;AAAA,IACC,IAAI,IAAI,UACP;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QAEC,MAAM,KAAK;AAAA,QACX,WAAW,cAAc,aAAa,KAAK,OAAO,YAAY,EAAE;AAAA,QAE/D;AAAA,eAAK;AAAA,UACL,KAAK;AAAA;AAAA;AAAA,MALD,KAAK;AAAA,IAMZ,CACD;AAAA,KACH;AAEJ;","names":["Link"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/dashboard/ui/components/Sidebar.tsx
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import { usePathname } from "next/navigation";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
var NAV = [
|
|
8
|
+
{
|
|
9
|
+
href: "/third-audience",
|
|
10
|
+
label: "Bot Analytics",
|
|
11
|
+
icon: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("polyline", { points: "22 12 18 12 15 21 9 3 6 12 2 12" }) })
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
href: "/third-audience/citations",
|
|
15
|
+
label: "LLM Traffic",
|
|
16
|
+
icon: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) })
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
href: "/third-audience/bots",
|
|
20
|
+
label: "Bot Management",
|
|
21
|
+
icon: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [
|
|
22
|
+
/* @__PURE__ */ jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }),
|
|
23
|
+
/* @__PURE__ */ jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })
|
|
24
|
+
] })
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
href: "/third-audience/health",
|
|
28
|
+
label: "System Health",
|
|
29
|
+
icon: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { d: "M22 12h-4l-3 9L9 3l-3 9H2" }) })
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
href: "/third-audience/settings",
|
|
33
|
+
label: "Settings",
|
|
34
|
+
icon: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [
|
|
35
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3" }),
|
|
36
|
+
/* @__PURE__ */ jsx("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z" })
|
|
37
|
+
] })
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
function Sidebar() {
|
|
41
|
+
const pathname = usePathname();
|
|
42
|
+
return /* @__PURE__ */ jsxs("nav", { className: "ta-sidebar", children: [
|
|
43
|
+
/* @__PURE__ */ jsxs("div", { className: "ta-sidebar-brand", children: [
|
|
44
|
+
/* @__PURE__ */ jsxs("svg", { viewBox: "0 0 28 28", fill: "none", children: [
|
|
45
|
+
/* @__PURE__ */ jsx("rect", { width: "28", height: "28", rx: "7", fill: "#007aff" }),
|
|
46
|
+
/* @__PURE__ */ jsx("path", { d: "M8 20l4-8 4 8M10 17h4", stroke: "#fff", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
47
|
+
/* @__PURE__ */ jsx("circle", { cx: "20", cy: "9", r: "3", fill: "#34c759" })
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ jsx("span", { children: "Third Audience" })
|
|
50
|
+
] }),
|
|
51
|
+
NAV.map((item) => /* @__PURE__ */ jsxs(
|
|
52
|
+
Link,
|
|
53
|
+
{
|
|
54
|
+
href: item.href,
|
|
55
|
+
className: `ta-nav-item${pathname === item.href ? " active" : ""}`,
|
|
56
|
+
children: [
|
|
57
|
+
item.icon,
|
|
58
|
+
item.label
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
item.href
|
|
62
|
+
))
|
|
63
|
+
] });
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
Sidebar
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=Sidebar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/dashboard/ui/components/Sidebar.tsx"],"sourcesContent":["'use client'\nimport Link from 'next/link'\nimport { usePathname } from 'next/navigation'\n\nconst NAV = [\n {\n href: '/third-audience',\n label: 'Bot Analytics',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <polyline points=\"22 12 18 12 15 21 9 3 6 12 2 12\" />\n </svg>\n ),\n },\n {\n href: '/third-audience/citations',\n label: 'LLM Traffic',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n ),\n },\n {\n href: '/third-audience/bots',\n label: 'Bot Management',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n ),\n },\n {\n href: '/third-audience/health',\n label: 'System Health',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n ),\n },\n {\n href: '/third-audience/settings',\n label: 'Settings',\n icon: (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n ),\n },\n]\n\nexport function Sidebar() {\n const pathname = usePathname()\n\n return (\n <nav className=\"ta-sidebar\">\n <div className=\"ta-sidebar-brand\">\n <svg viewBox=\"0 0 28 28\" fill=\"none\">\n <rect width=\"28\" height=\"28\" rx=\"7\" fill=\"#007aff\" />\n <path d=\"M8 20l4-8 4 8M10 17h4\" stroke=\"#fff\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <circle cx=\"20\" cy=\"9\" r=\"3\" fill=\"#34c759\" />\n </svg>\n <span>Third Audience</span>\n </div>\n {NAV.map(item => (\n <Link\n key={item.href}\n href={item.href}\n className={`ta-nav-item${pathname === item.href ? ' active' : ''}`}\n >\n {item.icon}\n {item.label}\n </Link>\n ))}\n </nav>\n )\n}\n"],"mappings":";;;AACA,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAQpB,cAiBF,YAjBE;AANR,IAAM,MAAM;AAAA,EACV;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,oBAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE,8BAAC,cAAS,QAAO,mCAAkC,GACrD;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,oBAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE,8BAAC,UAAK,GAAE,iEAAgE,GAC1E;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,qBAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE;AAAA,0BAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,MACxD,oBAAC,UAAK,GAAE,4BAA2B;AAAA,OACrC;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,oBAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE,8BAAC,UAAK,GAAE,6BAA4B,GACtC;AAAA,EAEJ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MACE,qBAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GACtE;AAAA,0BAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,MAC9B,oBAAC,UAAK,GAAE,0mBAAymB;AAAA,OACnnB;AAAA,EAEJ;AACF;AAEO,SAAS,UAAU;AACxB,QAAM,WAAW,YAAY;AAE7B,SACE,qBAAC,SAAI,WAAU,cACb;AAAA,yBAAC,SAAI,WAAU,oBACb;AAAA,2BAAC,SAAI,SAAQ,aAAY,MAAK,QAC5B;AAAA,4BAAC,UAAK,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,MAAK,WAAU;AAAA,QACnD,oBAAC,UAAK,GAAE,yBAAwB,QAAO,QAAO,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ;AAAA,QAC3G,oBAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI,MAAK,WAAU;AAAA,SAC9C;AAAA,MACA,oBAAC,UAAK,4BAAc;AAAA,OACtB;AAAA,IACC,IAAI,IAAI,UACP;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,KAAK;AAAA,QACX,WAAW,cAAc,aAAa,KAAK,OAAO,YAAY,EAAE;AAAA,QAE/D;AAAA,eAAK;AAAA,UACL,KAAK;AAAA;AAAA;AAAA,MALD,KAAK;AAAA,IAMZ,CACD;AAAA,KACH;AAEJ;","names":[]}
|