@silicajs/next 0.1.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/README.md +7 -0
- package/dist/auth-config.d.ts +10 -0
- package/dist/auth-config.js +25 -0
- package/dist/auth-config.js.map +1 -0
- package/dist/dev-reload-client.d.ts +3 -0
- package/dist/dev-reload-client.js +19 -0
- package/dist/dev-reload-client.js.map +1 -0
- package/dist/dev-reload.d.ts +6 -0
- package/dist/dev-reload.js +36 -0
- package/dist/dev-reload.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/proxy.d.ts +14 -0
- package/dist/proxy.js +56 -0
- package/dist/proxy.js.map +1 -0
- package/dist/routes/api-auth.d.ts +4 -0
- package/dist/routes/api-auth.js +27 -0
- package/dist/routes/api-auth.js.map +1 -0
- package/dist/routes/api-dev-events.d.ts +3 -0
- package/dist/routes/api-dev-events.js +18 -0
- package/dist/routes/api-dev-events.js.map +1 -0
- package/dist/routes/api-revalidate.d.ts +10 -0
- package/dist/routes/api-revalidate.js +22 -0
- package/dist/routes/api-revalidate.js.map +1 -0
- package/dist/routes/api-search.d.ts +17 -0
- package/dist/routes/api-search.js +53 -0
- package/dist/routes/api-search.js.map +1 -0
- package/dist/routes/layout.d.ts +24 -0
- package/dist/routes/layout.js +48 -0
- package/dist/routes/layout.js.map +1 -0
- package/dist/routes/not-allowed.d.ts +5 -0
- package/dist/routes/not-allowed.js +9 -0
- package/dist/routes/not-allowed.js.map +1 -0
- package/dist/routes/not-found.d.ts +5 -0
- package/dist/routes/not-found.js +9 -0
- package/dist/routes/not-found.js.map +1 -0
- package/dist/routes/page.d.ts +26 -0
- package/dist/routes/page.js +175 -0
- package/dist/routes/page.js.map +1 -0
- package/dist/routes/sign-in.d.ts +5 -0
- package/dist/routes/sign-in.js +31 -0
- package/dist/routes/sign-in.js.map +1 -0
- package/dist/routes/tags-page.d.ts +18 -0
- package/dist/routes/tags-page.js +57 -0
- package/dist/routes/tags-page.js.map +1 -0
- package/dist/routing-provider.d.ts +8 -0
- package/dist/routing-provider.js +40 -0
- package/dist/routing-provider.js.map +1 -0
- package/dist/server-data.d.ts +11 -0
- package/dist/server-data.js +53 -0
- package/dist/server-data.js.map +1 -0
- package/dist/template-files/generated-app/app/[[...slug]]/page.tsx +18 -0
- package/dist/template-files/generated-app/app/api/auth/[...all]/route.ts +1 -0
- package/dist/template-files/generated-app/app/api/search/route.ts +1 -0
- package/dist/template-files/generated-app/app/api/silica/dev-events/route.ts +1 -0
- package/dist/template-files/generated-app/app/api/silica/revalidate/route.ts +1 -0
- package/dist/template-files/generated-app/app/layout.tsx +22 -0
- package/dist/template-files/generated-app/app/not-allowed/page.tsx +1 -0
- package/dist/template-files/generated-app/app/not-found.tsx +1 -0
- package/dist/template-files/generated-app/app/sign-in/page.tsx +1 -0
- package/dist/template-files/generated-app/app/tags/[...tag]/page.tsx +5 -0
- package/dist/template-files/generated-app/postcss.config.mjs +1 -0
- package/dist/template-files/generated-app/proxy.ts +10 -0
- package/dist/template-files/next.config.ts +32 -0
- package/dist/template-files/package.json +15 -0
- package/dist/template-files/silica-theme.ts +7 -0
- package/dist/template-files/tsconfig.json +21 -0
- package/dist/templates.d.ts +14 -0
- package/dist/templates.js +80 -0
- package/dist/templates.js.map +1 -0
- package/dist/theme-layout.d.ts +1 -0
- package/dist/theme-layout.js +6 -0
- package/dist/theme-layout.js.map +1 -0
- package/dist/theme-page.d.ts +3 -0
- package/dist/theme-page.js +11 -0
- package/dist/theme-page.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import { cacheLife, cacheTag } from "next/cache";
|
|
4
|
+
import { notFound } from "next/navigation";
|
|
5
|
+
import {
|
|
6
|
+
renderMarkdown,
|
|
7
|
+
renderMarkdownHtml,
|
|
8
|
+
resolveWikiLink
|
|
9
|
+
} from "@silicajs/core/runtime";
|
|
10
|
+
import { SilicaLink } from "@silicajs/components/routing";
|
|
11
|
+
import {
|
|
12
|
+
loadBuildId,
|
|
13
|
+
loadGraph,
|
|
14
|
+
loadManifest,
|
|
15
|
+
loadResolvedConfig,
|
|
16
|
+
normalizeRouteSlug
|
|
17
|
+
} from "../server-data.js";
|
|
18
|
+
function MarkdownLink({
|
|
19
|
+
href,
|
|
20
|
+
...props
|
|
21
|
+
}) {
|
|
22
|
+
if (href && href.startsWith("/") && !href.startsWith("/silica/")) {
|
|
23
|
+
return /* @__PURE__ */ jsx(SilicaLink, { href, ...props });
|
|
24
|
+
}
|
|
25
|
+
return /* @__PURE__ */ jsx("a", { href, ...props });
|
|
26
|
+
}
|
|
27
|
+
async function generateStaticParams() {
|
|
28
|
+
const manifest = await getPageManifest();
|
|
29
|
+
return manifest.entries.map((entry) => ({
|
|
30
|
+
slug: entry.slug === "index" ? [] : entry.slug.split("/")
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
async function generateMetadata({ params }) {
|
|
34
|
+
const resolvedParams = await params;
|
|
35
|
+
const slug = normalizeRouteSlug(resolvedParams?.slug);
|
|
36
|
+
const manifest = await getPageManifest();
|
|
37
|
+
const entry = manifest.bySlug[slug];
|
|
38
|
+
if (!entry) return {};
|
|
39
|
+
return {
|
|
40
|
+
title: entry.title,
|
|
41
|
+
description: entry.description
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async function getPageManifest() {
|
|
45
|
+
"use cache";
|
|
46
|
+
cacheLife("max");
|
|
47
|
+
const buildId = await loadBuildId();
|
|
48
|
+
cacheTag("build", `build:${buildId}`);
|
|
49
|
+
return loadManifest();
|
|
50
|
+
}
|
|
51
|
+
async function VaultContent({
|
|
52
|
+
slug,
|
|
53
|
+
theme
|
|
54
|
+
}) {
|
|
55
|
+
"use cache";
|
|
56
|
+
cacheLife("max");
|
|
57
|
+
const buildId = await loadBuildId();
|
|
58
|
+
cacheTag("build", `build:${buildId}`, `page:${slug}`);
|
|
59
|
+
const [manifest, graph, config] = await Promise.all([
|
|
60
|
+
loadManifest(),
|
|
61
|
+
loadGraph(),
|
|
62
|
+
loadResolvedConfig()
|
|
63
|
+
]);
|
|
64
|
+
const entry = manifest.bySlug[slug];
|
|
65
|
+
if (!entry) notFound();
|
|
66
|
+
const renderContext = (currentSlug, embedDepth = 0) => ({
|
|
67
|
+
slug: currentSlug,
|
|
68
|
+
allSlugs: manifest.allSlugs,
|
|
69
|
+
assetBaseUrl: "/silica",
|
|
70
|
+
wikilinkStrategy: config.wikilinks.strategy,
|
|
71
|
+
tags: config.tags,
|
|
72
|
+
ordering: config.ordering,
|
|
73
|
+
embedDepth,
|
|
74
|
+
maxEmbedDepth: 3,
|
|
75
|
+
components: {
|
|
76
|
+
...theme.components,
|
|
77
|
+
a: MarkdownLink
|
|
78
|
+
},
|
|
79
|
+
resolveEmbed: async (target) => {
|
|
80
|
+
const resolved = resolveWikiLink(
|
|
81
|
+
currentSlug,
|
|
82
|
+
target.path || currentSlug,
|
|
83
|
+
manifest.allSlugs,
|
|
84
|
+
config.wikilinks.strategy,
|
|
85
|
+
config.ordering
|
|
86
|
+
);
|
|
87
|
+
if (!resolved || embedDepth >= 3) return;
|
|
88
|
+
const embeddedEntry = manifest.bySlug[resolved];
|
|
89
|
+
if (!embeddedEntry) return;
|
|
90
|
+
const embeddedRaw = await fs.readFile(embeddedEntry.file, "utf8");
|
|
91
|
+
const scopedRaw = scopeEmbedMarkdown(embeddedRaw, target);
|
|
92
|
+
return renderMarkdownHtml(
|
|
93
|
+
scopedRaw,
|
|
94
|
+
renderContext(resolved, embedDepth + 1)
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
const raw = await fs.readFile(entry.file, "utf8");
|
|
99
|
+
const rendered = await renderMarkdown(raw, renderContext(slug));
|
|
100
|
+
return /* @__PURE__ */ jsx(
|
|
101
|
+
theme.PageRenderer,
|
|
102
|
+
{
|
|
103
|
+
config,
|
|
104
|
+
graph,
|
|
105
|
+
manifest,
|
|
106
|
+
page: {
|
|
107
|
+
slug,
|
|
108
|
+
title: rendered.title ?? entry.title,
|
|
109
|
+
description: rendered.description ?? entry.description,
|
|
110
|
+
content: rendered.content,
|
|
111
|
+
frontmatter: rendered.frontmatter,
|
|
112
|
+
toc: rendered.toc,
|
|
113
|
+
entry
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
function scopeEmbedMarkdown(raw, target) {
|
|
119
|
+
if (target.blockId) return extractBlock(raw, target.blockId) ?? raw;
|
|
120
|
+
if (target.heading) return extractHeadingSection(raw, target.heading) ?? raw;
|
|
121
|
+
return raw;
|
|
122
|
+
}
|
|
123
|
+
function extractHeadingSection(raw, heading) {
|
|
124
|
+
const lines = raw.split(/\r?\n/);
|
|
125
|
+
const expected = normalizeHeading(heading);
|
|
126
|
+
const start = lines.findIndex((line) => {
|
|
127
|
+
const parsed = parseHeading(line);
|
|
128
|
+
return parsed ? normalizeHeading(parsed.text) === expected : false;
|
|
129
|
+
});
|
|
130
|
+
if (start === -1) return;
|
|
131
|
+
const startHeading = parseHeading(lines[start] ?? "");
|
|
132
|
+
if (!startHeading) return;
|
|
133
|
+
let end = lines.length;
|
|
134
|
+
for (let index = start + 1; index < lines.length; index += 1) {
|
|
135
|
+
const nextHeading = parseHeading(lines[index] ?? "");
|
|
136
|
+
if (nextHeading && nextHeading.depth <= startHeading.depth) {
|
|
137
|
+
end = index;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return lines.slice(start, end).join("\n").trim();
|
|
142
|
+
}
|
|
143
|
+
function extractBlock(raw, blockId) {
|
|
144
|
+
const lines = raw.split(/\r?\n/);
|
|
145
|
+
const blockIdPattern = new RegExp(
|
|
146
|
+
`(^|\\s)\\^${escapeRegExp(blockId)}(?=\\s|$)`
|
|
147
|
+
);
|
|
148
|
+
const matchIndex = lines.findIndex((line) => blockIdPattern.test(line));
|
|
149
|
+
if (matchIndex === -1) return;
|
|
150
|
+
let start = matchIndex;
|
|
151
|
+
while (start > 0 && lines[start - 1]?.trim()) start -= 1;
|
|
152
|
+
let end = matchIndex + 1;
|
|
153
|
+
while (end < lines.length && lines[end]?.trim()) end += 1;
|
|
154
|
+
return lines.slice(start, end).join("\n").replace(blockIdPattern, "").trim();
|
|
155
|
+
}
|
|
156
|
+
function parseHeading(line) {
|
|
157
|
+
const match = /^(#{1,6})\s+(.+?)\s*#*\s*$/.exec(line);
|
|
158
|
+
if (!match) return;
|
|
159
|
+
return {
|
|
160
|
+
depth: match[1].length,
|
|
161
|
+
text: match[2]
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function normalizeHeading(value) {
|
|
165
|
+
return value.trim().replace(/\s+/g, " ").toLowerCase();
|
|
166
|
+
}
|
|
167
|
+
function escapeRegExp(value) {
|
|
168
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
169
|
+
}
|
|
170
|
+
export {
|
|
171
|
+
VaultContent,
|
|
172
|
+
generateMetadata,
|
|
173
|
+
generateStaticParams
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/page.tsx"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport type { AnchorHTMLAttributes } from \"react\";\nimport { cacheLife, cacheTag } from \"next/cache\";\nimport { notFound } from \"next/navigation\";\nimport {\n renderMarkdown,\n renderMarkdownHtml,\n resolveWikiLink,\n type RenderContext,\n} from \"@silicajs/core/runtime\";\nimport { SilicaLink } from \"@silicajs/components/routing\";\nimport {\n loadBuildId,\n loadGraph,\n loadManifest,\n loadResolvedConfig,\n normalizeRouteSlug,\n} from \"../server-data.js\";\nimport type { SilicaTheme } from \"@silicajs/core/theme\";\n\nfunction MarkdownLink({\n href,\n ...props\n}: AnchorHTMLAttributes<HTMLAnchorElement>) {\n if (href && href.startsWith(\"/\") && !href.startsWith(\"/silica/\")) {\n return <SilicaLink href={href} {...props} />;\n }\n\n return <a href={href} {...props} />;\n}\n\nexport async function generateStaticParams() {\n const manifest = await getPageManifest();\n return manifest.entries.map((entry) => ({\n slug: entry.slug === \"index\" ? [] : entry.slug.split(\"/\"),\n }));\n}\n\nexport async function generateMetadata({ params }: PageProps) {\n const resolvedParams = await params;\n const slug = normalizeRouteSlug(resolvedParams?.slug);\n const manifest = await getPageManifest();\n const entry = manifest.bySlug[slug];\n if (!entry) return {};\n return {\n title: entry.title,\n description: entry.description,\n };\n}\n\nasync function getPageManifest() {\n \"use cache\";\n cacheLife(\"max\");\n const buildId = await loadBuildId();\n cacheTag(\"build\", `build:${buildId}`);\n return loadManifest();\n}\n\nexport type PageProps = {\n params: Promise<{ slug?: string[] }> | { slug?: string[] };\n};\n\nexport async function VaultContent({\n slug,\n theme,\n}: {\n slug: string;\n theme: SilicaTheme;\n}) {\n \"use cache\";\n cacheLife(\"max\");\n const buildId = await loadBuildId();\n cacheTag(\"build\", `build:${buildId}`, `page:${slug}`);\n\n const [manifest, graph, config] = await Promise.all([\n loadManifest(),\n loadGraph(),\n loadResolvedConfig(),\n ]);\n const entry = manifest.bySlug[slug];\n if (!entry) notFound();\n\n const renderContext = (\n currentSlug: string,\n embedDepth = 0,\n ): RenderContext => ({\n slug: currentSlug,\n allSlugs: manifest.allSlugs,\n assetBaseUrl: \"/silica\",\n wikilinkStrategy: config.wikilinks.strategy,\n tags: config.tags,\n ordering: config.ordering,\n embedDepth,\n maxEmbedDepth: 3,\n components: {\n ...theme.components,\n a: MarkdownLink,\n },\n resolveEmbed: async (target) => {\n const resolved = resolveWikiLink(\n currentSlug,\n target.path || currentSlug,\n manifest.allSlugs,\n config.wikilinks.strategy,\n config.ordering,\n );\n if (!resolved || embedDepth >= 3) return;\n const embeddedEntry = manifest.bySlug[resolved];\n if (!embeddedEntry) return;\n const embeddedRaw = await fs.readFile(embeddedEntry.file, \"utf8\");\n const scopedRaw = scopeEmbedMarkdown(embeddedRaw, target);\n return renderMarkdownHtml(\n scopedRaw,\n renderContext(resolved, embedDepth + 1),\n );\n },\n });\n\n const raw = await fs.readFile(entry.file, \"utf8\");\n const rendered = await renderMarkdown(raw, renderContext(slug));\n\n return (\n <theme.PageRenderer\n config={config}\n graph={graph}\n manifest={manifest}\n page={{\n slug,\n title: rendered.title ?? entry.title,\n description: rendered.description ?? entry.description,\n content: rendered.content,\n frontmatter: rendered.frontmatter,\n toc: rendered.toc,\n entry,\n }}\n />\n );\n}\n\nfunction scopeEmbedMarkdown(\n raw: string,\n target: Parameters<NonNullable<RenderContext[\"resolveEmbed\"]>>[0],\n): string {\n if (target.blockId) return extractBlock(raw, target.blockId) ?? raw;\n if (target.heading) return extractHeadingSection(raw, target.heading) ?? raw;\n return raw;\n}\n\nfunction extractHeadingSection(\n raw: string,\n heading: string,\n): string | undefined {\n const lines = raw.split(/\\r?\\n/);\n const expected = normalizeHeading(heading);\n const start = lines.findIndex((line) => {\n const parsed = parseHeading(line);\n return parsed ? normalizeHeading(parsed.text) === expected : false;\n });\n if (start === -1) return;\n\n const startHeading = parseHeading(lines[start] ?? \"\");\n if (!startHeading) return;\n let end = lines.length;\n for (let index = start + 1; index < lines.length; index += 1) {\n const nextHeading = parseHeading(lines[index] ?? \"\");\n if (nextHeading && nextHeading.depth <= startHeading.depth) {\n end = index;\n break;\n }\n }\n\n return lines.slice(start, end).join(\"\\n\").trim();\n}\n\nfunction extractBlock(raw: string, blockId: string): string | undefined {\n const lines = raw.split(/\\r?\\n/);\n const blockIdPattern = new RegExp(\n `(^|\\\\s)\\\\^${escapeRegExp(blockId)}(?=\\\\s|$)`,\n );\n const matchIndex = lines.findIndex((line) => blockIdPattern.test(line));\n if (matchIndex === -1) return;\n\n let start = matchIndex;\n while (start > 0 && lines[start - 1]?.trim()) start -= 1;\n\n let end = matchIndex + 1;\n while (end < lines.length && lines[end]?.trim()) end += 1;\n\n return lines.slice(start, end).join(\"\\n\").replace(blockIdPattern, \"\").trim();\n}\n\nfunction parseHeading(\n line: string,\n): { depth: number; text: string } | undefined {\n const match = /^(#{1,6})\\s+(.+?)\\s*#*\\s*$/.exec(line);\n if (!match) return;\n return {\n depth: match[1]!.length,\n text: match[2]!,\n };\n}\n\nfunction normalizeHeading(value: string): string {\n return value.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cacheLife } from "next/cache";
|
|
3
|
+
import { resolveRuntimeAuthConfig } from "../auth-config.js";
|
|
4
|
+
import { loadResolvedConfig } from "../server-data.js";
|
|
5
|
+
async function SignInPage() {
|
|
6
|
+
const config = await getSignInConfig();
|
|
7
|
+
const authEnabled = resolveRuntimeAuthConfig(config).authEnabled;
|
|
8
|
+
return /* @__PURE__ */ jsxs("main", { className: "silica-status-page", children: [
|
|
9
|
+
/* @__PURE__ */ jsx("h1", { children: "Sign in" }),
|
|
10
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
11
|
+
"Use your Google account to access ",
|
|
12
|
+
config.title,
|
|
13
|
+
"."
|
|
14
|
+
] }),
|
|
15
|
+
authEnabled ? /* @__PURE__ */ jsxs("form", { action: "/api/auth/sign-in/social", method: "post", children: [
|
|
16
|
+
/* @__PURE__ */ jsx("input", { type: "hidden", name: "provider", value: "google" }),
|
|
17
|
+
/* @__PURE__ */ jsx("input", { type: "hidden", name: "callbackURL", value: "/" }),
|
|
18
|
+
/* @__PURE__ */ jsx("input", { type: "hidden", name: "errorCallbackURL", value: "/not-allowed" }),
|
|
19
|
+
/* @__PURE__ */ jsx("button", { className: "silica-primary-link", type: "submit", children: "Continue with Google" })
|
|
20
|
+
] }) : /* @__PURE__ */ jsx("p", { children: "Authentication is not enabled for this site." })
|
|
21
|
+
] });
|
|
22
|
+
}
|
|
23
|
+
async function getSignInConfig() {
|
|
24
|
+
"use cache";
|
|
25
|
+
cacheLife("max");
|
|
26
|
+
return loadResolvedConfig();
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
SignInPage as default
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=sign-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/sign-in.tsx"],"sourcesContent":["import { cacheLife } from \"next/cache\";\nimport { resolveRuntimeAuthConfig } from \"../auth-config.js\";\nimport { loadResolvedConfig } from \"../server-data.js\";\n\nexport default async function SignInPage() {\n const config = await getSignInConfig();\n const authEnabled = resolveRuntimeAuthConfig(config).authEnabled;\n return (\n <main className=\"silica-status-page\">\n <h1>Sign in</h1>\n <p>Use your Google account to access {config.title}.</p>\n {authEnabled ? (\n <form action=\"/api/auth/sign-in/social\" method=\"post\">\n <input type=\"hidden\" name=\"provider\" value=\"google\" />\n <input type=\"hidden\" name=\"callbackURL\" value=\"/\" />\n <input type=\"hidden\" name=\"errorCallbackURL\" value=\"/not-allowed\" />\n <button className=\"silica-primary-link\" type=\"submit\">\n Continue with Google\n </button>\n </form>\n ) : (\n <p>Authentication is not enabled for this site.</p>\n )}\n </main>\n );\n}\n\nasync function getSignInConfig() {\n \"use cache\";\n cacheLife(\"max\");\n return loadResolvedConfig();\n}\n"],"mappings":"AASM,cACA,YADA;AATN,SAAS,iBAAiB;AAC1B,SAAS,gCAAgC;AACzC,SAAS,0BAA0B;AAEnC,eAAO,aAAoC;AACzC,QAAM,SAAS,MAAM,gBAAgB;AACrC,QAAM,cAAc,yBAAyB,MAAM,EAAE;AACrD,SACE,qBAAC,UAAK,WAAU,sBACd;AAAA,wBAAC,QAAG,qBAAO;AAAA,IACX,qBAAC,OAAE;AAAA;AAAA,MAAmC,OAAO;AAAA,MAAM;AAAA,OAAC;AAAA,IACnD,cACC,qBAAC,UAAK,QAAO,4BAA2B,QAAO,QAC7C;AAAA,0BAAC,WAAM,MAAK,UAAS,MAAK,YAAW,OAAM,UAAS;AAAA,MACpD,oBAAC,WAAM,MAAK,UAAS,MAAK,eAAc,OAAM,KAAI;AAAA,MAClD,oBAAC,WAAM,MAAK,UAAS,MAAK,oBAAmB,OAAM,gBAAe;AAAA,MAClE,oBAAC,YAAO,WAAU,uBAAsB,MAAK,UAAS,kCAEtD;AAAA,OACF,IAEA,oBAAC,OAAE,0DAA4C;AAAA,KAEnD;AAEJ;AAEA,eAAe,kBAAkB;AAC/B;AACA,YAAU,KAAK;AACf,SAAO,mBAAmB;AAC5B;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
type TagsPageProps = {
|
|
4
|
+
params: Promise<{
|
|
5
|
+
tag: string | string[];
|
|
6
|
+
}> | {
|
|
7
|
+
tag: string | string[];
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
declare function generateStaticParams(): Promise<{
|
|
11
|
+
tag: string[];
|
|
12
|
+
}[]>;
|
|
13
|
+
declare function generateMetadata({ params }: TagsPageProps): Promise<{
|
|
14
|
+
title: string;
|
|
15
|
+
}>;
|
|
16
|
+
declare function TagsPage({ params }: TagsPageProps): Promise<react_jsx_runtime.JSX.Element>;
|
|
17
|
+
|
|
18
|
+
export { type TagsPageProps, TagsPage as default, generateMetadata, generateStaticParams };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cacheLife, cacheTag } from "next/cache";
|
|
3
|
+
import { notFound } from "next/navigation";
|
|
4
|
+
import { TagsList } from "@silicajs/components";
|
|
5
|
+
import { getTagHierarchy, tagMatches } from "@silicajs/remark-obsidian";
|
|
6
|
+
import { loadBuildId, loadManifest } from "../server-data.js";
|
|
7
|
+
const EMPTY_TAG_STATIC_PARAM = "__silica_empty_tags__";
|
|
8
|
+
async function generateStaticParams() {
|
|
9
|
+
const manifest = await getTagsManifest();
|
|
10
|
+
const tags = new Set(
|
|
11
|
+
manifest.entries.filter(isListedEntry).flatMap((entry) => entry.tags.flatMap((tag) => getTagHierarchy(tag)))
|
|
12
|
+
);
|
|
13
|
+
const params = [...tags].map((tag) => ({ tag: tag.split("/") }));
|
|
14
|
+
return params.length > 0 ? params : [{ tag: [EMPTY_TAG_STATIC_PARAM] }];
|
|
15
|
+
}
|
|
16
|
+
async function generateMetadata({ params }) {
|
|
17
|
+
const tag = routeTagToString((await params).tag);
|
|
18
|
+
return {
|
|
19
|
+
title: `#${tag}`
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function TagsPage({ params }) {
|
|
23
|
+
const tag = routeTagToString((await params).tag);
|
|
24
|
+
const manifest = await getTagsManifest();
|
|
25
|
+
if (!manifest.entries.filter(isListedEntry).some((entry) => entry.tags.some((entryTag) => tagMatches(entryTag, tag)))) {
|
|
26
|
+
notFound();
|
|
27
|
+
}
|
|
28
|
+
return /* @__PURE__ */ jsx(
|
|
29
|
+
TagsList,
|
|
30
|
+
{
|
|
31
|
+
manifest: {
|
|
32
|
+
...manifest,
|
|
33
|
+
entries: manifest.entries.filter(isListedEntry)
|
|
34
|
+
},
|
|
35
|
+
tag
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
async function getTagsManifest() {
|
|
40
|
+
"use cache";
|
|
41
|
+
cacheLife("max");
|
|
42
|
+
const buildId = await loadBuildId();
|
|
43
|
+
cacheTag("build", `build:${buildId}`);
|
|
44
|
+
return loadManifest();
|
|
45
|
+
}
|
|
46
|
+
function routeTagToString(tag) {
|
|
47
|
+
return Array.isArray(tag) ? tag.join("/") : tag;
|
|
48
|
+
}
|
|
49
|
+
function isListedEntry(entry) {
|
|
50
|
+
return entry.frontmatter.listed !== false;
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
TagsPage as default,
|
|
54
|
+
generateMetadata,
|
|
55
|
+
generateStaticParams
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=tags-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/tags-page.tsx"],"sourcesContent":["import { cacheLife, cacheTag } from \"next/cache\";\nimport { notFound } from \"next/navigation\";\nimport { TagsList } from \"@silicajs/components\";\nimport { getTagHierarchy, tagMatches } from \"@silicajs/remark-obsidian\";\nimport { loadBuildId, loadManifest } from \"../server-data.js\";\n\nconst EMPTY_TAG_STATIC_PARAM = \"__silica_empty_tags__\";\n\nexport type TagsPageProps = {\n params: Promise<{ tag: string | string[] }> | { tag: string | string[] };\n};\n\nexport async function generateStaticParams() {\n const manifest = await getTagsManifest();\n const tags = new Set(\n manifest.entries\n .filter(isListedEntry)\n .flatMap((entry) => entry.tags.flatMap((tag) => getTagHierarchy(tag))),\n );\n const params = [...tags].map((tag) => ({ tag: tag.split(\"/\") }));\n return params.length > 0 ? params : [{ tag: [EMPTY_TAG_STATIC_PARAM] }];\n}\n\nexport async function generateMetadata({ params }: TagsPageProps) {\n const tag = routeTagToString((await params).tag);\n return {\n title: `#${tag}`,\n };\n}\n\nexport default async function TagsPage({ params }: TagsPageProps) {\n const tag = routeTagToString((await params).tag);\n const manifest = await getTagsManifest();\n if (\n !manifest.entries\n .filter(isListedEntry)\n .some((entry) => entry.tags.some((entryTag) => tagMatches(entryTag, tag)))\n ) {\n notFound();\n }\n return (\n <TagsList\n manifest={{\n ...manifest,\n entries: manifest.entries.filter(isListedEntry),\n }}\n tag={tag}\n />\n );\n}\n\nasync function getTagsManifest() {\n \"use cache\";\n cacheLife(\"max\");\n const buildId = await loadBuildId();\n cacheTag(\"build\", `build:${buildId}`);\n return loadManifest();\n}\n\nfunction routeTagToString(tag: string | string[]): string {\n return Array.isArray(tag) ? tag.join(\"/\") : tag;\n}\n\nfunction isListedEntry(entry: { frontmatter: Record<string, unknown> }) {\n return entry.frontmatter.listed !== false;\n}\n"],"mappings":"AAyCI;AAzCJ,SAAS,WAAW,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,iBAAiB,kBAAkB;AAC5C,SAAS,aAAa,oBAAoB;AAE1C,MAAM,yBAAyB;AAM/B,eAAsB,uBAAuB;AAC3C,QAAM,WAAW,MAAM,gBAAgB;AACvC,QAAM,OAAO,IAAI;AAAA,IACf,SAAS,QACN,OAAO,aAAa,EACpB,QAAQ,CAAC,UAAU,MAAM,KAAK,QAAQ,CAAC,QAAQ,gBAAgB,GAAG,CAAC,CAAC;AAAA,EACzE;AACA,QAAM,SAAS,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,MAAM,GAAG,EAAE,EAAE;AAC/D,SAAO,OAAO,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,CAAC,sBAAsB,EAAE,CAAC;AACxE;AAEA,eAAsB,iBAAiB,EAAE,OAAO,GAAkB;AAChE,QAAM,MAAM,kBAAkB,MAAM,QAAQ,GAAG;AAC/C,SAAO;AAAA,IACL,OAAO,IAAI,GAAG;AAAA,EAChB;AACF;AAEA,eAAO,SAAgC,EAAE,OAAO,GAAkB;AAChE,QAAM,MAAM,kBAAkB,MAAM,QAAQ,GAAG;AAC/C,QAAM,WAAW,MAAM,gBAAgB;AACvC,MACE,CAAC,SAAS,QACP,OAAO,aAAa,EACpB,KAAK,CAAC,UAAU,MAAM,KAAK,KAAK,CAAC,aAAa,WAAW,UAAU,GAAG,CAAC,CAAC,GAC3E;AACA,aAAS;AAAA,EACX;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU;AAAA,QACR,GAAG;AAAA,QACH,SAAS,SAAS,QAAQ,OAAO,aAAa;AAAA,MAChD;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;AAEA,eAAe,kBAAkB;AAC/B;AACA,YAAU,KAAK;AACf,QAAM,UAAU,MAAM,YAAY;AAClC,WAAS,SAAS,SAAS,OAAO,EAAE;AACpC,SAAO,aAAa;AACtB;AAEA,SAAS,iBAAiB,KAAgC;AACxD,SAAO,MAAM,QAAQ,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI;AAC9C;AAEA,SAAS,cAAc,OAAiD;AACtE,SAAO,MAAM,YAAY,WAAW;AACtC;","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import Link from "next/link.js";
|
|
5
|
+
import { usePathname, useRouter } from "next/navigation.js";
|
|
6
|
+
import {
|
|
7
|
+
SilicaRoutingProvider
|
|
8
|
+
} from "@silicajs/components/routing";
|
|
9
|
+
const NextSilicaLink = React.forwardRef(function NextSilicaLink2(props, ref) {
|
|
10
|
+
return /* @__PURE__ */ jsx(Link, { ref, ...props });
|
|
11
|
+
});
|
|
12
|
+
function SilicaNextRoutingProvider({
|
|
13
|
+
children
|
|
14
|
+
}) {
|
|
15
|
+
const pathname = usePathname();
|
|
16
|
+
const router = useRouter();
|
|
17
|
+
const navigate = React.useCallback(
|
|
18
|
+
(href) => {
|
|
19
|
+
router.push(href);
|
|
20
|
+
},
|
|
21
|
+
[router]
|
|
22
|
+
);
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
24
|
+
SilicaRoutingProvider,
|
|
25
|
+
{
|
|
26
|
+
Link: NextSilicaLink,
|
|
27
|
+
currentSlug: pathnameToSlug(pathname),
|
|
28
|
+
navigate,
|
|
29
|
+
children
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
function pathnameToSlug(pathname) {
|
|
34
|
+
if (!pathname || pathname === "/") return "index";
|
|
35
|
+
return pathname.replace(/^\/+|\/+$/g, "") || "index";
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
SilicaNextRoutingProvider
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=routing-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/routing-provider.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link.js\";\nimport { usePathname, useRouter } from \"next/navigation.js\";\nimport {\n SilicaRoutingProvider,\n type SilicaLinkProps,\n type SilicaLinkComponent,\n} from \"@silicajs/components/routing\";\n\nconst NextSilicaLink: SilicaLinkComponent = React.forwardRef<\n HTMLAnchorElement,\n SilicaLinkProps\n>(function NextSilicaLink(props, ref) {\n return <Link ref={ref} {...props} />;\n});\n\nexport function SilicaNextRoutingProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const pathname = usePathname();\n const router = useRouter();\n const navigate = React.useCallback(\n (href: string) => {\n router.push(href);\n },\n [router],\n );\n\n return (\n <SilicaRoutingProvider\n Link={NextSilicaLink}\n currentSlug={pathnameToSlug(pathname)}\n navigate={navigate}\n >\n {children}\n </SilicaRoutingProvider>\n );\n}\n\nfunction pathnameToSlug(pathname: string | null): string {\n if (!pathname || pathname === \"/\") return \"index\";\n return pathname.replace(/^\\/+|\\/+$/g, \"\") || \"index\";\n}\n"],"mappings":";AAeS;AAbT,YAAY,WAAW;AACvB,OAAO,UAAU;AACjB,SAAS,aAAa,iBAAiB;AACvC;AAAA,EACE;AAAA,OAGK;AAEP,MAAM,iBAAsC,MAAM,WAGhD,SAASA,gBAAe,OAAO,KAAK;AACpC,SAAO,oBAAC,QAAK,KAAW,GAAG,OAAO;AACpC,CAAC;AAEM,SAAS,0BAA0B;AAAA,EACxC;AACF,GAEG;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,MAAM;AAAA,IACrB,CAAC,SAAiB;AAChB,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,aAAa,eAAe,QAAQ;AAAA,MACpC;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,eAAe,UAAiC;AACvD,MAAI,CAAC,YAAY,aAAa,IAAK,QAAO;AAC1C,SAAO,SAAS,QAAQ,cAAc,EAAE,KAAK;AAC/C;","names":["NextSilicaLink"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Graph, Manifest, ResolvedSilicaConfig } from '@silicajs/core/runtime';
|
|
2
|
+
|
|
3
|
+
declare function getProjectRoot(): string;
|
|
4
|
+
declare function getSilicaRoot(): string;
|
|
5
|
+
declare function loadManifest(): Promise<Manifest>;
|
|
6
|
+
declare function loadGraph(): Promise<Graph>;
|
|
7
|
+
declare function loadBuildId(): Promise<string>;
|
|
8
|
+
declare function loadResolvedConfig(): Promise<ResolvedSilicaConfig>;
|
|
9
|
+
declare function normalizeRouteSlug(slug?: string[]): string;
|
|
10
|
+
|
|
11
|
+
export { getProjectRoot, getSilicaRoot, loadBuildId, loadGraph, loadManifest, loadResolvedConfig, normalizeRouteSlug };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
function getProjectRoot() {
|
|
4
|
+
const projectRoot = process.env.SILICA_PROJECT_ROOT;
|
|
5
|
+
if (!projectRoot) {
|
|
6
|
+
throw new Error("SILICA_PROJECT_ROOT must be set by the Silica CLI.");
|
|
7
|
+
}
|
|
8
|
+
return projectRoot;
|
|
9
|
+
}
|
|
10
|
+
function getSilicaRoot() {
|
|
11
|
+
return path.join(getProjectRoot(), ".silica");
|
|
12
|
+
}
|
|
13
|
+
async function loadManifest() {
|
|
14
|
+
const manifest = await fs.readJson(
|
|
15
|
+
path.join(getSilicaRoot(), "manifest.json")
|
|
16
|
+
);
|
|
17
|
+
const entries = manifest.entries.map((entry) => ({
|
|
18
|
+
...entry,
|
|
19
|
+
file: path.isAbsolute(entry.file) ? entry.file : path.join(getProjectRoot(), entry.file)
|
|
20
|
+
}));
|
|
21
|
+
return {
|
|
22
|
+
...manifest,
|
|
23
|
+
entries,
|
|
24
|
+
allSlugs: manifest.allSlugs ?? entries.map((entry) => entry.slug),
|
|
25
|
+
bySlug: manifest.bySlug ?? Object.fromEntries(entries.map((entry) => [entry.slug, entry]))
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async function loadGraph() {
|
|
29
|
+
return fs.readJson(
|
|
30
|
+
path.join(getSilicaRoot(), "graph.json")
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
async function loadBuildId() {
|
|
34
|
+
return (await fs.readFile(path.join(getSilicaRoot(), "build-id.txt"), "utf8")).trim();
|
|
35
|
+
}
|
|
36
|
+
async function loadResolvedConfig() {
|
|
37
|
+
return fs.readJson(
|
|
38
|
+
path.join(getSilicaRoot(), "config.json")
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function normalizeRouteSlug(slug) {
|
|
42
|
+
return slug?.length ? slug.join("/") : "index";
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
getProjectRoot,
|
|
46
|
+
getSilicaRoot,
|
|
47
|
+
loadBuildId,
|
|
48
|
+
loadGraph,
|
|
49
|
+
loadManifest,
|
|
50
|
+
loadResolvedConfig,
|
|
51
|
+
normalizeRouteSlug
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=server-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server-data.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport type {\n Graph,\n Manifest,\n ResolvedSilicaConfig,\n} from \"@silicajs/core/runtime\";\n\nexport function getProjectRoot(): string {\n const projectRoot = process.env.SILICA_PROJECT_ROOT;\n if (!projectRoot) {\n throw new Error(\"SILICA_PROJECT_ROOT must be set by the Silica CLI.\");\n }\n\n return projectRoot;\n}\n\nexport function getSilicaRoot(): string {\n return path.join(getProjectRoot(), \".silica\");\n}\n\nexport async function loadManifest(): Promise<Manifest> {\n const manifest = (await fs.readJson(\n path.join(getSilicaRoot(), \"manifest.json\"),\n )) as Omit<Manifest, \"allSlugs\" | \"bySlug\"> &\n Partial<Pick<Manifest, \"allSlugs\" | \"bySlug\">>;\n const entries = manifest.entries.map((entry) => ({\n ...entry,\n file: path.isAbsolute(entry.file)\n ? entry.file\n : path.join(getProjectRoot(), entry.file),\n }));\n return {\n ...manifest,\n entries,\n allSlugs: manifest.allSlugs ?? entries.map((entry) => entry.slug),\n bySlug:\n manifest.bySlug ??\n Object.fromEntries(entries.map((entry) => [entry.slug, entry])),\n };\n}\n\nexport async function loadGraph(): Promise<Graph> {\n return fs.readJson(\n path.join(getSilicaRoot(), \"graph.json\"),\n ) as Promise<Graph>;\n}\n\nexport async function loadBuildId(): Promise<string> {\n return (\n await fs.readFile(path.join(getSilicaRoot(), \"build-id.txt\"), \"utf8\")\n ).trim();\n}\n\nexport async function loadResolvedConfig() {\n return fs.readJson(\n path.join(getSilicaRoot(), \"config.json\"),\n ) as Promise<ResolvedSilicaConfig>;\n}\n\nexport function normalizeRouteSlug(slug?: string[]): string {\n return slug?.length ? slug.join(\"/\") : \"index\";\n}\n"],"mappings":"AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAOR,SAAS,iBAAyB;AACvC,QAAM,cAAc,QAAQ,IAAI;AAChC,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,SAAO;AACT;AAEO,SAAS,gBAAwB;AACtC,SAAO,KAAK,KAAK,eAAe,GAAG,SAAS;AAC9C;AAEA,eAAsB,eAAkC;AACtD,QAAM,WAAY,MAAM,GAAG;AAAA,IACzB,KAAK,KAAK,cAAc,GAAG,eAAe;AAAA,EAC5C;AAEA,QAAM,UAAU,SAAS,QAAQ,IAAI,CAAC,WAAW;AAAA,IAC/C,GAAG;AAAA,IACH,MAAM,KAAK,WAAW,MAAM,IAAI,IAC5B,MAAM,OACN,KAAK,KAAK,eAAe,GAAG,MAAM,IAAI;AAAA,EAC5C,EAAE;AACF,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,UAAU,SAAS,YAAY,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,IAChE,QACE,SAAS,UACT,OAAO,YAAY,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,EAClE;AACF;AAEA,eAAsB,YAA4B;AAChD,SAAO,GAAG;AAAA,IACR,KAAK,KAAK,cAAc,GAAG,YAAY;AAAA,EACzC;AACF;AAEA,eAAsB,cAA+B;AACnD,UACE,MAAM,GAAG,SAAS,KAAK,KAAK,cAAc,GAAG,cAAc,GAAG,MAAM,GACpE,KAAK;AACT;AAEA,eAAsB,qBAAqB;AACzC,SAAO,GAAG;AAAA,IACR,KAAK,KAAK,cAAc,GAAG,aAAa;AAAA,EAC1C;AACF;AAEO,SAAS,mBAAmB,MAAyB;AAC1D,SAAO,MAAM,SAAS,KAAK,KAAK,GAAG,IAAI;AACzC;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import theme from "../../silica-theme";
|
|
2
|
+
import { VaultContent } from "@silicajs/next/routes/page";
|
|
3
|
+
export {
|
|
4
|
+
generateMetadata,
|
|
5
|
+
generateStaticParams,
|
|
6
|
+
} from "@silicajs/next/routes/page";
|
|
7
|
+
|
|
8
|
+
export default async function Page({
|
|
9
|
+
params,
|
|
10
|
+
}: {
|
|
11
|
+
params: Promise<{ slug?: string[] }> | { slug?: string[] };
|
|
12
|
+
}) {
|
|
13
|
+
const resolvedParams = await params;
|
|
14
|
+
const slug = resolvedParams?.slug?.length
|
|
15
|
+
? resolvedParams.slug.join("/")
|
|
16
|
+
: "index";
|
|
17
|
+
return <VaultContent slug={slug} theme={theme} />;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { GET, POST } from "@silicajs/next/routes/api-auth";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { GET } from "@silicajs/next/routes/api-search";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { GET } from "@silicajs/next/routes/api-dev-events";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { POST } from "@silicajs/next/routes/api-revalidate";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "katex/dist/katex.min.css";
|
|
2
|
+
import "@silicajs/theme-amethyst/styles.css";
|
|
3
|
+
import type { ReactNode } from "react";
|
|
4
|
+
import { SilicaDevReload } from "@silicajs/next/dev-reload-client";
|
|
5
|
+
import theme from "../silica-theme";
|
|
6
|
+
import { getLayoutProps } from "@silicajs/next/routes/layout";
|
|
7
|
+
import { SilicaNextRoutingProvider } from "@silicajs/next/routing-provider";
|
|
8
|
+
export { generateMetadata } from "@silicajs/next/routes/layout";
|
|
9
|
+
|
|
10
|
+
export default async function RootLayout({
|
|
11
|
+
children,
|
|
12
|
+
}: {
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
}) {
|
|
15
|
+
const props = await getLayoutProps();
|
|
16
|
+
return (
|
|
17
|
+
<theme.Layout {...props} Provider={SilicaNextRoutingProvider}>
|
|
18
|
+
<SilicaDevReload />
|
|
19
|
+
{children}
|
|
20
|
+
</theme.Layout>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "@silicajs/next/routes/not-allowed";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "@silicajs/next/routes/not-found";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "@silicajs/next/routes/sign-in";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "@silicajs/ui/postcss.config";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NextRequest } from "next/server";
|
|
2
|
+
import { silicaProxy } from "@silicajs/next/proxy";
|
|
3
|
+
|
|
4
|
+
export function proxy(request: NextRequest) {
|
|
5
|
+
return silicaProxy(request);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const config = {
|
|
9
|
+
matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
|
|
10
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { NextConfig } from "next";
|
|
2
|
+
|
|
3
|
+
const nextConfig: NextConfig = {
|
|
4
|
+
cacheComponents: true,
|
|
5
|
+
output: "standalone",
|
|
6
|
+
transpilePackages: [
|
|
7
|
+
"@silicajs/core",
|
|
8
|
+
"@silicajs/next",
|
|
9
|
+
"@silicajs/auth",
|
|
10
|
+
"@silicajs/search",
|
|
11
|
+
"@silicajs/components",
|
|
12
|
+
"@silicajs/ui",
|
|
13
|
+
"@silicajs/theme-amethyst",
|
|
14
|
+
],
|
|
15
|
+
serverExternalPackages: ["flexsearch"],
|
|
16
|
+
outputFileTracingIncludes: {
|
|
17
|
+
"/*": [
|
|
18
|
+
"../content/**/*",
|
|
19
|
+
"../manifest.json",
|
|
20
|
+
"../graph.json",
|
|
21
|
+
"../config.json",
|
|
22
|
+
"../search-index.json",
|
|
23
|
+
"../build-id.txt",
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
experimental: {
|
|
27
|
+
externalDir: true,
|
|
28
|
+
serverSourceMaps: process.env.NODE_ENV !== "production",
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default nextConfig;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"private": true,
|
|
3
|
+
"name": ".silica-next",
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "next dev",
|
|
8
|
+
"build": "next build",
|
|
9
|
+
"start": "next start"
|
|
10
|
+
},
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"@tailwindcss/postcss": "^4.1.18",
|
|
13
|
+
"tailwindcss": "^4.1.18"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "{{extends}}",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"target": "ES2022",
|
|
5
|
+
"lib": ["dom", "dom.iterable", "es2022"],
|
|
6
|
+
"allowJs": true,
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"strict": true,
|
|
9
|
+
"noEmit": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"module": "esnext",
|
|
12
|
+
"moduleResolution": "bundler",
|
|
13
|
+
"resolveJsonModule": true,
|
|
14
|
+
"isolatedModules": true,
|
|
15
|
+
"jsx": "preserve",
|
|
16
|
+
"incremental": true,
|
|
17
|
+
"plugins": [{ "name": "next" }]
|
|
18
|
+
},
|
|
19
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
20
|
+
"exclude": ["node_modules"]
|
|
21
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ResolvedSilicaConfig } from '@silicajs/core/runtime';
|
|
2
|
+
|
|
3
|
+
type TemplateFile = {
|
|
4
|
+
path: string;
|
|
5
|
+
content: string;
|
|
6
|
+
};
|
|
7
|
+
declare function getSilicaTemplates(): TemplateFile[];
|
|
8
|
+
declare function nextConfigTemplate(): string;
|
|
9
|
+
declare function themeModuleTemplate(themeValue: unknown): string;
|
|
10
|
+
declare function proxyTemplate(config: ResolvedSilicaConfig): string;
|
|
11
|
+
declare function tsconfigTemplate(hasUserTsconfig: boolean): string;
|
|
12
|
+
declare function packageJsonTemplate(): string;
|
|
13
|
+
|
|
14
|
+
export { type TemplateFile, getSilicaTemplates, nextConfigTemplate, packageJsonTemplate, proxyTemplate, themeModuleTemplate, tsconfigTemplate };
|