@unterberg/nivel 0.1.11 → 0.1.13
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 +5 -13
- package/dist/SearchModal-YJZFUB53.js +335 -0
- package/dist/SearchModal-YJZFUB53.js.map +1 -0
- package/dist/{chunk-GT62XN7K.js → chunk-DCHQC4WP.js} +13 -22
- package/dist/chunk-DCHQC4WP.js.map +1 -0
- package/dist/chunk-ESAHWFDZ.js +196 -0
- package/dist/chunk-ESAHWFDZ.js.map +1 -0
- package/dist/{chunk-6Q5XESPG.js → chunk-OUDSISNU.js} +3 -3
- package/dist/{chunk-HQHLPFGA.js → chunk-PKXDOKJY.js} +5 -3
- package/dist/{chunk-HQHLPFGA.js.map → chunk-PKXDOKJY.js.map} +1 -1
- package/dist/chunk-PYYPYIBD.js +49 -0
- package/dist/chunk-PYYPYIBD.js.map +1 -0
- package/dist/{chunk-NDJ5LYLK.js → chunk-QWIYQPCW.js} +6 -45
- package/dist/chunk-QWIYQPCW.js.map +1 -0
- package/dist/{chunk-6TXPHBIC.js → chunk-SH5XWPXW.js} +353 -757
- package/dist/chunk-SH5XWPXW.js.map +1 -0
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +8 -5
- package/dist/config.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -2
- package/dist/mdx.js +3 -2
- package/dist/mdx.js.map +1 -1
- package/dist/runtime/client.d.ts +1 -1
- package/dist/runtime/client.js +8 -5
- package/dist/runtime/node.d.ts +1 -1
- package/dist/runtime/node.js +4 -3
- package/dist/{types-BGAec0JI.d.ts → types-IiJ1jLWc.d.ts} +1 -0
- package/dist/vike.d.ts +1 -1
- package/dist/vike.js +249 -4
- package/dist/vike.js.map +1 -1
- package/package.json +6 -7
- package/dist/chunk-6TXPHBIC.js.map +0 -1
- package/dist/chunk-GT62XN7K.js.map +0 -1
- package/dist/chunk-NDJ5LYLK.js.map +0 -1
- /package/dist/{chunk-6Q5XESPG.js.map → chunk-OUDSISNU.js.map} +0 -0
package/dist/vike.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
nivelPagesPlugin
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import
|
|
3
|
+
} from "./chunk-OUDSISNU.js";
|
|
4
|
+
import {
|
|
5
|
+
loadDocsConfig
|
|
6
|
+
} from "./chunk-DCHQC4WP.js";
|
|
5
7
|
import {
|
|
6
8
|
createHeadingSlugger,
|
|
7
9
|
normalizeHeadingTitle
|
|
8
10
|
} from "./chunk-SOVTSE5J.js";
|
|
9
|
-
import
|
|
11
|
+
import {
|
|
12
|
+
resolveDocsConfig
|
|
13
|
+
} from "./chunk-QWIYQPCW.js";
|
|
14
|
+
import "./chunk-PYYPYIBD.js";
|
|
10
15
|
import {
|
|
11
16
|
getCodeBlockMdxPlugins
|
|
12
17
|
} from "./chunk-U332EPCL.js";
|
|
@@ -112,6 +117,239 @@ var rehypeDocsHeadings = () => {
|
|
|
112
117
|
};
|
|
113
118
|
};
|
|
114
119
|
|
|
120
|
+
// src/vike/sitemap.ts
|
|
121
|
+
import fs from "fs";
|
|
122
|
+
import path from "path";
|
|
123
|
+
var GENERATED_DIRNAME = "(nivel-generated)";
|
|
124
|
+
var SITEMAP_FILENAME = "sitemap.xml";
|
|
125
|
+
var ROBOTS_FILENAME = "robots.txt";
|
|
126
|
+
var normalizeRoutePath = (value) => {
|
|
127
|
+
const normalized = value.trim().replace(/^\/+|\/+$/g, "");
|
|
128
|
+
return normalized ? `/${normalized}/` : "/";
|
|
129
|
+
};
|
|
130
|
+
var normalizeSiteUrl = (value) => {
|
|
131
|
+
const normalized = value.trim();
|
|
132
|
+
if (!normalized) {
|
|
133
|
+
throw new Error("Docs siteUrl must be a non-empty absolute URL when sitemap support is enabled.");
|
|
134
|
+
}
|
|
135
|
+
const url = new URL(normalized);
|
|
136
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
137
|
+
throw new Error(`Docs siteUrl must use http or https. Received ${JSON.stringify(value)}.`);
|
|
138
|
+
}
|
|
139
|
+
if (url.search || url.hash) {
|
|
140
|
+
throw new Error(`Docs siteUrl cannot include query strings or hashes. Received ${JSON.stringify(value)}.`);
|
|
141
|
+
}
|
|
142
|
+
const pathname = url.pathname.replace(/\/+$/g, "");
|
|
143
|
+
url.pathname = pathname || "/";
|
|
144
|
+
return url.toString().replace(/\/+$/g, "");
|
|
145
|
+
};
|
|
146
|
+
var joinPublicUrl = (siteUrl, routePath) => {
|
|
147
|
+
return routePath === "/" ? `${siteUrl}/` : `${siteUrl}${routePath}`;
|
|
148
|
+
};
|
|
149
|
+
var normalizePublicUrl = (value) => {
|
|
150
|
+
const url = new URL(value);
|
|
151
|
+
url.search = "";
|
|
152
|
+
url.hash = "";
|
|
153
|
+
url.pathname = normalizeRoutePath(url.pathname);
|
|
154
|
+
return url.toString();
|
|
155
|
+
};
|
|
156
|
+
var xmlEscape = (value) => {
|
|
157
|
+
return value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """);
|
|
158
|
+
};
|
|
159
|
+
var getLastMod = (filePath) => {
|
|
160
|
+
return fs.statSync(filePath).mtime.toISOString();
|
|
161
|
+
};
|
|
162
|
+
var collectFiles = (directoryPath) => {
|
|
163
|
+
if (!fs.existsSync(directoryPath)) {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
return fs.readdirSync(directoryPath, { withFileTypes: true }).flatMap((entry) => {
|
|
167
|
+
const entryPath = path.join(directoryPath, entry.name);
|
|
168
|
+
return entry.isDirectory() ? collectFiles(entryPath) : [entryPath];
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
var resolveFilesystemRoutePathFromPageFile = (pagesRootPath, filePath) => {
|
|
172
|
+
const relativeDirPath = path.relative(pagesRootPath, path.dirname(filePath)).split(path.sep).join(path.posix.sep);
|
|
173
|
+
const segments = relativeDirPath ? relativeDirPath.split("/").filter(Boolean) : [];
|
|
174
|
+
const resolvedSegments = [];
|
|
175
|
+
for (const segment of segments) {
|
|
176
|
+
if (segment === "index") {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (segment.startsWith("(") && segment.endsWith(")")) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (segment.startsWith("_") || segment.startsWith("@")) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
resolvedSegments.push(segment);
|
|
186
|
+
}
|
|
187
|
+
return resolvedSegments.length === 0 ? "/" : `/${resolvedSegments.join("/")}/`;
|
|
188
|
+
};
|
|
189
|
+
var collectFilesystemPageEntries = (options) => {
|
|
190
|
+
const pagesRootPath = path.join(options.rootDir, "pages");
|
|
191
|
+
const generatedPagesRootPath = path.join(pagesRootPath, GENERATED_DIRNAME);
|
|
192
|
+
const entries = [];
|
|
193
|
+
for (const filePath of collectFiles(pagesRootPath)) {
|
|
194
|
+
if (!path.basename(filePath).startsWith("+Page.")) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (filePath.startsWith(generatedPagesRootPath)) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const routePath = resolveFilesystemRoutePathFromPageFile(pagesRootPath, filePath);
|
|
201
|
+
if (!routePath) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
entries.push({
|
|
205
|
+
lastmod: getLastMod(filePath),
|
|
206
|
+
loc: normalizePublicUrl(joinPublicUrl(options.siteUrl, routePath))
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return entries;
|
|
210
|
+
};
|
|
211
|
+
var getDocsCanonicalEntries = (options) => {
|
|
212
|
+
const resolvedDocsConfig = resolveDocsConfig(options.docsConfig);
|
|
213
|
+
const contentRootPath = path.join(options.rootDir, resolvedDocsConfig.contentDir);
|
|
214
|
+
return resolvedDocsConfig.pages.map((page) => {
|
|
215
|
+
return {
|
|
216
|
+
lastmod: getLastMod(path.join(contentRootPath, page.source)),
|
|
217
|
+
loc: normalizePublicUrl(joinPublicUrl(options.siteUrl, page.href))
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
var getSitemapXml = (entries) => {
|
|
222
|
+
const urlEntries = entries.map((entry) => {
|
|
223
|
+
return [
|
|
224
|
+
" <url>",
|
|
225
|
+
` <loc>${xmlEscape(entry.loc)}</loc>`,
|
|
226
|
+
...entry.lastmod ? [` <lastmod>${xmlEscape(entry.lastmod)}</lastmod>`] : [],
|
|
227
|
+
" </url>"
|
|
228
|
+
].join("\n");
|
|
229
|
+
});
|
|
230
|
+
return [
|
|
231
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
232
|
+
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
|
|
233
|
+
...urlEntries,
|
|
234
|
+
"</urlset>",
|
|
235
|
+
""
|
|
236
|
+
].join("\n");
|
|
237
|
+
};
|
|
238
|
+
var getRobotsTxtContent = (siteUrl) => {
|
|
239
|
+
return ["User-agent: *", "Disallow: /cdn-cgi/", `Sitemap: ${siteUrl}/${SITEMAP_FILENAME}`].join("\n");
|
|
240
|
+
};
|
|
241
|
+
var getSitemapArtifacts = (options) => {
|
|
242
|
+
const siteUrl = options.docsConfig.siteUrl?.trim() ? normalizeSiteUrl(options.docsConfig.siteUrl) : null;
|
|
243
|
+
if (!siteUrl) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
const filesystemPageEntries = collectFilesystemPageEntries({
|
|
247
|
+
rootDir: options.rootDir,
|
|
248
|
+
siteUrl
|
|
249
|
+
});
|
|
250
|
+
const docsCanonicalEntries = getDocsCanonicalEntries({
|
|
251
|
+
docsConfig: options.docsConfig,
|
|
252
|
+
rootDir: options.rootDir,
|
|
253
|
+
siteUrl
|
|
254
|
+
});
|
|
255
|
+
const filesystemPageLocs = new Set(filesystemPageEntries.map((entry) => entry.loc));
|
|
256
|
+
const docsCanonicalLocs = docsCanonicalEntries.map((entry) => entry.loc);
|
|
257
|
+
const collidingLoc = docsCanonicalLocs.find((loc) => filesystemPageLocs.has(loc));
|
|
258
|
+
if (collidingLoc) {
|
|
259
|
+
throw new Error(
|
|
260
|
+
`Nivel sitemap collision: docs canonical URL ${JSON.stringify(collidingLoc)} conflicts with a consumer filesystem page.`
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
const sitemapEntriesByLoc = /* @__PURE__ */ new Map();
|
|
264
|
+
for (const entry of [...filesystemPageEntries, ...docsCanonicalEntries]) {
|
|
265
|
+
sitemapEntriesByLoc.set(entry.loc, entry);
|
|
266
|
+
}
|
|
267
|
+
const sitemapEntries = [...sitemapEntriesByLoc.values()].sort((left, right) => {
|
|
268
|
+
return left.loc.localeCompare(right.loc);
|
|
269
|
+
});
|
|
270
|
+
return {
|
|
271
|
+
robotsTxt: getRobotsTxtContent(siteUrl),
|
|
272
|
+
sitemapXml: getSitemapXml(sitemapEntries)
|
|
273
|
+
};
|
|
274
|
+
};
|
|
275
|
+
var writeStaticAsset = (filePath, contents) => {
|
|
276
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
277
|
+
fs.writeFileSync(filePath, contents);
|
|
278
|
+
};
|
|
279
|
+
var createNivelSitemapPlugin = (docsConfig) => {
|
|
280
|
+
let resolvedBase = "/";
|
|
281
|
+
let resolvedRootDir = process.cwd();
|
|
282
|
+
const matchesRequestPath = (requestUrl, pathname) => {
|
|
283
|
+
if (!requestUrl) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
const normalizedRequestUrl = requestUrl.split("?")[0] ?? requestUrl;
|
|
287
|
+
return normalizedRequestUrl === pathname || resolvedBase !== "/" && normalizedRequestUrl === `${resolvedBase}${pathname.slice(1)}`;
|
|
288
|
+
};
|
|
289
|
+
const getServerArtifacts = async (server) => {
|
|
290
|
+
const nextDocsConfig = await loadDocsConfig({
|
|
291
|
+
rootDir: server.config.root,
|
|
292
|
+
loadModule: (modulePath) => server.ssrLoadModule(modulePath)
|
|
293
|
+
});
|
|
294
|
+
return getSitemapArtifacts({
|
|
295
|
+
rootDir: server.config.root,
|
|
296
|
+
docsConfig: nextDocsConfig
|
|
297
|
+
});
|
|
298
|
+
};
|
|
299
|
+
return {
|
|
300
|
+
name: "nivel-sitemap-plugin",
|
|
301
|
+
configResolved(config) {
|
|
302
|
+
resolvedBase = config.base;
|
|
303
|
+
resolvedRootDir = config.root;
|
|
304
|
+
},
|
|
305
|
+
configureServer(server) {
|
|
306
|
+
server.middlewares.use(async (req, res, next) => {
|
|
307
|
+
const isSitemapRequest = matchesRequestPath(req.url, `/${SITEMAP_FILENAME}`);
|
|
308
|
+
const isRobotsRequest = matchesRequestPath(req.url, `/${ROBOTS_FILENAME}`);
|
|
309
|
+
if (!isSitemapRequest && !isRobotsRequest) {
|
|
310
|
+
next();
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
const artifacts = await getServerArtifacts(server);
|
|
314
|
+
if (!artifacts) {
|
|
315
|
+
res.statusCode = 404;
|
|
316
|
+
res.end();
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
res.setHeader("Cache-Control", "no-store");
|
|
320
|
+
if (isSitemapRequest) {
|
|
321
|
+
res.setHeader("Content-Type", "application/xml");
|
|
322
|
+
res.end(artifacts.sitemapXml);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
res.setHeader("Content-Type", "text/plain");
|
|
326
|
+
res.end(artifacts.robotsTxt);
|
|
327
|
+
});
|
|
328
|
+
},
|
|
329
|
+
closeBundle() {
|
|
330
|
+
if (this.environment.config.consumer !== "client") {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const artifacts = getSitemapArtifacts({
|
|
334
|
+
rootDir: resolvedRootDir,
|
|
335
|
+
docsConfig
|
|
336
|
+
});
|
|
337
|
+
if (!artifacts) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const outputDirectory = path.resolve(resolvedRootDir, this.environment.config.build.outDir);
|
|
341
|
+
writeStaticAsset(path.join(outputDirectory, SITEMAP_FILENAME), artifacts.sitemapXml);
|
|
342
|
+
writeStaticAsset(path.join(outputDirectory, ROBOTS_FILENAME), artifacts.robotsTxt);
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
};
|
|
346
|
+
var createNivelSitemapPlugins = (docsConfig) => {
|
|
347
|
+
if (!docsConfig.siteUrl?.trim()) {
|
|
348
|
+
return [];
|
|
349
|
+
}
|
|
350
|
+
return [createNivelSitemapPlugin(docsConfig)];
|
|
351
|
+
};
|
|
352
|
+
|
|
115
353
|
// src/vike/index.ts
|
|
116
354
|
process.env.VIKE_CRAWL ??= JSON.stringify({ git: false });
|
|
117
355
|
var codeBlockMdxPlugins = getCodeBlockMdxPlugins();
|
|
@@ -132,6 +370,12 @@ var viteConfig = {
|
|
|
132
370
|
noExternal: ["@unterberg/nivel"]
|
|
133
371
|
}
|
|
134
372
|
};
|
|
373
|
+
var getConsumerViteConfig = (docsConfig) => {
|
|
374
|
+
return {
|
|
375
|
+
...viteConfig,
|
|
376
|
+
plugins: [...viteConfig.plugins ?? [], ...createNivelSitemapPlugins(docsConfig)]
|
|
377
|
+
};
|
|
378
|
+
};
|
|
135
379
|
var getDefaultConsumerDataTheme = (docsConfig) => {
|
|
136
380
|
const defaultPreference = docsConfig.theme?.defaultPreference ?? "light";
|
|
137
381
|
const lightThemeName = docsConfig.theme?.light ?? "consumer-light";
|
|
@@ -162,7 +406,8 @@ var createNivelVikeConfig = (docsConfig) => {
|
|
|
162
406
|
htmlAttributes: {
|
|
163
407
|
"data-theme": getDefaultConsumerDataTheme(docsConfig)
|
|
164
408
|
},
|
|
165
|
-
prerender: true
|
|
409
|
+
prerender: true,
|
|
410
|
+
vite: getConsumerViteConfig(docsConfig)
|
|
166
411
|
};
|
|
167
412
|
};
|
|
168
413
|
export {
|
package/dist/vike.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vike/index.ts","../src/mdx/plugins/rehypeDocsHeadings.ts"],"sourcesContent":["export { nivelConfig as default }\n\nimport mdx from '@mdx-js/rollup'\nimport remarkGfm from 'remark-gfm'\nimport type { Config } from 'vike/types'\nimport type { PluginOption, UserConfig } from 'vite'\nimport type { DocsConfig } from '../docs/types.js'\nimport { getCodeBlockMdxPlugins } from '../mdx/code-blocks/index.js'\nimport { rehypeDocsHeadings } from '../mdx/plugins/rehypeDocsHeadings.js'\nimport { nivelPagesPlugin } from '../runtime/node/index.js'\n\nprocess.env.VIKE_CRAWL ??= JSON.stringify({ git: false })\n\nconst codeBlockMdxPlugins = getCodeBlockMdxPlugins()\n\nconst viteConfig: UserConfig = {\n plugins: [\n {\n ...mdx({\n providerImportSource: '@unterberg/nivel/mdx',\n ...codeBlockMdxPlugins,\n rehypePlugins: [...codeBlockMdxPlugins.rehypePlugins, rehypeDocsHeadings],\n remarkPlugins: [remarkGfm, ...codeBlockMdxPlugins.remarkPlugins],\n }),\n enforce: 'pre',\n } as PluginOption,\n nivelPagesPlugin(),\n ],\n ssr: {\n noExternal: ['@unterberg/nivel'],\n },\n}\n\nconst getDefaultConsumerDataTheme = (docsConfig: DocsConfig) => {\n const defaultPreference = docsConfig.theme?.defaultPreference ?? 'light'\n const lightThemeName = docsConfig.theme?.light ?? 'consumer-light'\n const darkThemeName = docsConfig.theme?.dark ?? 'consumer-dark'\n\n return defaultPreference === 'dark' ? darkThemeName : lightThemeName\n}\n\nconst vikeReactConfigImport = 'import:vike-react/config:default'\n\nconst nivelConfig = {\n meta: {\n docs: {\n env: {\n server: true,\n client: true,\n },\n global: true,\n },\n },\n prerender: true,\n trailingSlash: true,\n vite: viteConfig as Record<string, unknown>,\n} satisfies Config\n\nexport const createNivelVikeConfig = (docsConfig: DocsConfig) => {\n return {\n ...nivelConfig,\n title: docsConfig.siteTitle,\n description: docsConfig.siteDescription ?? `${docsConfig.siteTitle} documentation`,\n extends: [vikeReactConfigImport] as unknown as Config['extends'],\n htmlAttributes: {\n 'data-theme': getDefaultConsumerDataTheme(docsConfig),\n },\n prerender: true,\n } as Config\n}\n","// attention: no HMR is active for this file, changes require a full engine pre-build -> dev / preview\nimport { visit } from 'unist-util-visit'\nimport { createHeadingSlugger, normalizeHeadingTitle } from '../../docs/docHeadings.js'\nimport type { ElementContentNode, ElementNode, HtmlRootNode } from '../ast.js'\n\nconst headingTags = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])\n\nconst getNodeText = (node: ElementContentNode | HtmlRootNode): string => {\n if (node.type === 'text') {\n return typeof node.value === 'string' ? node.value : ''\n }\n\n if ('children' in node) {\n return node.children.map((child) => getNodeText(child)).join('')\n }\n\n return ''\n}\n\nconst getClassNames = (value: unknown): string[] => {\n if (Array.isArray(value)) {\n return value.flatMap((entry) => getClassNames(entry))\n }\n\n if (typeof value === 'string') {\n return value.split(/\\s+/).filter(Boolean)\n }\n\n return []\n}\n\nconst createLinkIconLine = (x1: number, y1: number, x2: number, y2: number): ElementNode => {\n return {\n type: 'element',\n tagName: 'line',\n properties: { x1, y1, x2, y2 },\n children: [],\n }\n}\n\nexport const rehypeDocsHeadings = () => {\n return (tree: HtmlRootNode) => {\n const slugify = createHeadingSlugger()\n\n visit(tree, 'element', (node: ElementNode) => {\n if (!headingTags.has(node?.tagName)) {\n return\n }\n\n const title = normalizeHeadingTitle(getNodeText(node))\n if (!title) {\n return\n }\n\n node.properties ??= {}\n\n if (typeof node.properties.id !== 'string' || node.properties.id === '') {\n node.properties.id = slugify(title)\n }\n\n const classNames = getClassNames(node.properties.className)\n if (!classNames.includes('scroll-mt-32')) {\n node.properties.className = [\n ...classNames,\n 'scroll-mt-32',\n 'xl:scroll-mt-24',\n 'flex gap-2 items-center',\n 'group',\n 'relative',\n 'w-fit',\n ].join(' ')\n }\n\n // create link element with has and anchor icon\n const linkElement: ElementNode = {\n type: 'element',\n tagName: 'a',\n properties: {\n href: `#${node.properties.id}`,\n 'data-copy-heading-link': '',\n 'aria-hidden': 'true',\n 'aria-label': `Copy link to heading: ${title}`,\n title: `Copy link to heading: ${title}`,\n className: ['docs-heading-link absolute inset-0 flex items-center justify-end text-primary-muted'],\n },\n children: [\n {\n type: 'element',\n tagName: 'svg',\n properties: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 16,\n height: 16,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n className: ['w-4 h-4 hidden group-hover:block translate-x-5'],\n },\n children: [\n createLinkIconLine(4, 9, 20, 9),\n createLinkIconLine(4, 15, 20, 15),\n createLinkIconLine(10, 3, 8, 21),\n createLinkIconLine(16, 3, 14, 21),\n ],\n },\n ],\n }\n node.children.push(linkElement)\n })\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/vike/index.ts","../src/mdx/plugins/rehypeDocsHeadings.ts","../src/vike/sitemap.ts"],"sourcesContent":["export { nivelConfig as default }\n\nimport mdx from '@mdx-js/rollup'\nimport remarkGfm from 'remark-gfm'\nimport type { Config } from 'vike/types'\nimport type { PluginOption, UserConfig } from 'vite'\nimport type { DocsConfig } from '../docs/types.js'\nimport { getCodeBlockMdxPlugins } from '../mdx/code-blocks/index.js'\nimport { rehypeDocsHeadings } from '../mdx/plugins/rehypeDocsHeadings.js'\nimport { nivelPagesPlugin } from '../runtime/node/index.js'\nimport { createNivelSitemapPlugins } from './sitemap.js'\n\nprocess.env.VIKE_CRAWL ??= JSON.stringify({ git: false })\n\nconst codeBlockMdxPlugins = getCodeBlockMdxPlugins()\n\nconst viteConfig: UserConfig = {\n plugins: [\n {\n ...mdx({\n providerImportSource: '@unterberg/nivel/mdx',\n ...codeBlockMdxPlugins,\n rehypePlugins: [...codeBlockMdxPlugins.rehypePlugins, rehypeDocsHeadings],\n remarkPlugins: [remarkGfm, ...codeBlockMdxPlugins.remarkPlugins],\n }),\n enforce: 'pre',\n } as PluginOption,\n nivelPagesPlugin(),\n ],\n ssr: {\n noExternal: ['@unterberg/nivel'],\n },\n}\n\nconst getConsumerViteConfig = (docsConfig: DocsConfig) => {\n return {\n ...viteConfig,\n plugins: [...(viteConfig.plugins ?? []), ...createNivelSitemapPlugins(docsConfig)],\n } satisfies UserConfig\n}\n\nconst getDefaultConsumerDataTheme = (docsConfig: DocsConfig) => {\n const defaultPreference = docsConfig.theme?.defaultPreference ?? 'light'\n const lightThemeName = docsConfig.theme?.light ?? 'consumer-light'\n const darkThemeName = docsConfig.theme?.dark ?? 'consumer-dark'\n\n return defaultPreference === 'dark' ? darkThemeName : lightThemeName\n}\n\nconst vikeReactConfigImport = 'import:vike-react/config:default'\n\nconst nivelConfig = {\n meta: {\n docs: {\n env: {\n server: true,\n client: true,\n },\n global: true,\n },\n },\n prerender: true,\n trailingSlash: true,\n vite: viteConfig as Record<string, unknown>,\n} satisfies Config\n\nexport const createNivelVikeConfig = (docsConfig: DocsConfig) => {\n return {\n ...nivelConfig,\n title: docsConfig.siteTitle,\n description: docsConfig.siteDescription ?? `${docsConfig.siteTitle} documentation`,\n extends: [vikeReactConfigImport] as unknown as Config['extends'],\n htmlAttributes: {\n 'data-theme': getDefaultConsumerDataTheme(docsConfig),\n },\n prerender: true,\n vite: getConsumerViteConfig(docsConfig) as Record<string, unknown>,\n } as Config\n}\n","// attention: no HMR is active for this file, changes require a full engine pre-build -> dev / preview\nimport { visit } from 'unist-util-visit'\nimport { createHeadingSlugger, normalizeHeadingTitle } from '../../docs/docHeadings.js'\nimport type { ElementContentNode, ElementNode, HtmlRootNode } from '../ast.js'\n\nconst headingTags = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])\n\nconst getNodeText = (node: ElementContentNode | HtmlRootNode): string => {\n if (node.type === 'text') {\n return typeof node.value === 'string' ? node.value : ''\n }\n\n if ('children' in node) {\n return node.children.map((child) => getNodeText(child)).join('')\n }\n\n return ''\n}\n\nconst getClassNames = (value: unknown): string[] => {\n if (Array.isArray(value)) {\n return value.flatMap((entry) => getClassNames(entry))\n }\n\n if (typeof value === 'string') {\n return value.split(/\\s+/).filter(Boolean)\n }\n\n return []\n}\n\nconst createLinkIconLine = (x1: number, y1: number, x2: number, y2: number): ElementNode => {\n return {\n type: 'element',\n tagName: 'line',\n properties: { x1, y1, x2, y2 },\n children: [],\n }\n}\n\nexport const rehypeDocsHeadings = () => {\n return (tree: HtmlRootNode) => {\n const slugify = createHeadingSlugger()\n\n visit(tree, 'element', (node: ElementNode) => {\n if (!headingTags.has(node?.tagName)) {\n return\n }\n\n const title = normalizeHeadingTitle(getNodeText(node))\n if (!title) {\n return\n }\n\n node.properties ??= {}\n\n if (typeof node.properties.id !== 'string' || node.properties.id === '') {\n node.properties.id = slugify(title)\n }\n\n const classNames = getClassNames(node.properties.className)\n if (!classNames.includes('scroll-mt-32')) {\n node.properties.className = [\n ...classNames,\n 'scroll-mt-32',\n 'xl:scroll-mt-24',\n 'flex gap-2 items-center',\n 'group',\n 'relative',\n 'w-fit',\n ].join(' ')\n }\n\n // create link element with has and anchor icon\n const linkElement: ElementNode = {\n type: 'element',\n tagName: 'a',\n properties: {\n href: `#${node.properties.id}`,\n 'data-copy-heading-link': '',\n 'aria-hidden': 'true',\n 'aria-label': `Copy link to heading: ${title}`,\n title: `Copy link to heading: ${title}`,\n className: ['docs-heading-link absolute inset-0 flex items-center justify-end text-primary-muted'],\n },\n children: [\n {\n type: 'element',\n tagName: 'svg',\n properties: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 16,\n height: 16,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n className: ['w-4 h-4 hidden group-hover:block translate-x-5'],\n },\n children: [\n createLinkIconLine(4, 9, 20, 9),\n createLinkIconLine(4, 15, 20, 15),\n createLinkIconLine(10, 3, 8, 21),\n createLinkIconLine(16, 3, 14, 21),\n ],\n },\n ],\n }\n node.children.push(linkElement)\n })\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { Plugin, ViteDevServer } from 'vite'\nimport { resolveDocsConfig } from '../docs/resolveDocsConfig.js'\nimport type { DocsConfig } from '../docs/types.js'\nimport { loadDocsConfig } from '../runtime/node/loadDocsConfig.js'\n\nconst GENERATED_DIRNAME = '(nivel-generated)'\nconst SITEMAP_FILENAME = 'sitemap.xml'\nconst ROBOTS_FILENAME = 'robots.txt'\n\ntype SitemapEntry = {\n lastmod?: string\n loc: string\n}\n\nconst normalizeRoutePath = (value: string) => {\n const normalized = value.trim().replace(/^\\/+|\\/+$/g, '')\n return normalized ? `/${normalized}/` : '/'\n}\n\nconst normalizeSiteUrl = (value: string) => {\n const normalized = value.trim()\n\n if (!normalized) {\n throw new Error('Docs siteUrl must be a non-empty absolute URL when sitemap support is enabled.')\n }\n\n const url = new URL(normalized)\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`Docs siteUrl must use http or https. Received ${JSON.stringify(value)}.`)\n }\n\n if (url.search || url.hash) {\n throw new Error(`Docs siteUrl cannot include query strings or hashes. Received ${JSON.stringify(value)}.`)\n }\n\n const pathname = url.pathname.replace(/\\/+$/g, '')\n url.pathname = pathname || '/'\n\n return url.toString().replace(/\\/+$/g, '')\n}\n\nconst joinPublicUrl = (siteUrl: string, routePath: string) => {\n return routePath === '/' ? `${siteUrl}/` : `${siteUrl}${routePath}`\n}\n\nconst normalizePublicUrl = (value: string) => {\n const url = new URL(value)\n url.search = ''\n url.hash = ''\n url.pathname = normalizeRoutePath(url.pathname)\n return url.toString()\n}\n\nconst xmlEscape = (value: string) => {\n return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('\"', '"')\n}\n\nconst getLastMod = (filePath: string) => {\n return fs.statSync(filePath).mtime.toISOString()\n}\n\nconst collectFiles = (directoryPath: string): string[] => {\n if (!fs.existsSync(directoryPath)) {\n return []\n }\n\n return fs.readdirSync(directoryPath, { withFileTypes: true }).flatMap((entry) => {\n const entryPath = path.join(directoryPath, entry.name)\n return entry.isDirectory() ? collectFiles(entryPath) : [entryPath]\n })\n}\n\nconst resolveFilesystemRoutePathFromPageFile = (pagesRootPath: string, filePath: string) => {\n const relativeDirPath = path.relative(pagesRootPath, path.dirname(filePath)).split(path.sep).join(path.posix.sep)\n const segments = relativeDirPath ? relativeDirPath.split('/').filter(Boolean) : []\n const resolvedSegments: string[] = []\n\n for (const segment of segments) {\n if (segment === 'index') {\n continue\n }\n\n if (segment.startsWith('(') && segment.endsWith(')')) {\n continue\n }\n\n if (segment.startsWith('_') || segment.startsWith('@')) {\n return null\n }\n\n resolvedSegments.push(segment)\n }\n\n return resolvedSegments.length === 0 ? '/' : `/${resolvedSegments.join('/')}/`\n}\n\nconst collectFilesystemPageEntries = (options: { rootDir: string; siteUrl: string }) => {\n const pagesRootPath = path.join(options.rootDir, 'pages')\n const generatedPagesRootPath = path.join(pagesRootPath, GENERATED_DIRNAME)\n const entries: SitemapEntry[] = []\n\n for (const filePath of collectFiles(pagesRootPath)) {\n if (!path.basename(filePath).startsWith('+Page.')) {\n continue\n }\n\n if (filePath.startsWith(generatedPagesRootPath)) {\n continue\n }\n\n const routePath = resolveFilesystemRoutePathFromPageFile(pagesRootPath, filePath)\n\n if (!routePath) {\n continue\n }\n\n entries.push({\n lastmod: getLastMod(filePath),\n loc: normalizePublicUrl(joinPublicUrl(options.siteUrl, routePath)),\n })\n }\n\n return entries\n}\n\nconst getDocsCanonicalEntries = (options: { docsConfig: DocsConfig; rootDir: string; siteUrl: string }) => {\n const resolvedDocsConfig = resolveDocsConfig(options.docsConfig)\n const contentRootPath = path.join(options.rootDir, resolvedDocsConfig.contentDir)\n\n return resolvedDocsConfig.pages.map((page) => {\n return {\n lastmod: getLastMod(path.join(contentRootPath, page.source)),\n loc: normalizePublicUrl(joinPublicUrl(options.siteUrl, page.href)),\n } satisfies SitemapEntry\n })\n}\n\nconst getSitemapXml = (entries: SitemapEntry[]) => {\n const urlEntries = entries.map((entry) => {\n return [\n ' <url>',\n ` <loc>${xmlEscape(entry.loc)}</loc>`,\n ...(entry.lastmod ? [` <lastmod>${xmlEscape(entry.lastmod)}</lastmod>`] : []),\n ' </url>',\n ].join('\\n')\n })\n\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n ...urlEntries,\n '</urlset>',\n '',\n ].join('\\n')\n}\n\nconst getRobotsTxtContent = (siteUrl: string) => {\n return ['User-agent: *', 'Disallow: /cdn-cgi/', `Sitemap: ${siteUrl}/${SITEMAP_FILENAME}`].join('\\n')\n}\n\nconst getSitemapArtifacts = (options: { rootDir: string; docsConfig: DocsConfig }) => {\n const siteUrl = options.docsConfig.siteUrl?.trim() ? normalizeSiteUrl(options.docsConfig.siteUrl) : null\n\n if (!siteUrl) {\n return null\n }\n\n const filesystemPageEntries = collectFilesystemPageEntries({\n rootDir: options.rootDir,\n siteUrl,\n })\n const docsCanonicalEntries = getDocsCanonicalEntries({\n docsConfig: options.docsConfig,\n rootDir: options.rootDir,\n siteUrl,\n })\n const filesystemPageLocs = new Set(filesystemPageEntries.map((entry) => entry.loc))\n const docsCanonicalLocs = docsCanonicalEntries.map((entry) => entry.loc)\n const collidingLoc = docsCanonicalLocs.find((loc) => filesystemPageLocs.has(loc))\n\n if (collidingLoc) {\n throw new Error(\n `Nivel sitemap collision: docs canonical URL ${JSON.stringify(collidingLoc)} conflicts with a consumer filesystem page.`,\n )\n }\n\n const sitemapEntriesByLoc = new Map<string, SitemapEntry>()\n\n for (const entry of [...filesystemPageEntries, ...docsCanonicalEntries]) {\n sitemapEntriesByLoc.set(entry.loc, entry)\n }\n\n const sitemapEntries = [...sitemapEntriesByLoc.values()].sort((left, right) => {\n return left.loc.localeCompare(right.loc)\n })\n\n return {\n robotsTxt: getRobotsTxtContent(siteUrl),\n sitemapXml: getSitemapXml(sitemapEntries),\n }\n}\n\nconst writeStaticAsset = (filePath: string, contents: string) => {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, contents)\n}\n\nconst createNivelSitemapPlugin = (docsConfig: DocsConfig): Plugin => {\n let resolvedBase = '/'\n let resolvedRootDir = process.cwd()\n\n const matchesRequestPath = (requestUrl: string | undefined, pathname: string) => {\n if (!requestUrl) {\n return false\n }\n\n const normalizedRequestUrl = requestUrl.split('?')[0] ?? requestUrl\n return (\n normalizedRequestUrl === pathname ||\n (resolvedBase !== '/' && normalizedRequestUrl === `${resolvedBase}${pathname.slice(1)}`)\n )\n }\n\n const getServerArtifacts = async (server: ViteDevServer) => {\n const nextDocsConfig = await loadDocsConfig({\n rootDir: server.config.root,\n loadModule: (modulePath) => server.ssrLoadModule(modulePath),\n })\n\n return getSitemapArtifacts({\n rootDir: server.config.root,\n docsConfig: nextDocsConfig,\n })\n }\n\n return {\n name: 'nivel-sitemap-plugin',\n configResolved(config) {\n resolvedBase = config.base\n resolvedRootDir = config.root\n },\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const isSitemapRequest = matchesRequestPath(req.url, `/${SITEMAP_FILENAME}`)\n const isRobotsRequest = matchesRequestPath(req.url, `/${ROBOTS_FILENAME}`)\n\n if (!isSitemapRequest && !isRobotsRequest) {\n next()\n return\n }\n\n const artifacts = await getServerArtifacts(server)\n\n if (!artifacts) {\n res.statusCode = 404\n res.end()\n return\n }\n\n res.setHeader('Cache-Control', 'no-store')\n\n if (isSitemapRequest) {\n res.setHeader('Content-Type', 'application/xml')\n res.end(artifacts.sitemapXml)\n return\n }\n\n res.setHeader('Content-Type', 'text/plain')\n res.end(artifacts.robotsTxt)\n })\n },\n closeBundle() {\n if (this.environment.config.consumer !== 'client') {\n return\n }\n\n const artifacts = getSitemapArtifacts({\n rootDir: resolvedRootDir,\n docsConfig,\n })\n\n if (!artifacts) {\n return\n }\n\n const outputDirectory = path.resolve(resolvedRootDir, this.environment.config.build.outDir)\n\n writeStaticAsset(path.join(outputDirectory, SITEMAP_FILENAME), artifacts.sitemapXml)\n writeStaticAsset(path.join(outputDirectory, ROBOTS_FILENAME), artifacts.robotsTxt)\n },\n }\n}\n\nexport const createNivelSitemapPlugins = (docsConfig: DocsConfig): Plugin[] => {\n if (!docsConfig.siteUrl?.trim()) {\n return []\n }\n\n return [createNivelSitemapPlugin(docsConfig)]\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unterberg/nivel",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"repository": {
|
|
@@ -78,13 +78,12 @@
|
|
|
78
78
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
79
79
|
},
|
|
80
80
|
"dependencies": {
|
|
81
|
-
"@tailwindcss/typography": "^0.5.19",
|
|
82
|
-
"@tailwindcss/vite": "^4.1.12",
|
|
83
81
|
"@brillout/shiki-transformers": "^4.0.2",
|
|
84
|
-
"@tanstack/react-query": "^5.99.0",
|
|
85
82
|
"@classmatejs/react": "^0.2.1",
|
|
86
83
|
"@mdx-js/rollup": "^3.1.1",
|
|
87
84
|
"@shikijs/transformers": "^4.0.2",
|
|
85
|
+
"@tailwindcss/typography": "^0.5.19",
|
|
86
|
+
"@tailwindcss/vite": "^4.1.12",
|
|
88
87
|
"daisyui": "^5.5.19",
|
|
89
88
|
"detype": "^2.0.7",
|
|
90
89
|
"estree-util-value-to-estree": "^3.5.0",
|
|
@@ -101,11 +100,11 @@
|
|
|
101
100
|
"zustand": "^5.0.12"
|
|
102
101
|
},
|
|
103
102
|
"peerDependencies": {
|
|
103
|
+
"react": ">=18",
|
|
104
|
+
"react-dom": ">=18",
|
|
104
105
|
"vike": ">=0.4.0",
|
|
105
|
-
"vite": ">=6",
|
|
106
106
|
"vike-react": ">=0.6",
|
|
107
|
-
"
|
|
108
|
-
"react-dom": ">=18"
|
|
107
|
+
"vite": ">=6"
|
|
109
108
|
},
|
|
110
109
|
"devDependencies": {
|
|
111
110
|
"@types/node": "^24.5.2",
|