@ignite-agent/agent 0.1.0 → 0.4.1
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/AI.txt +7 -0
- package/LICENSE +57 -4
- package/README.md +194 -12
- package/dist/cli/index.js +105 -21
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/project.d.ts +39 -0
- package/dist/cli/project.js +276 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/client-public.d.ts +2 -0
- package/dist/client-public.js +3 -0
- package/dist/client-public.js.map +1 -0
- package/dist/client.d.ts +3 -1
- package/dist/client.js +7 -0
- package/dist/client.js.map +1 -1
- package/dist/env.js +1 -2
- package/dist/env.js.map +1 -1
- package/dist/ignite.css +228 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +22 -0
- package/dist/mcp.js +88 -0
- package/dist/mcp.js.map +1 -0
- package/dist/operator/blog.d.ts +21 -0
- package/dist/operator/blog.js +32 -0
- package/dist/operator/blog.js.map +1 -0
- package/dist/operator/card.d.ts +5 -0
- package/dist/operator/card.js +11 -0
- package/dist/operator/card.js.map +1 -0
- package/dist/operator/jsonld.d.ts +6 -0
- package/dist/operator/jsonld.js +6 -3
- package/dist/operator/jsonld.js.map +1 -1
- package/dist/operator/metadata.d.ts +1 -0
- package/dist/operator/metadata.js +1 -0
- package/dist/operator/metadata.js.map +1 -1
- package/dist/operator/page.d.ts +17 -0
- package/dist/operator/page.js +51 -0
- package/dist/operator/page.js.map +1 -0
- package/dist/operator/prose.d.ts +19 -0
- package/dist/operator/prose.js +26 -0
- package/dist/operator/prose.js.map +1 -0
- package/dist/operator/proxy.d.ts +2 -0
- package/dist/operator/proxy.js +43 -22
- package/dist/operator/proxy.js.map +1 -1
- package/dist/operator/robots.d.ts +1 -0
- package/dist/operator/robots.js +1 -0
- package/dist/operator/robots.js.map +1 -1
- package/dist/operator/sitemap-merge.d.ts +10 -0
- package/dist/operator/sitemap-merge.js +56 -0
- package/dist/operator/sitemap-merge.js.map +1 -0
- package/dist/operator/sitemap.d.ts +5 -1
- package/dist/operator/sitemap.js +28 -17
- package/dist/operator/sitemap.js.map +1 -1
- package/dist/operator/ui.d.ts +44 -0
- package/dist/operator/ui.js +477 -0
- package/dist/operator/ui.js.map +1 -0
- package/dist/operator/wiki.d.ts +21 -0
- package/dist/operator/wiki.js +41 -0
- package/dist/operator/wiki.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/onboarding/CLAUDE-CODE-SETUP.md +52 -18
- package/onboarding/CURSOR-SETUP.md +73 -0
- package/onboarding/LOVABLE-SETUP.md +76 -0
- package/onboarding/MIGRATE-EXISTING.md +94 -0
- package/onboarding/REPLIT-SETUP.md +76 -0
- package/package.json +32 -9
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline';
|
|
2
|
+
import { IgniteClient } from './client.js';
|
|
3
|
+
const TOOLS = [
|
|
4
|
+
{
|
|
5
|
+
name: 'list_pages',
|
|
6
|
+
description: 'List published wiki and blog pages from the Ignite feed (no drafts).',
|
|
7
|
+
inputSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
name: 'get_page',
|
|
11
|
+
description: 'Fetch one published page body by slug.',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: { slug: { type: 'string' } },
|
|
15
|
+
required: ['slug'],
|
|
16
|
+
additionalProperties: false,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'get_directives',
|
|
21
|
+
description: 'Fetch robots, sitemap, JSON-LD, and metadata directives for this site.',
|
|
22
|
+
inputSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
export async function handleMcp(msg, client) {
|
|
26
|
+
if (msg.id === undefined || msg.id === null)
|
|
27
|
+
return null;
|
|
28
|
+
const id = msg.id;
|
|
29
|
+
try {
|
|
30
|
+
switch (msg.method) {
|
|
31
|
+
case 'initialize':
|
|
32
|
+
return {
|
|
33
|
+
jsonrpc: '2.0',
|
|
34
|
+
id,
|
|
35
|
+
result: {
|
|
36
|
+
protocolVersion: '2024-11-05',
|
|
37
|
+
capabilities: { tools: {} },
|
|
38
|
+
serverInfo: { name: 'ignite-feed', version: '0.1.1' },
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
case 'tools/list':
|
|
42
|
+
return { jsonrpc: '2.0', id, result: { tools: TOOLS } };
|
|
43
|
+
case 'tools/call':
|
|
44
|
+
return { jsonrpc: '2.0', id, result: await callTool(client, msg.params) };
|
|
45
|
+
case 'notifications/initialized':
|
|
46
|
+
case 'ping':
|
|
47
|
+
return { jsonrpc: '2.0', id, result: {} };
|
|
48
|
+
default:
|
|
49
|
+
return { jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown method ${msg.method ?? ''}` } };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return { jsonrpc: '2.0', id, error: { code: -32000, message: error.message } };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function callTool(client, params) {
|
|
57
|
+
const name = params?.name ?? '';
|
|
58
|
+
const args = params?.arguments ?? {};
|
|
59
|
+
let payload;
|
|
60
|
+
if (name === 'list_pages')
|
|
61
|
+
payload = await client.pages();
|
|
62
|
+
else if (name === 'get_page')
|
|
63
|
+
payload = await client.page(String(args.slug ?? ''));
|
|
64
|
+
else if (name === 'get_directives')
|
|
65
|
+
payload = await client.directives();
|
|
66
|
+
else
|
|
67
|
+
throw new Error(`Unknown tool ${name}`);
|
|
68
|
+
return { content: [{ type: 'text', text: JSON.stringify(payload) }] };
|
|
69
|
+
}
|
|
70
|
+
export async function runMcpStdio() {
|
|
71
|
+
const client = IgniteClient.fromEnv();
|
|
72
|
+
const rl = createInterface({ input: process.stdin });
|
|
73
|
+
for await (const line of rl) {
|
|
74
|
+
if (!line.trim())
|
|
75
|
+
continue;
|
|
76
|
+
let msg;
|
|
77
|
+
try {
|
|
78
|
+
msg = JSON.parse(line);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const res = await handleMcp(msg, client);
|
|
84
|
+
if (res)
|
|
85
|
+
process.stdout.write(`${JSON.stringify(res)}\n`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import 'server-only';
|
|
2
|
+
import type { Metadata } from 'next';
|
|
3
|
+
import { FeedArticle, feedPageMetadata, feedPagesOfKind, revalidate, tryLoadFeedPage } from './page.js';
|
|
4
|
+
import { type IgniteTokens } from './ui.js';
|
|
5
|
+
export { revalidate, FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind };
|
|
6
|
+
export { pageJsonLd, feedMetadata, mergeSlugs } from './ui.js';
|
|
7
|
+
export { FeedJsonLd } from './jsonld.js';
|
|
8
|
+
export { IgniteProse, IgniteTokensProvider, type IgniteTokens } from './prose.js';
|
|
9
|
+
type SlugParams = {
|
|
10
|
+
params: Promise<{
|
|
11
|
+
slug: string;
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
export declare function generateStaticParams(): Promise<Array<{
|
|
15
|
+
slug: string;
|
|
16
|
+
}>>;
|
|
17
|
+
export declare function generateMetadata({ params }: SlugParams): Promise<Metadata>;
|
|
18
|
+
export default function BlogPage({ params }: SlugParams): Promise<import("react").JSX.Element>;
|
|
19
|
+
export declare function BlogIndex({ tokens }?: {
|
|
20
|
+
tokens?: IgniteTokens | undefined;
|
|
21
|
+
}): Promise<import("react").JSX.Element | null>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import 'server-only';
|
|
3
|
+
import { notFound } from 'next/navigation';
|
|
4
|
+
import { FeedCard } from './card.js';
|
|
5
|
+
import { FeedArticle, feedPageMetadata, feedPagesOfKind, revalidate, tryLoadFeedPage, } from './page.js';
|
|
6
|
+
import { IgniteFrame } from './prose.js';
|
|
7
|
+
export { revalidate, FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind };
|
|
8
|
+
export { pageJsonLd, feedMetadata, mergeSlugs } from './ui.js';
|
|
9
|
+
export { FeedJsonLd } from './jsonld.js';
|
|
10
|
+
export { IgniteProse, IgniteTokensProvider } from './prose.js';
|
|
11
|
+
export async function generateStaticParams() {
|
|
12
|
+
return (await feedPagesOfKind('article')).map((page) => ({ slug: page.slug }));
|
|
13
|
+
}
|
|
14
|
+
export async function generateMetadata({ params }) {
|
|
15
|
+
const { slug } = await params;
|
|
16
|
+
const page = await tryLoadFeedPage('article', slug);
|
|
17
|
+
return page ? feedPageMetadata(page) : {};
|
|
18
|
+
}
|
|
19
|
+
export default async function BlogPage({ params }) {
|
|
20
|
+
const { slug } = await params;
|
|
21
|
+
const page = await tryLoadFeedPage('article', slug);
|
|
22
|
+
if (!page)
|
|
23
|
+
notFound();
|
|
24
|
+
return _jsx(FeedArticle, { page: page });
|
|
25
|
+
}
|
|
26
|
+
export async function BlogIndex({ tokens } = {}) {
|
|
27
|
+
const pages = await feedPagesOfKind('article');
|
|
28
|
+
if (pages.length === 0)
|
|
29
|
+
return null;
|
|
30
|
+
return (_jsxs(IgniteFrame, { tokens: tokens, children: [_jsx("h1", { className: "ignite-index-title", children: "Blog" }), _jsx("div", { className: "ignite-cards", children: pages.map((page) => (_jsx(FeedCard, { page: page }, page.slug))) })] }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=blog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blog.js","sourceRoot":"","sources":["../../src/operator/blog.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI3C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAC;AAIlF,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI;QAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,GAAI,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAE,MAAM,KAA4C,EAAE;IACpF,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,MAAC,WAAW,IAAC,MAAM,EAAE,MAAM,aACzB,aAAI,SAAS,EAAC,oBAAoB,qBAAU,EAC5C,cAAK,SAAS,EAAC,cAAc,YAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,IAAO,IAAI,CAAC,IAAI,CAAI,CACzC,CAAC,GACE,IACM,CACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import 'server-only';
|
|
3
|
+
import { formatFeedDate, pageHero, plainExcerpt, publicPublishedAt } from './ui.js';
|
|
4
|
+
export function FeedCard({ page }) {
|
|
5
|
+
const excerpt = page.excerpt?.trim() || plainExcerpt(page.html);
|
|
6
|
+
const date = formatFeedDate(publicPublishedAt(page) ?? page.updatedAt);
|
|
7
|
+
const author = page.author?.name;
|
|
8
|
+
const image = pageHero(page);
|
|
9
|
+
return (_jsxs("a", { className: "ignite-card", href: page.path, children: [image?.url ? (_jsx("img", { className: "ignite-card-image", src: image.url, alt: image.alt ?? page.title })) : null, _jsx("h2", { className: "ignite-card-title", children: page.title }), author || date ? (_jsxs("p", { className: "ignite-card-meta", children: [author, author && date ? ' · ' : null, date] })) : null, excerpt ? _jsx("p", { className: "ignite-card-excerpt", children: excerpt }) : null] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/operator/card.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpF,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAsB;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO,CACL,aAAG,SAAS,EAAC,aAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,aACvC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CACZ,cAAK,SAAS,EAAC,mBAAmB,EAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,GAAI,CACpF,CAAC,CAAC,CAAC,IAAI,EACR,aAAI,SAAS,EAAC,mBAAmB,YAAE,IAAI,CAAC,KAAK,GAAM,EAClD,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAChB,aAAG,SAAS,EAAC,kBAAkB,aAC5B,MAAM,EACN,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAC7B,IAAI,IACH,CACL,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,qBAAqB,YAAE,OAAO,GAAK,CAAC,CAAC,CAAC,IAAI,IAChE,CACL,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1,7 @@
|
|
|
1
|
+
import 'server-only';
|
|
2
|
+
import type { FeedPage } from '../types.js';
|
|
3
|
+
import { type FeedUrlOptions } from './ui.js';
|
|
1
4
|
export declare function IgniteJsonLd(): Promise<React.JSX.Element | null>;
|
|
5
|
+
export declare function FeedJsonLd({ page, siteUrl }: {
|
|
6
|
+
page: FeedPage;
|
|
7
|
+
} & FeedUrlOptions): import("react").JSX.Element;
|
package/dist/operator/jsonld.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import 'server-only';
|
|
2
3
|
import { IgniteClient } from '../client.js';
|
|
4
|
+
import { jsonLdScript, pageJsonLd } from './ui.js';
|
|
3
5
|
// Drop into `app/layout.tsx`: import { IgniteJsonLd } from '@ignite-agent/agent/jsonld' then render <IgniteJsonLd />
|
|
4
6
|
// An async server component that emits ld+json for the site. Renders nothing when unconfigured or unreachable.
|
|
5
7
|
export async function IgniteJsonLd() {
|
|
@@ -15,8 +17,9 @@ export async function IgniteJsonLd() {
|
|
|
15
17
|
}
|
|
16
18
|
if (blocks.length === 0)
|
|
17
19
|
return null;
|
|
18
|
-
return (_jsx(_Fragment, { children: blocks.map((block, i) => (_jsx("script", { type: "application/ld+json",
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
return (_jsx(_Fragment, { children: blocks.map((block, i) => (_jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: jsonLdScript(block) } }, i))) }));
|
|
21
|
+
}
|
|
22
|
+
export function FeedJsonLd({ page, siteUrl }) {
|
|
23
|
+
return (_jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: jsonLdScript(pageJsonLd(page, { siteUrl })) } }));
|
|
21
24
|
}
|
|
22
25
|
//# sourceMappingURL=jsonld.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/operator/jsonld.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,uHAAuH;AACvH,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,MAAM,GAA8B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,
|
|
1
|
+
{"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/operator/jsonld.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAuB,MAAM,SAAS,CAAC;AAExE,uHAAuH;AACvH,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,MAAM,GAA8B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,iBAAgB,IAAI,EAAC,qBAAqB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,IAAtF,CAAC,CAAyF,CACxG,CAAC,GACD,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAuC;IAC/E,OAAO,CACL,iBAAQ,IAAI,EAAC,qBAAqB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,GAAI,CACxH,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import 'server-only';
|
|
1
2
|
import { IgniteClient } from '../client.js';
|
|
2
3
|
// Use inside `generateMetadata`: export async function generateMetadata() { return igniteMetadata('/pricing') }
|
|
3
4
|
// Merge with your own values by spreading: { ...(await igniteMetadata(path)), title: 'override' }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/operator/metadata.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/operator/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAIrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,iHAAiH;AACjH,kGAAkG;AAClG,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,SAAS,CAAC;IACd,IAAI,CAAC;QACH,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IACtD,IAAI,SAAS,CAAC,WAAW;QAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;IACxE,IAAI,SAAS,CAAC,SAAS;QAAE,QAAQ,CAAC,UAAU,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IAClF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,QAAQ,CAAC,SAAS,GAAG;YACnB,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import 'server-only';
|
|
2
|
+
import type { Metadata } from 'next';
|
|
3
|
+
import type { FeedPage } from '../types.js';
|
|
4
|
+
import { type FeedUrlOptions, type IgniteTokens } from './ui.js';
|
|
5
|
+
export { IgniteProse, IgniteTokensProvider, type IgniteTokens } from './prose.js';
|
|
6
|
+
export { pageJsonLd, feedMetadata } from './ui.js';
|
|
7
|
+
export { FeedJsonLd } from './jsonld.js';
|
|
8
|
+
export declare const revalidate = 60;
|
|
9
|
+
export declare function feedPagesOfKind(kind: FeedPage['kind']): Promise<FeedPage[]>;
|
|
10
|
+
export declare function tryLoadFeedPage(kind: FeedPage['kind'], slug: string): Promise<FeedPage | null>;
|
|
11
|
+
export declare function feedPageMetadata(page: FeedPage, options?: FeedUrlOptions): Metadata;
|
|
12
|
+
export declare function FeedArticle({ page, tokens, indexHref, siteUrl, }: {
|
|
13
|
+
page: FeedPage;
|
|
14
|
+
tokens?: IgniteTokens | undefined;
|
|
15
|
+
indexHref?: string | undefined;
|
|
16
|
+
siteUrl?: string | undefined;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import 'server-only';
|
|
3
|
+
import { IgniteApiError, IgniteClient } from '../client.js';
|
|
4
|
+
import { FeedJsonLd } from './jsonld.js';
|
|
5
|
+
import { IgniteFrame } from './prose.js';
|
|
6
|
+
import { feedMetadata, formatFeedDate, kindIndexPath, kindLabel, pageHero, publicModifiedAt, publicPublishedAt, } from './ui.js';
|
|
7
|
+
export { IgniteProse, IgniteTokensProvider } from './prose.js';
|
|
8
|
+
export { pageJsonLd, feedMetadata } from './ui.js';
|
|
9
|
+
export { FeedJsonLd } from './jsonld.js';
|
|
10
|
+
export const revalidate = 60;
|
|
11
|
+
export async function feedPagesOfKind(kind) {
|
|
12
|
+
const client = IgniteClient.fromEnvOrNull();
|
|
13
|
+
if (!client)
|
|
14
|
+
return [];
|
|
15
|
+
try {
|
|
16
|
+
const { pages } = await client.pages();
|
|
17
|
+
return pages.filter((page) => page.kind === kind);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function tryLoadFeedPage(kind, slug) {
|
|
24
|
+
const client = IgniteClient.fromEnvOrNull();
|
|
25
|
+
if (!client)
|
|
26
|
+
return null;
|
|
27
|
+
try {
|
|
28
|
+
const page = await client.page(slug);
|
|
29
|
+
return page.kind === kind ? page : null;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error instanceof IgniteApiError && error.status === 404)
|
|
33
|
+
return null;
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function feedPageMetadata(page, options) {
|
|
38
|
+
return feedMetadata(page, options);
|
|
39
|
+
}
|
|
40
|
+
export function FeedArticle({ page, tokens, indexHref, siteUrl, }) {
|
|
41
|
+
const index = indexHref ?? kindIndexPath(page.kind);
|
|
42
|
+
const published = formatFeedDate(publicPublishedAt(page));
|
|
43
|
+
const modified = formatFeedDate(publicModifiedAt(page));
|
|
44
|
+
const reviewed = formatFeedDate(page.lastReviewed);
|
|
45
|
+
const kind = kindLabel(page.kind);
|
|
46
|
+
const parent = page.parent;
|
|
47
|
+
const author = page.author;
|
|
48
|
+
const image = pageHero(page);
|
|
49
|
+
return (_jsxs(IgniteFrame, { tokens: tokens, children: [_jsx(FeedJsonLd, { page: page, siteUrl: siteUrl }), _jsxs("article", { className: "ignite-article", children: [_jsxs("nav", { className: "ignite-kicker", "aria-label": "Breadcrumb", children: [_jsx("a", { href: index, children: page.kind === 'article' ? 'Blog' : 'Wiki' }), parent ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", children: "/" }), _jsx("a", { href: parent.path, children: parent.title })] })) : null] }), image?.url ? (_jsxs("figure", { className: "ignite-hero", children: [_jsx("img", { src: image.url, alt: image.alt ?? page.title, ...(image.width ? { width: image.width } : {}), ...(image.height ? { height: image.height } : {}) }), image.alt && image.alt !== page.title ? _jsx("figcaption", { children: image.alt }) : null] })) : null, _jsx("h1", { className: "ignite-title", children: page.title }), _jsxs("p", { className: "ignite-meta", children: [author?.image ? (_jsx("img", { className: "ignite-avatar", src: author.image, alt: author.name, width: 24, height: 24 })) : null, kind, author?.name ? (_jsxs(_Fragment, { children: [' · ', author.url ? _jsx("a", { href: author.url, children: author.name }) : author.name] })) : null, published ? ` · ${published}` : null, modified && modified !== published ? ` · Updated ${modified}` : null, reviewed ? ` · Reviewed ${reviewed}` : null] }), _jsx("div", { className: "ignite-prose", dangerouslySetInnerHTML: { __html: page.html } })] })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/operator/page.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAIrB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,GAGlB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAsB;IAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAsB,EAAE,IAAY;IACxE,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAc,EAAE,OAAwB;IACvE,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,MAAM,EACN,SAAS,EACT,OAAO,GAMR;IACC,MAAM,KAAK,GAAG,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO,CACL,MAAC,WAAW,IAAC,MAAM,EAAE,MAAM,aACzB,KAAC,UAAU,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAI,EAC5C,mBAAS,SAAS,EAAC,gBAAgB,aACjC,eAAK,SAAS,EAAC,eAAe,gBAAY,YAAY,aACpD,YAAG,IAAI,EAAE,KAAK,YAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAK,EAC9D,MAAM,CAAC,CAAC,CAAC,CACR,8BACE,8BAAkB,MAAM,kBAAS,EACjC,YAAG,IAAI,EAAE,MAAM,CAAC,IAAI,YAAG,MAAM,CAAC,KAAK,GAAK,IACvC,CACJ,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CACZ,kBAAQ,SAAS,EAAC,aAAa,aAC7B,cACE,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,KACxB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC3C,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAClD,EACD,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,+BAAa,KAAK,CAAC,GAAG,GAAc,CAAC,CAAC,CAAC,IAAI,IAC7E,CACV,CAAC,CAAC,CAAC,IAAI,EACR,aAAI,SAAS,EAAC,cAAc,YAAE,IAAI,CAAC,KAAK,GAAM,EAC9C,aAAG,SAAS,EAAC,aAAa,aACvB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CACf,cAAK,SAAS,EAAC,eAAe,EAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,CAC9F,CAAC,CAAC,CAAC,IAAI,EACP,IAAI,EACJ,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CACd,8BACG,KAAK,EACL,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,YAAG,IAAI,EAAE,MAAM,CAAC,GAAG,YAAG,MAAM,CAAC,IAAI,GAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IACjE,CACJ,CAAC,CAAC,CAAC,IAAI,EACP,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EACpC,QAAQ,IAAI,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,EACpE,QAAQ,CAAC,CAAC,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,IAC1C,EACJ,cAAK,SAAS,EAAC,cAAc,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,GAAI,IACxE,IACE,CACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import 'server-only';
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import { type IgniteTokens } from './ui.js';
|
|
4
|
+
export type { IgniteTokens };
|
|
5
|
+
export declare function IgniteTokensProvider({ tokens, children, }: {
|
|
6
|
+
tokens: IgniteTokens;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export declare function IgniteProse({ html, children, tokens, injectCss, }: {
|
|
10
|
+
html?: string | undefined;
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
tokens?: IgniteTokens | undefined;
|
|
13
|
+
injectCss?: boolean | undefined;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
export declare function IgniteFrame({ tokens, children, injectCss, }: {
|
|
16
|
+
tokens?: IgniteTokens | undefined;
|
|
17
|
+
children: ReactNode;
|
|
18
|
+
injectCss?: boolean | undefined;
|
|
19
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import 'server-only';
|
|
3
|
+
import { createContext, useContext } from 'react';
|
|
4
|
+
import { IGNITE_CSS, tokensToStyle } from './ui.js';
|
|
5
|
+
const IgniteTokensContext = createContext(undefined);
|
|
6
|
+
export function IgniteTokensProvider({ tokens, children, }) {
|
|
7
|
+
return _jsx(IgniteTokensContext.Provider, { value: tokens, children: children });
|
|
8
|
+
}
|
|
9
|
+
function useResolvedTokens(override) {
|
|
10
|
+
const ctx = useContext(IgniteTokensContext);
|
|
11
|
+
if (!override)
|
|
12
|
+
return ctx;
|
|
13
|
+
return ctx ? { ...ctx, ...override } : override;
|
|
14
|
+
}
|
|
15
|
+
function IgniteStyles() {
|
|
16
|
+
return (_jsx("style", { href: "ignite-ui", precedence: "medium", children: IGNITE_CSS }));
|
|
17
|
+
}
|
|
18
|
+
export function IgniteProse({ html, children, tokens, injectCss = true, }) {
|
|
19
|
+
const style = tokensToStyle(useResolvedTokens(tokens));
|
|
20
|
+
return (_jsxs("div", { className: "ignite ignite-prose", style: style, children: [injectCss ? _jsx(IgniteStyles, {}) : null, html ? _jsx("div", { dangerouslySetInnerHTML: { __html: html } }) : children] }));
|
|
21
|
+
}
|
|
22
|
+
export function IgniteFrame({ tokens, children, injectCss = true, }) {
|
|
23
|
+
const style = tokensToStyle(useResolvedTokens(tokens));
|
|
24
|
+
return (_jsxs("div", { className: "ignite", style: style, children: [injectCss ? _jsx(IgniteStyles, {}) : null, children] }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=prose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prose.js","sourceRoot":"","sources":["../../src/operator/prose.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAEtF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAqB,MAAM,SAAS,CAAC;AAIvE,MAAM,mBAAmB,GAAG,aAAa,CAA2B,SAAS,CAAC,CAAC;AAE/E,MAAM,UAAU,oBAAoB,CAAC,EACnC,MAAM,EACN,QAAQ,GAIT;IACC,OAAO,KAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YAAG,QAAQ,GAAgC,CAAC;AAChG,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAmC;IAC5D,MAAM,GAAG,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC1B,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,CACL,gBAAO,IAAI,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,YACxC,UAAU,GACL,CACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,SAAS,GAAG,IAAI,GAMjB;IACC,MAAM,KAAK,GAAG,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAA8B,CAAC;IACpF,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,KAAK,aAC9C,SAAS,CAAC,CAAC,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC,CAAC,IAAI,EACnC,IAAI,CAAC,CAAC,CAAC,cAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAI,CAAC,CAAC,CAAC,QAAQ,IACjE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,QAAQ,EACR,SAAS,GAAG,IAAI,GAKjB;IACC,MAAM,KAAK,GAAG,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAA8B,CAAC;IACpF,OAAO,CACL,eAAK,SAAS,EAAC,QAAQ,EAAC,KAAK,EAAE,KAAK,aACjC,SAAS,CAAC,CAAC,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC,CAAC,IAAI,EACnC,QAAQ,IACL,CACP,CAAC;AACJ,CAAC"}
|
package/dist/operator/proxy.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import 'server-only';
|
|
1
2
|
import { type NextRequest, NextResponse } from 'next/server';
|
|
2
3
|
export declare function proxy(request: NextRequest): Promise<NextResponse>;
|
|
4
|
+
export declare const middleware: typeof proxy;
|
|
3
5
|
export declare const config: {
|
|
4
6
|
matcher: string[];
|
|
5
7
|
};
|
package/dist/operator/proxy.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import 'server-only';
|
|
1
2
|
import { NextResponse } from 'next/server';
|
|
2
3
|
import { IgniteClient } from '../client.js';
|
|
3
4
|
// Well-known AI and search crawler user-agent tokens. Matching is case-insensitive substring; the first match
|
|
@@ -31,34 +32,54 @@ function clientIp(request) {
|
|
|
31
32
|
return forwarded.split(',')[0]?.trim() || undefined;
|
|
32
33
|
return request.headers.get('x-real-ip')?.trim() || undefined;
|
|
33
34
|
}
|
|
34
|
-
// Drop into `proxy.ts`
|
|
35
|
-
//
|
|
36
|
-
//
|
|
35
|
+
// Drop into `proxy.ts` (Next 16) or `middleware.ts` (Next 15):
|
|
36
|
+
// export { proxy, config } from '@ignite-agent/agent/proxy'
|
|
37
|
+
// export { middleware, config } from '@ignite-agent/agent/proxy'
|
|
38
|
+
// Passes every request through untouched. Crawl ingest runs after the response so a slow Hub never stalls a bot.
|
|
37
39
|
export async function proxy(request) {
|
|
38
40
|
const botName = matchedCrawler(request.headers.get('user-agent') ?? '');
|
|
39
41
|
if (botName) {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
};
|
|
52
|
-
try {
|
|
53
|
-
await client.recordCrawlEvents([event]);
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
// best-effort; ignore
|
|
57
|
-
}
|
|
58
|
-
}
|
|
42
|
+
const ip = clientIp(request);
|
|
43
|
+
const userAgent = request.headers.get('user-agent') ?? undefined;
|
|
44
|
+
const event = {
|
|
45
|
+
bot_name: botName,
|
|
46
|
+
path: request.nextUrl.pathname,
|
|
47
|
+
observed_at: new Date().toISOString(),
|
|
48
|
+
method: request.method,
|
|
49
|
+
...(ip ? { ip } : {}),
|
|
50
|
+
...(userAgent ? { user_agent: userAgent } : {}),
|
|
51
|
+
};
|
|
52
|
+
schedule(() => record(event));
|
|
59
53
|
}
|
|
60
54
|
return NextResponse.next();
|
|
61
55
|
}
|
|
56
|
+
export const middleware = proxy;
|
|
57
|
+
function schedule(work) {
|
|
58
|
+
void import('next/server')
|
|
59
|
+
.then((mod) => {
|
|
60
|
+
if (typeof mod.after === 'function') {
|
|
61
|
+
mod.after(() => {
|
|
62
|
+
void work();
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
void work();
|
|
67
|
+
})
|
|
68
|
+
.catch(() => {
|
|
69
|
+
void work();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async function record(event) {
|
|
73
|
+
const client = IgniteClient.fromEnvOrNull();
|
|
74
|
+
if (!client)
|
|
75
|
+
return;
|
|
76
|
+
try {
|
|
77
|
+
await client.recordCrawlEvents([event]);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// best-effort
|
|
81
|
+
}
|
|
82
|
+
}
|
|
62
83
|
// Limit the proxy to page requests; skip static assets.
|
|
63
84
|
export const config = {
|
|
64
85
|
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/operator/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAmB,MAAM,cAAc,CAAC;AAE7D,8GAA8G;AAC9G,gHAAgH;AAChH,wDAAwD;AACxD,MAAM,cAAc,GAAG;IACrB,QAAQ;IACR,eAAe;IACf,cAAc;IACd,WAAW;IACX,YAAY;IACZ,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,SAAS;IACT,UAAU;IACV,WAAW;IACX,oBAAoB;IACpB,YAAY;IACZ,OAAO;CACR,CAAC;AAEF,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;AAClF,CAAC;AAED,SAAS,QAAQ,CAAC,OAAoB;IACpC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACzD,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACnE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AAC/D,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/operator/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/operator/robots.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/operator/robots.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/operator/robots.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAIrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,mFAAmF;AACnF,0GAA0G;AAC1G,wDAAwD;AACxD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM;IAClC,MAAM,QAAQ,GAAyB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FeedPage, SitemapEntry } from '../types.js';
|
|
2
|
+
export type SitemapRow = {
|
|
3
|
+
url: string;
|
|
4
|
+
lastModified?: string;
|
|
5
|
+
changeFrequency?: SitemapEntry['changeFrequency'];
|
|
6
|
+
priority?: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function originFromSitemapUrls(urls: string[]): string | undefined;
|
|
9
|
+
export declare function mergeSitemap(base: SitemapRow[], extra: SitemapRow[]): SitemapRow[];
|
|
10
|
+
export declare function feedPagesToSitemap(pages: FeedPage[], siteUrl?: string | undefined): SitemapRow[];
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { absoluteUrl, publicModifiedAt, resolveSiteUrl } from './ui.js';
|
|
2
|
+
export function originFromSitemapUrls(urls) {
|
|
3
|
+
for (const url of urls) {
|
|
4
|
+
try {
|
|
5
|
+
const parsed = new URL(url);
|
|
6
|
+
if (parsed.protocol === 'http:' || parsed.protocol === 'https:')
|
|
7
|
+
return parsed.origin;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
// skip relative or malformed
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
export function mergeSitemap(base, extra) {
|
|
16
|
+
const map = new Map();
|
|
17
|
+
for (const row of base) {
|
|
18
|
+
if (!row.url)
|
|
19
|
+
continue;
|
|
20
|
+
map.set(row.url, { ...row });
|
|
21
|
+
}
|
|
22
|
+
for (const row of extra) {
|
|
23
|
+
if (!row.url)
|
|
24
|
+
continue;
|
|
25
|
+
const prev = map.get(row.url);
|
|
26
|
+
if (!prev) {
|
|
27
|
+
map.set(row.url, { ...row });
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (!prev.lastModified && row.lastModified) {
|
|
31
|
+
map.set(row.url, { ...prev, lastModified: row.lastModified });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return [...map.values()];
|
|
35
|
+
}
|
|
36
|
+
export function feedPagesToSitemap(pages, siteUrl) {
|
|
37
|
+
const base = resolveSiteUrl(siteUrl);
|
|
38
|
+
if (!base)
|
|
39
|
+
return [];
|
|
40
|
+
const rows = [];
|
|
41
|
+
const kinds = new Set();
|
|
42
|
+
for (const page of pages) {
|
|
43
|
+
kinds.add(page.kind);
|
|
44
|
+
const lastModified = publicModifiedAt(page) ?? undefined;
|
|
45
|
+
rows.push({
|
|
46
|
+
url: absoluteUrl(page.path, base),
|
|
47
|
+
...(lastModified ? { lastModified } : {}),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (kinds.has('wiki'))
|
|
51
|
+
rows.push({ url: absoluteUrl('/w', base) });
|
|
52
|
+
if (kinds.has('article'))
|
|
53
|
+
rows.push({ url: absoluteUrl('/blog', base) });
|
|
54
|
+
return rows;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=sitemap-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap-merge.js","sourceRoot":"","sources":["../../src/operator/sitemap-merge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AASxE,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB,EAAE,KAAmB;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG;YAAE,SAAS;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG;YAAE,SAAS;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YAC3C,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAiB,EAAE,OAA4B;IAChF,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC;YACR,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;YACjC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
+
import 'server-only';
|
|
1
2
|
import type { MetadataRoute } from 'next';
|
|
2
|
-
|
|
3
|
+
import { feedPagesToSitemap, mergeSitemap, originFromSitemapUrls } from './sitemap-merge.js';
|
|
4
|
+
export { mergeSitemap, feedPagesToSitemap, originFromSitemapUrls };
|
|
5
|
+
export declare function igniteSitemap(): Promise<MetadataRoute.Sitemap>;
|
|
6
|
+
export default igniteSitemap;
|