177 lines
10 KiB
Plaintext
177 lines
10 KiB
Plaintext
page wrnexuscontent {
|
|
seo {
|
|
title = "@wrnexus/content"
|
|
description = "Content collections, validation, querying, and publishing workflows."
|
|
}
|
|
|
|
view {
|
|
<div class="docs-shell">
|
|
<a href="#main" class="skip-link">Skip to content</a>
|
|
<header class="topbar">
|
|
<a class="brand" href="/"><span>W</span> WRNexusJS</a>
|
|
<nav aria-label="Primary"><a href="/getting-started">Get started</a><a href="/packages">Packages</a><a href="https://component.wrnexusjs.dev/">Components</a><a href="/language">Language</a><a href="/architecture">Architecture</a></nav>
|
|
<div class="topbar-actions"><a class="preview-pill" href="/access">Private preview · v0.8.5</a><button data-wire-theme-toggle class="theme-button" aria-label="Toggle color theme" title="Toggle color theme">◐</button></div>
|
|
</header>
|
|
<div class="mobile-doc-nav"><details><summary>Browse documentation</summary><nav><a href="/getting-started">Get started</a><a href="/packages">Packages</a><a href="https://component.wrnexusjs.dev/">Components</a><a href="/language">Language</a><a href="/architecture">Architecture</a><a href="/tutorial">Tutorial</a><a href="/guides/project-structure">Guides</a><a href="/examples">Examples</a><a href="/search">Search</a></nav></details></div>
|
|
<main class="portal-main docs-layout">
|
|
<article id="main" class="documentation prose standalone package-document"><nav class="breadcrumbs" aria-label="Breadcrumb"><a href="/">Home</a><span>/</span><a href="/packages">Packages</a><span>/</span><span aria-current="page">@wrnexus/content</span></nav><section class="doc-intro"><span class="eyebrow">Data · Package reference</span><h1>@wrnexus/content</h1><p>Content collections, validation, querying, and publishing workflows.</p><div class="doc-meta"><span>v0.8.5</span><span>Private registry</span><span>Data</span></div><section id="access" class="access-callout"><h2>Install the package</h2><p>After WorkRoot approves private registry access, install the release-aligned package:</p><pre><code>bun add @wrnexus/content@0.8.5</code><button type="button" class="copy-button" aria-label="Copy installation command">Copy</button></pre><p><a href="/access">Request preview access</a>. Never put registry tokens in source control.</p></section></section><section id="guide"><p>Typed content collections for Markdown/MDX-like documents and remote CMS records. Collections validate frontmatter through any <code>{ parse(input) }</code> schema, render escaped HTML, and expose draft preview, versions, references, headings, search indexes, pagination, RSS and sitemaps.</p>
|
|
<pre data-language="ts"><code>const posts = defineCollection({
|
|
name: "posts",
|
|
schema: PostSchema,
|
|
loader: localContentLoader("content/posts"),
|
|
previewToken: process.env.CONTENT_PREVIEW_TOKEN,
|
|
});
|
|
|
|
const published = await posts.load();
|
|
const preview = await posts.load({ previewToken: request.headers.get("x-preview-token") ?? "" });</code></pre>
|
|
<p>Remote systems implement <code>CmsAdapter</code>, use <code>cmsContentLoader</code>, or return JSON records through <code>remoteContentLoader</code>. Markdown HTML is escaped by default; raw executable HTML is never trusted.</p></section><section id="api" class="api"><h2>Complete TypeScript API</h2><p>Generated from the exact installed package declarations.</p><pre data-language="typescript"><code>type MdxComponent = (props: Record<string, string>, children: string) => string;
|
|
/** Execute explicitly registered MDX components without evaluating arbitrary JavaScript. */
|
|
declare function renderMdxComponents(source: string, components: Record<string, MdxComponent>): string;
|
|
interface SyntaxLanguageBundle {
|
|
highlight(source: string): string;
|
|
}
|
|
declare function createIncrementalHighlighter(loaders: Record<string, () => SyntaxLanguageBundle | Promise<SyntaxLanguageBundle>>): {
|
|
languages: () => string[];
|
|
highlight(language: string, source: string): Promise<string>;
|
|
render(html: string): Promise<string>;
|
|
};
|
|
interface VendorAdapterOptions {
|
|
fetch?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
token?: string;
|
|
map?: (entry: any) => {
|
|
id: string;
|
|
content: string;
|
|
source?: string;
|
|
};
|
|
}
|
|
declare function contentfulAdapter(space: string, environment?: string, options?: VendorAdapterOptions): {
|
|
list(collection: string): Promise<any>;
|
|
};
|
|
declare function sanityAdapter(project: string, dataset: string, options?: VendorAdapterOptions & {
|
|
apiVersion?: string;
|
|
}): {
|
|
list(collection: string): Promise<any>;
|
|
};
|
|
declare function strapiAdapter(baseUrl: string, options?: VendorAdapterOptions): {
|
|
list(collection: string): Promise<any>;
|
|
};
|
|
|
|
interface ContentSchema<T> {
|
|
parse(input: unknown): T;
|
|
}
|
|
interface ContentEntry<T = Record<string, unknown>> {
|
|
id: string;
|
|
slug: string;
|
|
collection: string;
|
|
data: T;
|
|
body: string;
|
|
html: string;
|
|
excerpt: string;
|
|
headings: ContentHeading[];
|
|
draft: boolean;
|
|
version?: string;
|
|
source: string;
|
|
}
|
|
interface ContentHeading {
|
|
depth: number;
|
|
text: string;
|
|
slug: string;
|
|
}
|
|
interface ContentLoaderResult {
|
|
id: string;
|
|
source: string;
|
|
content: string;
|
|
}
|
|
interface ContentLoader {
|
|
load(): ContentLoaderResult[] | Promise<ContentLoaderResult[]>;
|
|
}
|
|
interface ContentCollectionOptions<T> {
|
|
name: string;
|
|
schema: ContentSchema<T>;
|
|
loader: ContentLoader;
|
|
includeDrafts?: boolean;
|
|
previewToken?: string;
|
|
references?: Record<string, ContentCollection<unknown>>;
|
|
}
|
|
interface ContentCollection<T> {
|
|
name: string;
|
|
load(options?: {
|
|
drafts?: boolean;
|
|
previewToken?: string;
|
|
version?: string;
|
|
}): Promise<ContentEntry<T>[]>;
|
|
get(id: string, options?: {
|
|
drafts?: boolean;
|
|
previewToken?: string;
|
|
version?: string;
|
|
}): Promise<ContentEntry<T> | null>;
|
|
}
|
|
declare function parseFrontmatter(source: string): {
|
|
data: Record<string, unknown>;
|
|
body: string;
|
|
};
|
|
declare function renderMarkdown(source: string): {
|
|
html: string;
|
|
headings: ContentHeading[];
|
|
excerpt: string;
|
|
};
|
|
declare function localContentLoader(directory: string): ContentLoader;
|
|
declare function remoteContentLoader(url: string, options?: {
|
|
fetch?: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
headers?: HeadersInit;
|
|
}): ContentLoader;
|
|
declare function defineCollection<T>(options: ContentCollectionOptions<T>): ContentCollection<T>;
|
|
declare function resolveContentReference(collections: Record<string, ContentCollection<unknown>>, reference: string): Promise<ContentEntry<unknown> | null>;
|
|
declare function paginateContent<T>(entries: T[], page?: number, pageSize?: number): {
|
|
items: T[];
|
|
page: number;
|
|
pageSize: number;
|
|
total: number;
|
|
totalPages: number;
|
|
hasNext: boolean;
|
|
hasPrevious: boolean;
|
|
};
|
|
declare function createSearchIndex(entries: ContentEntry[]): {
|
|
id: string;
|
|
slug: string;
|
|
title: string;
|
|
text: string;
|
|
}[];
|
|
declare function searchContent(index: ReturnType<typeof createSearchIndex>, query: string): {
|
|
id: string;
|
|
slug: string;
|
|
title: string;
|
|
text: string;
|
|
}[];
|
|
declare function contentSitemap(entries: ContentEntry[], baseUrl: string): string;
|
|
declare function contentRss(entries: ContentEntry[], options: {
|
|
title: string;
|
|
baseUrl: string;
|
|
description?: string;
|
|
}): string;
|
|
interface CmsAdapter {
|
|
list(collection: string): Promise<Array<{
|
|
id: string;
|
|
content: string;
|
|
source?: string;
|
|
}>>;
|
|
}
|
|
declare function cmsContentLoader(adapter: CmsAdapter, collection: string): ContentLoader;
|
|
|
|
export { type CmsAdapter, type ContentCollection, type ContentCollectionOptions, type ContentEntry, type ContentHeading, type ContentLoader, type ContentLoaderResult, type ContentSchema, type MdxComponent, type SyntaxLanguageBundle, type VendorAdapterOptions, cmsContentLoader, contentRss, contentSitemap, contentfulAdapter, createIncrementalHighlighter, createSearchIndex, defineCollection, localContentLoader, paginateContent, parseFrontmatter, remoteContentLoader, renderMarkdown, renderMdxComponents, resolveContentReference, sanityAdapter, searchContent, strapiAdapter };
|
|
</code></pre></section><section id="examples" class="examples"><h2>Examples</h2><p>Copy-ready examples from the installed package documentation.</p><div class="example-grid"><article class="example-card"><h3>preview, versions, references, headings, search indexes, pagination, RSS and sitemaps.</h3><pre data-language="ts"><code>const posts = defineCollection({
|
|
name: "posts",
|
|
schema: PostSchema,
|
|
loader: localContentLoader("content/posts"),
|
|
previewToken: process.env.CONTENT_PREVIEW_TOKEN,
|
|
});
|
|
|
|
const published = await posts.load();
|
|
const preview = await posts.load({ previewToken: request.headers.get("x-preview-token") ?? "" });</code></pre></article><article class="example-card"><h3>Install @wrnexus/content</h3><pre data-language="sh"><code>bun add @wrnexus/content</code></pre></article></div></section></article>
|
|
<aside class="on-this-page"><h2>On this page</h2><nav><a class="toc-level-2" href="#guide">Guide</a><a class="toc-level-2" href="#api">Complete API</a><a class="toc-level-2" href="#examples">Examples</a></nav></aside>
|
|
</main>
|
|
<footer><div class="footer-brand"><span class="footer-mark" aria-hidden="true">W</span><p><strong>WRNexusJS 0.8.5</strong><span>Complete API documentation generated from installed package declarations.</span></p></div><nav aria-label="Footer"><a href="/packages">All packages</a><a href="/getting-started">Get started</a><a href="/security">Security</a><a href="/support">Support</a><a href="/llms.txt">AI guide</a></nav><p class="footer-meta">Private Developer Preview · Bun-native</p></footer>
|
|
</div>
|
|
}
|
|
}
|